¿Cómo extraer texto de un PDF? [cerrado]

152

¿Alguien puede recomendar una biblioteca / API para extraer el texto y las imágenes de un PDF? Necesitamos poder llegar al texto que se encuentra en regiones previamente conocidas del documento, por lo que la API deberá proporcionarnos información posicional de cada elemento en la página.

Nos gustaría que esos datos se envíen en formato xmlo en jsonformato. Actualmente estamos viendo PdfTextStream que parece bastante bueno, pero me gustaría escuchar las experiencias y sugerencias de otras personas.

¿Existen alternativas (comerciales o gratuitas) para extraer el texto de un pdf mediante programación?

Budda007
fuente
1
Para los que necesitan algo muy simple (sin posición info), esta expresión regular Perl puede ser suficiente: /^\s*\[?\((.*?)\)\]?\s*T[Jj]/mg. Simplemente busca el operador Tj / TJ, que denota todo el texto normal en un PDF.
Alex R
1
uso TomRoush PDFBox biblioteca de esto funciona bien en Android
FaisalAhmed

Respuestas:

113

Me dieron un archivo pdf de 400 páginas con una tabla de datos que tuve que importar, por suerte no hay imágenes. Ghostscript funcionó para mí:

gswin64c -sDEVICE=txtwrite -o output.txt input.pdf

El archivo de salida se dividió en páginas con encabezados, etc., pero luego fue fácil escribir una aplicación para eliminar líneas en blanco, etc., y absorber los 30,000 registros. -dSIMPLEy -dCOMPLEXno hizo ninguna diferencia en este caso.

usuario2176753
fuente
37
En linux y cygwin, el comando es en gslugar de gswin64c. Funciona perfectamente. No patentado basura pagada. Simplemente funciona
Jannes
44
Sí, funciona muy bien! Ahora puedo usar "grep" con impunidad en mis archivos pdf. Como puedo aprender mejor de lo que puedo leer, ¡es una victoria! (:-) Votación a favor.
David Elson
1
El único problema que tuve con esto fue usarlo en archivos PDF con fuentes incrustadas 'antiguas'. Funciona perfectamente para archivos PDF generados localmente, pero más difícil con fuentes oscuras. De lo contrario, un excelente scriptlet.
Jon M
¿qué -sDEVICE=txtwritehacer? No entiendo mucho después de leer Cómo usar Ghostscript | Selección de un dispositivo de salida
Ooker
Para la salida estándar en lugar de guardar como un archivo de texto, use gswin64c -sDEVICE=txtwrite -o- input.pdf. Fuente (ligeramente modificada por mí): gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526ac
LuH
33

Desde hoy lo sé: lo mejor para la extracción de texto de archivos PDF es TET, el kit de herramientas de extracción de texto . TET es parte de la familia de productos PDFlib.com.

PDFlib.com es la compañía de Thomas Merz. En caso de que no reconozca su nombre: Thomas Merz es el autor de la "Biblia PostScript y PDF".

La primera encarnación de TET es una biblioteca . Ese probablemente puede hacer todo lo que Budda006 quería, incluida la información posicional sobre cada elemento de la página. Ah, y también puede extraer imágenes. Recombina imágenes que se fragmentan en pedazos.

pdflib.com también ofrece otra encarnación de esta tecnología, el complemento TET para Acrobat . Y la tercera encarnación es el PDFlib TET iFilter . Esta es una herramienta independiente para escritorios de usuario. Ambos son de uso gratuito (como en la cerveza) para fines privados y no comerciales.

Y es realmente poderoso. Mucho mejor que la extracción de texto de Adobe. Extrajo texto para mí donde otras herramientas (incluidas las de Adobe) solo escupen basura.

Acabo de probar la herramienta independiente de escritorio, y lo que dicen en su página web es cierto. Tiene una muy buena línea de comando. Algunos de mis archivos de prueba PDF "problemáticos" que la herramienta manejó a mi entera satisfacción.

A partir de ahora, esto será mi recomendación para todos los requisitos de extracción de texto PDF sofisticados y desafiantes.

