2010-09-06 128 views
114

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

Queremos que los datos se muestren en formato xml o json. 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 programáticamente?

+0

Pregunta relacionada: [Extraiga imágenes y palabras con coordenadas y tamaños de PDF] (http://stackoverflow.com/questions/8241724/extract-images-andwords-with-coordinates-and-sizes-from-pdf) – yms

+0

Para aquellos que necesitan algo realmente simple (sin información de posición), esta expresión regular de Perl puede ser suficiente: '/^\s*\[?\(((?**)\)\]?\s*T[Jj]/mg '. Simplemente busca el operador Tj/TJ, que denota todo el texto normal en un PDF. –

+0

uso [TomRoush PDFBox] (https://github.com/TomRoush/PdfBox-Android) biblioteca de esto funciona bien en android – FaisalAhmed

Respuesta

0

Lo mejor que puedo pensar actualmente (dentro de la lista de herramientas "simples") es Ghostscript (versión actual es v.8.71) y el programa de utilidad PostScript ps2ascii.ps. Ghostscript lo envía en su subdirectorio lib. 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 procesos páginas 3-7 de input.pdf. Lea los comentarios en el archivo ps2ascii.ps para ver qué significan los números "extraños" y las informaciones adicionales (indican cadenas, posiciones, anchuras, colores, imágenes, rectángulos, fuentes y saltos de página ...). Para obtener una salida de texto "simple", reemplace la parte -dCOMPLEX por -dSIMPLE.

+2

Como es de suponer, esto solo genera una prueba ASCII. Si bien es gratis, no es una gran opción para el software que planea con idiomas distintos del inglés. – userx

+1

@userx: Como se podría adivinar, este es el software gratuito: por lo tanto, el código fuente está disponible. Posible extender para soporte de archivos que no sean ASCII ... –

+0

@userx: hoy descubrí 'TET', el Text Extraction Toolkit de pdflib.com. Ver mi otra respuesta. –

0

QuickPDF parece ser una biblioteca razonable que debe hacer lo que quiera a un precio razonable.

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

+3

PDF rápido es solo Windows – boatcoder

26

Desde hoy sé que: la lo mejor para la extracción de texto de archivos PDF es TET, the text extraction toolkit. TET es parte de la familia de productos PDFlib.com.

PDFlib.com es la empresa 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 a library. Ese probablemente puede hacer todo lo que Budda006 quería, incluida la información posicional sobre cada elemento en la página. Ah, y también puede extraer imágenes. Reúne imágenes fragmentadas en pedazos.

pdflib.com también ofrece otra encarnación de esta tecnología, la TET plugin for Acrobat. Y la tercera encarnación es PDFlib TET iFilter. Esta es una herramienta independiente para escritorios de usuarios. Ambos son gratuitos (como en la cerveza) para uso privado, sin fines comerciales.

Y es realmente potente. Mucho mejor que la extracción de texto de Adobe. Extrajo texto para mí donde otras herramientas (incluida Adobe) escupían basura solo.

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

Esto será de ahora en adelante mi recomendación para todos los sofisticados y desafiantes requisitos de extracción de texto PDF.

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 trata muy bien con guiones: elimina guiones y restaura palabras completas. Admite lenguajes que no son ASCII (incluidos CJK, árabe y hebreo). Al encontrar ligaduras, restaura los caracteres originales ...

Pruébalo.

+19

No hay versión de prueba, y $ 440 es demasiado para "Pruébelo". –

+16

@Darthenius: Debe haberse perdido esta frase: "[PDFlib TET se puede evaluar sin licencia, pero solo procesará documentos PDF con hasta 10 páginas y 1 MB de tamaño a menos que se aplique una clave de licencia válida] (http: // www.pdflib.com/download/tet/) ". –

+2

¡Gracias! Funciona muy bien para mi pequeño proyecto hasta el momento. Y si es tan profundo y sólido como lo sugieren la documentación y las pruebas iniciales, entonces valdrá la pena el USD 440 frente a las horas que pasaría buscando errores en otras herramientas. (Además, como desarrollador de software, ¡es bueno apoyar a otros desarrolladores de software!) – mm2001

6

PdfTextStream (que dijiste que has estado viendo) ahora es gratis para aplicaciones de rosca simple. En mi opinión, su calidad es mucho mejor que otras bibliotecas (especialmente para cosas como funky embedded fonts, etc.).

Como alternativa, debe echar un vistazo a Apache PDFBox, código abierto.

+0

PdfTextStream no es compatible con Android. ¿Hay algunas buenas bibliotecas como esta disponibles para Android? – FaisalAhmed

+0

@FaisalAhmed ¿qué hay de PDFBox? – Renaud

+0

Sí, PdfBox tampoco es compatible con Android .... PdfTextStream y PdfBox usan alguna parte de awt que no es compatible con Android – FaisalAhmed

0

Sé que este tema es bastante antiguo, pero esta necesidad aún está viva. He leído muchos documentos, foros y guión y construir una nueva avanzada que soporta PDF comprimido y sin comprimir:

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

En algunos casos, la línea de comandos está prohibido por razones de seguridad. Así que una clase PHP nativa puede satisfacer muchas necesidades.

Espero que ayude a todos

7

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 usando Drive API. Es gratis * y robusto. Echar un vistazo a:

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

Debido a que es una API de reposo, 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.

+1

He usado esa opción y no lo recomendaría. La extracción de texto en PDF de Google no es tan buena como muchas alternativas (especialmente para los que no están en inglés) y también es muy lenta. –

5

Uno de los comentarios aquí se usa gs en Windows. Tenía algo de éxito con que en Linux/OSX también, con la siguiente sintaxis:

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

que utilizan dSIMPLE en lugar de dCOMPLEX porque las últimas salidas 1 caracteres por línea.

19

Una herramienta de línea de comandos eficiente, de código abierto, sin costo alguno, disponible en las dos ventanas de Linux &: simplemente nombre d pdftotext. Esta herramienta es parte de la biblioteca xpdf.

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

+4

En una nota al margen: use el interruptor '-layout' para conservar las tablas, funciona bastante bien. – sebastian

68

Me dieron un archivo PDF de 400 páginas con una tabla de datos que tenía que importar - afortunadamente no hay imágenes. Ghostscript trabajó para mí:

archivo

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

La salida se divide en páginas con cabeceras, etc., pero fue entonces fácil escribir una aplicación que se deben eliminar las líneas en blanco, etc., y chupar en todos los 30.000 registros . -dSIMPLE y -dCOMPLEX no hicieron ninguna diferencia en este caso.

+20

En linux y cygwin, el comando es 'gs' en lugar de' gswin64c'. Funciona perfectamente. Sin basura pagada patentada. Simplemente funciona. – Jannes

+3

¡Sí, funciona genial! Ahora puedo usar "grep" con impunidad en mis archivos pdf. Como puedo grep mejor de lo que puedo leer, ¡es una victoria! (:-) Votación positiva. –

+1

Por unas horas estaba jugando con muchas bibliotecas .NET y esto produce el mejor (el más amigable) archivo txt desde el pdf. ¡Gracias! –

-2

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 en el menú Archivo, Elijo "Guardar como texto ...", le doy un nombre y dónde guardarlo, hago clic en "Guardar", y listo.

+2

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

2

responsabilidad: yo trabajo para ByteScout

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

texto en el archivo 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> 

P.S .: adicional sino que también rompe el texto en una estructura basada en la tabla.

Cuestiones relacionadas