Advertisement
  1. Code
  2. Python

Cómo trabajar con documentos PDF usando Python

Scroll to top
Read Time: 5 min

() translation by (you can also view the original English article)

Realmente admiro los archivos de formato de documento portátil (PDF). Recuerdo los días en que estos archivos resolvían cualquier problema de formato al intercambiar archivos debido a algunas diferencias en las versiones de Word o por otras razones.

Estamos hablando principalmente de Python, ¿no? Y estamos interesados en vincular eso a trabajar con documentos PDF. Bueno, puedes decir que es muy simple, especialmente si antes usaste Python con archivos de texto (txt). Pero aquí es un poco diferente. Los documentos PDF son archivos binarios y más complejos que los archivos de solo texto sin formato, especialmente porque contienen diferentes tipos de fuentes, colores, etc.

Eso no significa que sea difícil trabajar con documentos PDF usando Python, es bastante simple y si se usa un módulo externo se resuelve el problema.

PyPDF2

Como mencionamos anteriormente, el uso de un módulo externo sería la clave. El módulo que usaremos en este tutorial es PyPDF2. Como es un módulo externo, el primer paso lógico que tenemos que dar es instalar ese módulo. Para eso, usaremos pip, que es (basado en Wikipedia):

Un sistema de administración de paquetes que se usa para instalar y administrar paquetes de software escritos en Python. Muchos paquetes se pueden encontrar en el índice de paquetes de Python (PyPI).

Puedes seguir los pasos mencionados en la Guía del usuario de Python Packaging para instalar pip, pero si tienes Python 2.7.9 y superior, o Python 3.4 y superior, ¡ya tienes pip!

PyPDF2 ya se puede instalar simplemente escribiendo el siguiente comando (en la Terminal de Mac OS X):

pip instalar pypdf2

¡Excelente! Ahora tienes PyPDF2 instalado y estás listo para empezar a jugar con documentos PDF.

Lectura de un documento PDF

El archivo de ejemplo con el que trabajaremos en este tutorial es sample.pdf. Continúa y descarga el archivo para seguir el tutorial, o simplemente puedes usar cualquier archivo PDF que quieras.

Continuemos y leamos el documento PDF. Puesto que vamos a utilizar PyPDF2, necesitamos importar el módulo, de la siguiente manera:

importar pypdf2

Después de importar el módulo, usaremos la clase PdfFileReader. Entonces, el script para leer el documento PDF tiene el siguiente aspecto:

1
import PyPDF2
2
pdf_file = open('sample.pdf')
3
read_pdf = PyPDF2.PdfFileReader(pdf_file)

Más operaciones en documentos PDF

Después de leer el documento PDF, podemos llevar a cabo diferentes operaciones en el documento, como veremos en esta sección.

Número de páginas

Vamos a comprobar el número de páginas en sample.pdf. Para ello, podemos utilizar el método getNumPages():

1
number_of_pages = read_pdf.getNumPages()
2
print number_of_pages

En este caso, el valor devuelto será 1.

Número de página

Ahora verifiquemos el número de alguna página en el documento PDF. Podemos usar el método getPageNumber(page).Observa que tenemos que pasar un objeto de tipo page al método. Para recuperar un page, usaremos el método getPage(number), donde number representa el número de página en el documento PDF. El argumento number comienza con el valor 0.

Bueno, sé que cuando usas getPage(number) ya conoces el número de página, pero esto es sólo para ilustrar cómo usar esos métodos juntos. Esto se puede demostrar en el siguiente script:

1
page = read_pdf.getPage(0)
2
page_number = read_pdf.getPageNumber(page)
3
print page_number

Adelante, prueba el script. ¿Qué resultado obtuviste?

Sabemos que en sample.pdf (el archivo con el que estamos experimentando), solo tenemos una página (número 0). ¿Qué pasa si pasamos el número 1 como el número de página a getPage(number)? En este caso, obtendrás el siguiente error:

1
Traceback (most recent call last):
2
  File "test.py", line 6, in <module>
3
    page = read_pdf.getPage(1)
4
  File "/usr/local/lib/python2.7/site-packages/PyPDF2/pdf.py", line 1158, in getPage
5
    return self.flattenedPages[pageNumber]
6
IndexError: list index out of range

Esto se debe a que la página no está disponible y estamos usando un número de página inexistente (no existe).

Modo de página

La página PDF viene con diferentes modos, que son los siguientes:

/UseNone No mostrar contornos ni paneles de miniaturas
/UseOutlines Mostrar panel de contornos (también conocido como marcadores)
/UseThumbs Mostrar panel de miniaturas de página
/FullScreen Vista de pantalla completa
/UseOC Mostrar panel Grupo de contenido opcional (OCG)
/UseAttachments Mostrar panel de archivos adjuntos

Para comprobar nuestro modo de página, podemos utilizar el siguiente script:

1
page = read_pdf.getPage(0)
2
page_mode = read_pdf.getPageMode()
3
print page_mode

En el caso de nuestro documento PDF (sample.pdf), el valor devuelto es none, lo que significa que el modo de página no está especificado. Si quieres especificar un modo de página, puedes utilizar el método setPageMode(mode), donde mode es uno de los modos enumerados en la tabla anterior.

Extraer texto

Hemos estado vagando por el archivo hasta ahora, así que veamos lo que hay dentro. El método extractText() será nuestro amigo en esta tarea.

Permíteme mostrarte el script completo para hacer eso, a diferencia de lo que estaba haciendo anteriormente al mostrarte sólo el script necesario para realizar una operación. El script para extraer un texto del documento PDF es el siguiente:

1
import PyPDF2
2
pdf_file = open('sample.pdf')
3
read_pdf = PyPDF2.PdfFileReader(pdf_file)
4
number_of_pages = read_pdf.getNumPages()
5
page = read_pdf.getPage(0)
6
page_content = page.extractText()
7
print page_content

Me sorprendió cuando obtuve la siguiente salida en lugar de la de sample.pdf:

1
!"#$%#$%&%$&'()*%+,-%./01'*23%4

2
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
3
%

Lo más probable es que esto se deba a un problema de fuente, por lo que los códigos de caracteres se asignan a otros valores. Por lo tanto, a veces es un problema con el documento PDF en sí, ya que es posible que el documento PDF no contenga los datos necesarios para restaurar el contenido.

Entonces probé con otro archivo, que es un documento mío: paper.pdf. Continúa y reemplaza sample.pdf en el código por paper.pdf. El resultado en este caso fue:

1
Medical Imaging 2012: Image Perception, Observer Performance, and Technology Assessment, edited by Craig K. Abbey, Claudia R. Mello-Thoms, Proc. of SPIE Vol. 8318, 83181I © 2012 SPIE · CCC code: 1605-7422/12/$18 · doi: 10.1117/12.912389Proc. of SPIE Vol. 8318  83181I-1Downloaded from SPIE Digital Library on 13 Aug 2012 to 134.130.12.208. Terms of Use:  http://spiedl.org/terms

Pero, ¿dónde está el resto del texto en la página? Bueno, en realidad el método extractText() parece no ser perfecto y es necesario realizar algunas mejoras. Pero, el objetivo aquí es mostrarte cómo trabajar con archivos PDF usando Python, y parece que es necesario realizar algunas mejoras en el dominio.

Conclusión

Como podemos ver, Python facilita el trabajo con documentos PDF. En este tutorial acabas de explorar un poco sobre este tema, y puedes encontrar más detalles sobre las diferentes operaciones que puedes realizar en documentos PDF en la página de documentación de PyPDF2.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.