TET es simplemente increíble. Detecta tablas. Dentro de las tablas, identifica celdas que abarcan varias columnas. Identifica las filas de la tabla y el contenido de cada celda de la tabla por separado. Se ocupa muy bien de las guiones: elimina los guiones y restaura palabras completas. Admite idiomas no ASCII (incluidos CJK, árabe y hebreo). Al encontrar ligaduras, restaura los caracteres originales ...

Darle una oportunidad.

Kurt Pfeifle
fuente
32
No hay una versión de prueba, y $ 440 es un poco demasiado para "Pruébalo".
Rok Strniša
¿Este servicio está disponible a través de una API?
Bart
1
Lo probé, no reconoce columnas. Escaneé una portada de un tabloide inglés. El texto se dividió en 3 columnas en el papel, pero este complemento mezcló las oraciones por completo haciendo que pareciera improvisado. Ghostscript que es gratuito tuvo exactamente la misma salida.
NoWhereToBeSeen
1
@RedHotScalability: También cierto, el TET hace reconocer columnas si se utiliza con los parámetros correctos. Pero lo dejo como ejercicio al ambicioso programador de JS para leer la documentación y descubrir cómo ...
Kurt Pfeifle
29

Una herramienta de línea de comandos eficiente, de código abierto, gratuita, disponible en Linux y Windows: simplemente llamada pdftotext. Esta herramienta es parte de la biblioteca xpdf.

http://en.wikipedia.org/wiki/Pdftotext

131
fuente
44
En una nota al margen: use el -layoutinterruptor para preservar las tablas, funciona bastante bien.
sebastian
12

Aquí está mi sugerencia. Si desea extraer texto de PDF, puede importar el archivo pdf a Google Docs y luego exportarlo a un formato más amigable como .html, .odf, .rtf, .txt, etc. Todo esto utilizando la API de Drive . Es gratis * y robusto. Echa un vistazo a:

https://developers.google.com/drive/v2/reference/files/insert https://developers.google.com/drive/v2/reference/files/get

Debido a que es una API de descanso, es compatible con TODOS los lenguajes de programación. Los enlaces que publiqué anteriormente tienen ejemplos de trabajo para muchos idiomas, incluidos: Java, .NET, Python, PHP, Ruby y otros.

Espero que ayude.

oabarca
fuente
2
He usado esa opción y no la recomendaría. La extracción de texto en pdf de Google no es tan buena como muchas alternativas (especialmente para no inglés) y también es muy, muy lenta.
Björn Lindqvist
10

PdfTextStream (que dijiste que estabas viendo) ahora es gratuito para aplicaciones de un solo subproceso. En mi opinión, su calidad es mucho mejor que otras bibliotecas (especialmente para fuentes como fuentes incrustadas funky, etc.).

Alternativamente, debería echar un vistazo a Apache PDFBox , de código abierto.

Renaud
fuente
PdfTextStream no es compatible con Android. ¿Hay algunas buenas bibliotecas como esta disponibles para Android?
FaisalAhmed
@FaisalAhmed ¿qué pasa con PDFBox?
Renaud
Sí, PdfBox tampoco es compatible con Android ... tanto PdfTextStream como PdfBox usan alguna parte awt que no es compatible con Android
FaisalAhmed
Estoy usando esta biblioteca que funciona bien en Android github.com/TomRoush/PdfBox-Android
FaisalAhmed
6

Uno de los comentarios aquí usaba gs en Windows. También tuve cierto éxito con eso en Linux / OSX, con la siguiente sintaxis:

gs \
 -q \
 -dNODISPLAY \
 -dSAFER \
 -dDELAYBIND \
 -dWRITESYSTEMDICT \
 -dSIMPLE \
 -f ps2ascii.ps \
 "${input}" \
 -dQUIET \
 -c quit

Utilicé en dSIMPLElugar de dCOMPLEXporque este último genera 1 carácter por línea.

kvz
fuente
5

