2009-04-21 16 views
32

Estoy buscando una manera rápida y confiable para leer/analizar archivos PDF grandes en Ruby (en Linux y OSX).Ruby: Lectura de archivos PDF

Hasta ahora he encontrado el más viejo y simple PDF-toolkit (un pdftotext -wrapper) y PDF-reader, que no fue capaz de leer la mayoría de mis archivos. Aunque las dos bibliotecas proporcionan exactamente la funcionalidad que estaba buscando.

Mi pregunta: ¿Me he perdido algo? ¿Hay alguna herramienta que sea más adecuada (más rápida y más confiable) para resolver mi problema?

+0

posible duplicado de [Ruby PDF-analizando gema/biblioteca] (http://stackoverflow.com/questions/320621/ruby-pdf-parsing-gem-library) –

Respuesta

24

Usted puede encontrar Docsplit útil:

Docsplit es una utilidad de línea de comandos y la biblioteca de Ruby para la división aparte documentos en sus partes componentes: buscar UTF-8 de texto sin formato, imágenes de la página o miniaturas en cualquier formato, Archivos PDF, páginas individuales y metadatos del documento (título, autor, número de páginas ...)

+1

Javier: echa un vistazo a Docsplit. Envuelve la biblioteca PDFBox de Apache para la extracción de texto, porque hemos tenido mejores resultados de calidad con PDFBox que con pdftotext. – jashkenas

+0

@pw. Instalé todas las bibliotecas y seguí toda la documentación para esto, sin embargo, estaba teniendo dificultades, ¿tiene referencias para tutoriales o documentación que va más allá de 2 líneas de código? –

+0

Docsplit es realmente bueno, pero ya no se mantiene – Magnum

0

Aquí hay algunas opciones:

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

A partir de ese enlace, y sourceforge búsqueda, hay un par de utilidades de línea de comandos que puede hacer lo que quiera, como éste: http://pdftohtml.sourceforge.net/

Dependiendo sus requisitos y cómo se ven los PDF, podría ver usando la API de Google Docs (cargando el PDF y luego descargándolo como texto), o también podría intentar algo como gocr. He tenido mucha suerte al analizar el texto de la imagen con gocr en el pasado, y solo tendrías que volverte al caparazón para hacerlo, como gocr -i whatever.pdf (creo que funciona con archivos PDF).

La desventaja de todo esto es que no son implementaciones de Ruby puro, pero muchos de los proyectos de OCR buenos (y gratuitos) parecen hacerse de esa manera.

+2

¿Por qué necesitaría OCR ("reconocimiento óptico de caracteres")?) para leer un PDF que no consta de texto escaneado? ¿No ralentizaría esto innecesariamente todo el proceso? – Javier

+1

No. OCR es el proceso de convertir imágenes a texto. Los lectores de PDF y los kits de herramientas PDF utilizan este concepto para convertir una imagen (la misma que se genera, por ejemplo, en un escáner) en texto. – Terry

+1

Entonces, básicamente, ¿está diciendo que todo el texto dentro de un PDF consiste en una imagen que primero debe reconocerse como texto? – Javier

2

Después de probar diferentes métodos, estoy usando PDF-Toolkit ahora. Es bastante viejo, pero es rápido, estable y confiable. Además, realmente no necesita ser nuevo, ya que simplemente ajusta el xpdf commandline utilities.

0

Si solo necesita obtener el contenido de texto de un archivo pdf, el pdftohtml en sourceforge es eficiente. no es adecuado para tratar con imágenes.

0

¿Echó un vistazo a la biblioteca CombinePDF?

Es una solución de rubí puro que permite cierta manipulación de PDF, como extraer páginas, superponer una página PDF a otra, numeración de páginas, escribir texto básico y tablas, etc. '

Aquí hay un ejemplo para copiar un archivo PDF existente con un logotipo. El ejemplo lee un archivo PDF, extrae una página para usarla como sello y estampara otro archivo PDF.

require 'combine_pdf' 
company_logo = CombinePDF.load("company_logo.pdf").pages[0] 
pdf = CombinePDF.load "content_file.pdf" 
pdf.pages.each {|page| page << company_logo} 
pdf.save "content_with_logo.pdf" 

También puede estampar texto, número de páginas o uso:

require 'combine_pdf' 

pdf = CombinePDF.load "content_file.pdf" 

pdf.number_pages #adds page numbers. you can add formatting and placement options. 

pdf.pages.each {|page| page.textbox "One Way To Stamp"} 

#you can a shortcut method to stamp pages 
pdf.stamp_pages "Another way to stamp" 

#you can use the shortcut method for both text and PDF stamps 
company_logo = CombinePDF.load("company_logo.pdf").pages[0] 
pdf.stamp_pages company_logo 

# you can use write simple tables 
pdf.pages[0].write_table headers: ['first name', 'surname'], table_data: [['John', 'Doe'], ['Mr.', 'Smith']] 

pdf.save "content_with_logo.pdf" 

No es la intención de operaciones complejas, pero que complementa la mayoría de las bibliotecas PDF de creación y permite el uso de plantillas de PDF en lugar de escribir la Todo desde cero.