2009-04-21 6 views
32

Sto cercando un modo veloce e affidabile per leggere/analizzare i file PDF di grandi dimensioni in Ruby (su Linux e OSX).Rubino: la lettura di file PDF

Fino ad ora ho trovato piuttosto vecchio e semplice PDF-toolkit (un pdftotext -wrapper) e PDF-reader, che era in grado di leggere la maggior parte dei miei file. Sebbene le due librerie forniscano esattamente la funzionalità che stavo cercando.

La mia domanda: mi sono perso qualcosa? C'è uno strumento che è più adatto (più veloce e più affidabile) per risolvere il mio problema?

+0

possibile duplicato di [Gemma/libreria di parodia di Ruby PDF (http://stackoverflow.com/questions/320621/ruby-pdf-parsing-gem-library) –

risposta

24

Potreste trovare Docsplit utile:

Docsplit è un'utility a riga di comando e libreria Ruby per spaccare a parte i documenti nelle loro componenti: ricercabile UTF-8 testo, immagini di pagina o le miniature in qualsiasi formato, PDF, pagine singole e metadati del documento (titolo, autore, numero di pagine ...)

+1

Javier: dai un'occhiata a Docsplit. Contiene la libreria Apache PDFBox per l'estrazione del testo, perché abbiamo ottenuto risultati di qualità migliori con PDFBox che pdftotext. – jashkenas

+0

@pw. Installato tutte le librerie e seguito tutta la documentazione per questo, tuttavia stavo avendo un momento difficile, hai qualche riferimento per tutorial o documentazione che va oltre le 2 linee di codice? –

+0

Docsplit è veramente buono ma non è più mantenuto – Magnum

0

Ecco alcune opzioni:

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

Da quel link, e sourceforge la ricerca, ci sono un paio di utility a riga di comando che potrebbe fare quello che vuoi, come questo: http://pdftohtml.sourceforge.net/

A seconda le tue esigenze e l'aspetto dei PDF, potresti utilizzare l'API di Google Documenti (caricare il PDF e scaricarlo come testo) o provare anche qualcosa come gocr. Ho avuto molta fortuna nell'analisi del testo delle immagini con gocr in passato, e dovresti semplicemente rimbalzare sulla shell per farlo, come gocr -i whatever.pdf (penso che funzioni con i PDF).

Il lato negativo di tutto questo è che non sono implementazioni di puro Ruby, ma molti dei buoni (e gratuiti) progetti OCR sembrano essere fatti in questo modo.

+2

Perché avrei bisogno di OCR ("riconoscimento ottico dei caratteri") per leggere un PDF che non è costituito da testo scansionato? Non rallenterebbe inutilmente l'intero processo? – Javier

+1

No. OCR è il processo di conversione delle immagini in testo. I lettori PDF e i toolkit PDF utilizzano questo concetto per convertire un'immagine (la stessa che viene prodotta, diciamo, da uno scanner) in testo. – Terry

+1

Quindi, in pratica, stai dicendo che tutto il testo all'interno di un PDF è costituito da un'immagine che deve essere prima riconosciuta come testo? – Javier

2

Dopo aver provato diversi metodi, sto usando PDF-Toolkit ora. È piuttosto vecchio, ma è veloce, stabile e affidabile. Inoltre, non ha davvero bisogno di essere nuovo, perché avvolge solo lo xpdf commandline utilities.

0

Se hai solo bisogno di ottenere il contenuto del testo da un file pdf, pdftohtml su sourceforge è efficiente. non è adatto per le immagini.

0

Hai dato un'occhiata alla libreria CombinePDF?

È una soluzione puramente ruby ​​che consente alcune manipolazioni di PDF, come l'estrazione di pagine, la sovrapposizione di una pagina PDF rispetto ad un'altra, la numerazione delle pagine, la scrittura di testo e tabelle di base, ecc.

Ecco un esempio per stumping un file PDF esistente con un logo. L'esempio legge un file PDF, estrae una pagina da utilizzare come timbro e timbra un altro file 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" 

È inoltre possibile stampare il testo, pagine numero o l'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" 

Non è pensato per operazioni complesse, ma integra la maggior parte delle librerie PDF di authoring e consente di utilizzare modelli PDF invece di scrivere il tutto da zero.