Como la pregunta es específicamente sobre herramientas alternativas para obtener datos de PDF como XML , puede interesarle echar un vistazo a la herramienta comercial "ByteScout PDF Extractor SDK" que es capaz de hacer exactamente esto: extraer texto de PDF como XML junto con los datos de posicionamiento (x, y) y la información de la fuente:

Texto en el PDF de origen:

Products | Units | Price 

XML de salida:

 <row>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="212" y="126" width="47" height="11">Products</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="428" y="126" width="27" height="11">Units</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="503" y="126" width="26" height="11">Price</text> 
  </column>
</row>

PD: además, divide el texto en una estructura basada en tablas.

Divulgación: trabajo para ByteScout

Eugene
fuente
3

Lo mejor que puedo pensar actualmente (dentro de la lista de herramientas "simples") es Ghostscript (la versión actual es v.8.71) y el programa de utilidad PostScript ps2ascii.ps. Ghostscript lo envía a su libsubdirectorio. Prueba esto (en Windows):

gswin32c.exe ^
   -q ^
   -sFONTPATH=c:/windows/fonts ^
   -dNODISPLAY ^
   -dSAFER ^
   -dDELAYBIND ^
   -dWRITESYSTEMDICT ^
   -dCOMPLEX ^
   -f ps2ascii.ps ^
   -dFirstPage=3 ^
   -dLastPage=7 ^
   input.pdf ^
   -dQUIET ^
   -c quit

Este comando procesa las páginas 3-7 de input.pdf. Lea los comentarios en el ps2ascii.psarchivo para ver qué significan los números "extraños" y la información adicional ( indican cadenas, posiciones, anchos, colores, imágenes, rectángulos, fuentes y saltos de página ... ). Para obtener una salida de texto "simple", reemplace la -dCOMPLEXparte por -dSIMPLE.

Kurt Pfeifle
fuente
2
Como es de suponer, esto solo genera una prueba ASCII. Si bien es gratuito, no es una gran opción para el software que planea con otros idiomas además del inglés.
userx
3
@userx: Como se podría adivinar, este es un software gratuito: por lo tanto, el código fuente está disponible. Posible extender para el apoyo de no ASCII ...
Kurt Pfeifle
@userx: hoy descubrí 'TET', el kit de herramientas de extracción de texto de pdflib.com. Ver mi otra respuesta.
Kurt Pfeifle
ps2ascii de Ghostscript 9.07 funcionó maravillosamente en mi sistema OpenBSD. Acabo de convertir un PDF de 526 páginas a texto sin formato. Ahora puedo fácilmente grep y extraer texto para notas. Usé el comando simple ps2ascii book.pdf notes.txt. Si su documento es predominantemente ASCII, tiene suerte.
Clint Pachl
3

Sé que este tema es bastante antiguo, pero esta necesidad aún está viva. Leí muchos documentos, foros y guiones y construí uno nuevo y avanzado que admite pdf comprimido y sin comprimir:

https://gist.github.com/smalot/6183152

En algunos casos, la línea de comando está prohibida por razones de seguridad. Por lo tanto, una clase nativa de PHP puede satisfacer muchas necesidades.

Espero que ayude a todos

Sebastien Malot
fuente
1

QuickPDF parece ser una biblioteca razonable que debe hacer lo que desea por un precio razonable.

http://www.quickpdflibrary.com/ - Tienen una prueba de 30 días.

Andrew Cash
fuente
0

En mis sistemas Macintosh, encuentro que "Adobe Reader" hace un trabajo razonablemente bueno. Creé un alias en mi escritorio que apunta a "Adobe Reader.app", y todo lo que hago es soltar un archivo pdf en el alias, que lo convierte en el documento activo en Adobe Reader, y luego desde el menú Archivo, Elijo "Guardar como texto ...", le doy un nombre y dónde guardarlo, hago clic en "Guardar" y listo.

Dick Guertin
fuente
55
El OP buscó una solución para extraer texto de un pdf programáticamente . Su respuesta propone una rutina manual en su lugar.
mkl