pyPdf no puede extraer texto de algunas páginas en mi PDF

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

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

Si ejecuta lo siguiente, las primeras 81 páginas no devuelven texto, mientras que las 11 últimas se extraen correctamente. ¿Alguien puede ayudar?

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

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

Esto funciona bien para algunos archivos PDF, pero no para otros, dependiendo del 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 hace más sofisticada.

Como es el texto que desea, puede usar el comando de Linux pdftotext .

Para invocar eso usando Python, puedes hacer esto:

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

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

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

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

Esto no es realmente una respuesta, pero el problema con pyPdf es este: aún no es compatible con CMaps. PDF permite que las fonts usen CMaps para asignar identificaciones 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 a veces cuando no hay caracteres que no sean ASCII. Cuando pyPdf encuentra cadenas que no están en la encoding estándar de Unicode, 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. En realidad tuve este 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.

A veces me resulta útil convertirlo a ps (pruebe con pdf2ps y pdftops para las posibles diferencias) y luego vuelva a pdf ( ps2pdf ). A continuación, intente su guión original de nuevo.

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

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

Tuve un problema similar con algunos archivos PDF y para Windows, esto está funcionando excelente para mí:

1.- Descargar herramientas de xpdf para windows.

2.- Copie pdftotext.exe de xpdf-tools-win-4.00 \ bin32 a C: \ Windows \ System32 y también a C: \ Windows \ SysWOW64

3.- usar subproceso para ejecutar el comando 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)