Estoy tratando de extraer el texto incluido en este archivo PDF usando Python
.
Estoy usando el módulo PyPDF2 y tengo el siguiente script:
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
Cuando ejecuto el código, obtengo el siguiente resultado que es diferente del incluido en el documento PDF:
!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%
¿Cómo puedo extraer el texto tal como está en el documento PDF?
pdf_file = open('sample.pdf', 'rb')
:?Respuestas:
Estaba buscando una solución simple para Python 3.xy Windows. Parece que no hay soporte de textract , lo cual es desafortunado, pero si está buscando una solución simple para Windows / Python 3, consulte el paquete tika , realmente sencillo para leer archivos PDF.
Tenga en cuenta que Tika está escrito en Java, por lo que necesitará un tiempo de ejecución de Java instalado
fuente
Usa textract.
Admite muchos tipos de archivos, incluidos archivos PDF
fuente
textract
es un contenedor paraPoppler:pdftotext
(entre otros).Mira este código:
El resultado es:
Usando el mismo código para leer un pdf de 201308FCR.pdf . La salida es normal.
Su documentación explica por qué:
fuente
Después de probar textract (que parecía tener demasiadas dependencias) y pypdf2 (que no podía extraer texto de los archivos PDF con los que probé) y tika (que era demasiado lento) terminé usando
pdftotext
xpdf (como ya se sugirió en otra respuesta) y acabo de llamar el binario de python directamente (es posible que deba adaptar la ruta a pdftotext):Hay pdftotext que hace básicamente lo mismo, pero esto supone pdftotext en / usr / local / bin, mientras que estoy usando esto en AWS lambda y quería usarlo desde el directorio actual.
Por cierto: para usar esto en lambda, necesita poner el binario y la dependencia
libstdc++.so
en su función lambda. Yo personalmente necesitaba compilar xpdf. Como las instrucciones para esto explotarían esta respuesta, las puse en mi blog personal .fuente
Es posible que desee utilizar xPDF probado con el tiempo y herramientas derivadas para extraer texto, ya que pyPDF2 parece tener varios problemas con la extracción de texto todavía.
La respuesta larga es que hay muchas variaciones sobre cómo se codifica un texto dentro de PDF y que puede requerir decodificar la cadena de PDF, luego puede necesitar mapear con CMAP, luego puede necesitar analizar la distancia entre palabras y letras, etc.
En caso de que el PDF esté dañado (es decir, que muestre el texto correcto pero al copiarlo da basura) y realmente necesite extraer texto, entonces puede considerar convertir el PDF a imagen (usando ImageMagik ) y luego usar Tesseract para obtener texto de la imagen usando OCR.
fuente
He probado muchos convertidores de PDF de Python y me gusta actualizar esta revisión. Tika es una de las mejores. Pero PyMuPDF es una buena noticia del usuario @ehsaneha.
Hice un código para compararlos en: https://github.com/erfelipe/PDFtextExtraction Espero poder ayudarte.
fuente
.encode('utf-8', errors='ignore')
El siguiente código es una solución a la pregunta en Python 3 . Antes de ejecutar el código, asegúrese de haber instalado la
PyPDF2
biblioteca en su entorno. Si no está instalado, abra el símbolo del sistema y ejecute el siguiente comando:Código de solución:
fuente
PyPDF2 en algunos casos ignora los espacios en blanco y hace que el texto resultante sea un desastre, pero uso PyMuPDF y estoy realmente satisfecho de que pueda usar este enlace para obtener más información
fuente
pip install pymupdf==1.16.16
. Usando esta versión específica porque hoy la versión más nueva (17) no está funcionando. Opté por pymupdf porque extrae campos de ajuste de texto en una nueva línea de caracteres\n
. Entonces extraigo el texto de pdf a una cadena con pymupdf y luego lo usomy_extracted_text.splitlines()
para dividir el texto en líneas, en una lista.pdftotext es el mejor y más simple! pdftotext también se reserva la estructura también.
Probé PyPDF2, PDFMiner y algunos otros, pero ninguno de ellos dio un resultado satisfactorio.
fuente
Collecting PDFMiner (from pdf2text)
por lo que no entiendo esta respuesta ahora.Puede usar PDFtoText https://github.com/jalan/pdftotext
PDF to text mantiene la sangría del formato de texto, no importa si tiene tablas.
fuente
El PDF de varias páginas se puede extraer como texto en una sola extensión en lugar de proporcionar un número de página individual como argumento utilizando el código siguiente
fuente
Aquí está el código más simple para extraer texto
código:
fuente
Encontré una solución aquí PDFLayoutTextStripper
Es bueno porque puede mantener el diseño del PDF original .
Está escrito en Java, pero he agregado una puerta de enlace para admitir Python.
Código de muestra:
Salida de muestra de PDFLayoutTextStripper :
Puedes ver más detalles aquí Stripper con Python
fuente
Tengo un mejor trabajo que el OCR y mantener la alineación de la página mientras extraigo el texto de un PDF. Debería ser de ayuda:
fuente
codec
argumento . Lo arreglé eliminándolo, es decirdevice = TextConverter(rsrcmgr, retstr, laparams=laparams)
Para extraer texto de PDF, use el siguiente código
fuente
Estoy agregando código para lograr esto: está funcionando bien para mí:
fuente
Puede descargar tika-app-xxx.jar (más reciente) desde aquí .
Luego, coloque este archivo .jar en la misma carpeta de su archivo de script de Python.
luego inserte el siguiente código en el script:
La ventaja de este método:
Menos dependencia. El archivo .jar único es más fácil de administrar que un paquete de Python.
Soporte multiformato. La posición
source_pdf
puede ser el directorio de cualquier tipo de documento. (.doc, .html, .odt, etc.)A hoy. tika-app.jar siempre se publica antes de la versión relevante del paquete tika python.
estable. Es mucho más estable y está bien mantenido (Desarrollado por Apache) que PyPDF.
desventaja:
Un jre-headless es necesario.
fuente
Si lo prueba en Anaconda en Windows, PyPDF2 podría no manejar algunos de los PDF con estructura no estándar o caracteres unicode. Recomiendo usar el siguiente código si necesita abrir y leer muchos archivos pdf: el texto de todos los archivos pdf en la carpeta con la ruta relativa
.//pdfs//
se almacenará en la listapdf_text_list
.fuente
PyPDF2 funciona, pero los resultados pueden variar. Estoy viendo resultados bastante inconsistentes de su extracción de resultados.
fuente