Cómo trabajar con documentos PDF utilizando Python

Personalmente, admiro los ficheros PDF. Aún recuerdo los días en que este tipo de archivos resolvían problemas de formato, debido a que la gente utilizaba distintas versiones de Word y el intercambio de ficheros se hacía muy, pero que muy difícil, y por otras razones.

En este artículo vamos a hablar principalmente de Python, ¿vale? Sobre todo hablaremos sobre cómo trabajar con documentos PDF en dicho lenguaje de programación. En primer lugar, se puede decir que es muy sencillo, especialmente si has usado Python con archivos de texto (TXT) antes. Sin embargo, no es del todo lo mismo. Los documentos PDF son archivos binarios y más complejos que los sencillos archivos de texto sin formato, ya que contienen distintos tipos de letra, colores, etc.

Eso no quiere decir que sea difícil trabajar con documentos PDF utilizando Python, es bastante simple, y el uso de un módulo externo facilita el problema.

PyPDF2

Como hemos dicho antes, utilizar un módulo externo es la clave. El módulo que vamos a utilizar en este tutorial es PyPDF2. Como se trata de un módulo externo, el primer paso es el habitual, tenemos que instalar el módulo. Para ello, vamos a utilizar PIP, que es (basándonos en la Wikipedia):

Es un sistema de gestión de paquetes utilizado para instalar y administrar paquetes de software escritos en Python. Muchos paquetes pueden ser encontrados en el Índice de Paquete de la Python (PyPI)

Puedes seguir los pasos mencionados en la Python Packaging User Guide para la instalación de pip, pero si tienes Python 2.7.9 o superior, o Python 3.4 o superior, ya tienes pip

Ahora puedes instalar PyPDF2 simplemente escribiendo el siguiente comando en el terminal:

pip install pypdf2

¡Genial! Ya has instalado PyPDF2, y estás listo para empezar a trabajar con documentos PDF.

Leer un documento PDF

El archivo de ejemplo con el que trabajaremos en este tutorial es sample.pdf. Descárgate el archivo para seguir el tutorial, o simplemente usa cualquier archivo PDF que te guste.

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

import pypdf2

Después de importar el módulo, vamos a utilizar la clase PdfFileReader. Por lo tanto, el script para leer el documento PDF sería tal que así:

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

Más operaciones con documentos PDF

Después de leer el documento PDF, ahora podemos realizar diferentes operaciones con el documento, como veremos más adelante en esta sección.

Número de páginas

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

number_of_pages = read_pdf.getNumPages()
print number_of_pages

En este caso, el valor retornado es 1.

Número de página

Ahora vamos a comprobar el número de alguna página en el documento PDF. Podemos utilizar el método getPageNumber(page). Ten en cuenta que le tenemos que pasar un objeto tipo page al método. Para recuperar una página, utilizaremos 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 se utiliza getPage(number) ya se conoce el número de la página, pero esto es simplemente para ilustrar cómo utilizar estos métodos juntos. Lo puedes ver en el siguiente snippet de Python:

page = read_pdf.getPage(0)
page_number = read_pdf.getPageNumber(page)
print page_number

Muy bien, prueba el script. ¿Qué obtienes?

Sabemos que en sample.pdf (archivo con el que estamos experimentando), sólo tiene una página (número 0). ¿Y si le pasamos el número 1 como número de página para getPage(number)? En ese obtendrás el siguiente error:

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

Esto se debe a que la página no está disponible, y estamos utilizando un número de página fuera de rango (no existe).

Modo de página

Las páginas PDF vienen con diferentes modos, que son los siguientes:

  • /UseNone: No muestra ni bookmarks, ni miniaturas de paneles
  • /UseOutlines: Muestra el panel de bookmarks
  • /UseThumbs: Muestra miniaturas de paneles
  • /Fullscreen: Vista fullscreen
  • /UseOC: Muestra el panel OCG
  • /UseAttachments: Muestra el panel de adjuntos

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

page = read_pdf.getPage(0)
page_mode = read_pdf.getPageMode()
print page_mode

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

Extraer texto

Hemos pasando por encima del archivo en reiteradas ocasiones, así que vamos a ver lo que hay dentro. El método extractText() será nuestro amigo en esta tarea.

Te voy a enseñar el script completo para hacer que, a diferencia de lo que hacía anteriormente en que sólo se muestra el script necesario para realizar la operación. El script para extraer un texto del documento PDF es el siguiente:

import PyPDF2
pdf_file = open('sample.pdf')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print page_content

Me he sorprendido cuando he obtenido el siguiente resultado en vez de el de sample.pdf:

!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%

Lo más probable es que esto sea debido a un problema de fuente, de tal manera que los códigos de caracteres se asignen a otros valores. A veces puede ser también un problema con el documento PDF en sí, debido a que el documento PDF no contenga los datos necesarios para restaurar el contenido.

Por tanto, lo he intentado con otro archivo: Paper.pdf. La salida en este caso fue:

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

Fuente: A. Ahmed

 

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP