() 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.