2010-11-17 28 views
6

Estoy tratando de usar pyPdf para extraer e imprimir páginas de un PDF de varias páginas. El problema es que el texto no se extrae de algunas páginas. He puesto un ejemplo de archivo aquí:pyPdf no se puede extraer el texto de algunas páginas en mi PDF

http://www.4shared.com/document/kmJF67E4/forms.html

Si ejecuta el siguiente, las primeras 81 páginas devuelven ningún texto, mientras que el último 11 de extracto de forma adecuada. ¿Alguien puede ayudar?

from pyPdf import PdfFileReader 
input = PdfFileReader(file("forms.pdf", "rb")) 
for page in input1.pages: 
    print page.extractText() 

Respuesta

6

Tenga en cuenta que extractText() todavía tiene problemas para extraer el texto correctamente. A partir de la documentación para extractText():

Esto funciona bien para algunos archivos PDF, pero mal para otros, dependiendo de el generador utilizado. Esto será refinado en el futuro. No confíe en el orden del texto que sale de esta función , ya que cambiará si esta función se vuelve más sofisticada.

Dado que es el texto que desea, puede utilizar el comando de Linux pdftotext.

Invocar que el uso de Python, se puede hacer esto:

>>> import subprocess 
>>> subprocess.call(['pdftotext', 'forms.pdf', 'output']) 

El texto se extrae de forms.pdf y se guarda en output.

Esto funciona en el caso de su archivo PDF y extrae el texto que desea.

+0

Gracias por su ayuda. Probé con pftftotext y se lo pasé, ya que solo resuelve parcialmente el problema. Necesito dividir el pdf en archivos separados sobre la base de los UID que se encuentran en cada página. Sin embargo, las últimas 10 páginas, que pyPdf puede extraer, no tienen etiquetas de página textuales, por lo que el uso de pdftotext, aunque me da todo el texto, no me permite generar una lista de páginas para un UID determinado. . – DrJAKing

+0

Esto no hace un mal trabajo de salida del texto del PDF, pero no preserva el formato de la tabla. – s2t2

1

También puede probar la biblioteca pdfminer (también en python) y ver si es mejor para extraer el texto. Sin embargo, para dividir, tendrá que quedarse con pyPdf ya que pdfminer no lo admite.

+0

He intentado con pdfminer ... las últimas páginas no se extraen correctamente por alguna razón. – DrJAKing

0

me resulta a veces útil para convertirlo en ps (tratar con pdf2ps y pdftops de diferencias de potencial), y vuelva a pdf (ps2pdf). Luego prueba tu script original nuevamente.

+0

Tenía la esperanza, pero todo lo que parece hacer es agrandar el archivo original y ralentizar la extracción de texto nulo. – DrJAKing

+0

@DrJAKing: Lo siento, funcionó para mí "algunas veces", no siempre. – Danosaure

0

Estoy empezando a pensar que debería adoptar una solución desordenada de dos partes. hay dos secciones en el PDF, pp 1-82 que tienen etiquetas de página de texto (pdftotext puede extraer), y pp 83-end que no tienen etiquetas de página, pero pyPDF puede extraer y explícitamente conoce las páginas.

Creo que necesito combinar los dos. Clunky, pero no veo ninguna forma de evitarlo. Lamentablemente, tengo que hacer esto en una máquina con Windows.

1

Esto no es realmente una respuesta, pero el problema con pyPdf es este: todavía no es compatible con CMaps. PDF permite a las fuentes usar CMaps para mapear identificadores de caracteres (bytes en el PDF) a códigos de caracteres Unicode. Cuando tiene un PDF que contiene caracteres que no son ASCII, es probable que haya un CMap en uso, e incluso algunas veces cuando no hay caracteres que no sean ASCII. Cuando pyPdf encuentra cadenas que no están en la codificación Unicode estándar, solo ve un montón de código de bytes; no puede convertir esos bytes a Unicode, por lo que solo le da cadenas vacías. De hecho, tuve el mismo problema y estoy trabajando en el código fuente en este momento. Lleva mucho tiempo, pero espero enviar un parche al mantenedor en algún momento a mediados de 2011.

0

tuve un problema similar con algunos archivos PDF y para las ventanas, esto está funcionando excelente para mí:

1.- herramientas Descargar Xpdf para las ventanas

2.- copia pdftotext.exe de xpdf-herramientas- ganar-4,00 \ bin32 a C: \ Windows \ System32 y también a C: \ Windows \ SysWOW64

3.- uso subproceso para ejecutar comandos desde la consola:

import subprocess 

try: 
    extInfo = subprocess.check_output('pdftotext.exe '+filePath + ' -',shell=True,stderr=subprocess.STDOUT).strip() 
except Exception as e: 
    print (e) 
Cuestiones relacionadas