Domanda

Ho un sacco di file PDF e il mio programma Perl deve fare una ricerca full-text per restituire quelli che contengono una stringa specifica. Ad oggi ho usato questo:

my @search_results = `grep -i -l \"$string\" *.pdf`;

dove $ stringa è il testo da cercare. Tuttavia, ciò non riesce per la maggior parte dei pdf perché il formato del file non è ovviamente ASCII.

Cosa posso fare di più semplice?

Chiarimento: Ci sono circa 300 pdf di cui non conosco in anticipo il nome. PDF :: Il core è probabilmente eccessivo. Sto cercando di far funzionare pdftotext e grep l'uno con l'altro dato che non conosco i nomi dei pdf, non riesco ancora a trovare la sintassi giusta.

Soluzione finale usando il suggerimento di Adam Bellaire di seguito:

@search_results = `for i in \$( ls ); do pdftotext \$i - | grep --label="\$i" -i -l "$search_string"; done`;
È stato utile?

Soluzione

Il thread PerlMonks qui parla di questo problema.

Sembra che per la tua situazione, potrebbe essere più semplice ottenere pdftotext (lo strumento da riga di comando), quindi puoi fare qualcosa del tipo:

my @search_results = `pdftotext myfile.pdf - | grep -i -l \"$string\"`;

Altri suggerimenti

Ho la seconda soluzione di Adam Bellaire. Ho usato l'utilità pdftotext per creare un indice full-text della mia libreria di ebook. È un po 'lento ma fa il suo lavoro. Per quanto riguarda il testo completo, prova PLucene o KinoSearch per memorizzare l'indice full-text.

La mia biblioteca, CAM :: PDF , supporta l'estrazione di testo, ma è un problema intrinsecamente difficile dato l'orientamento grafico della sintassi PDF. Quindi, l'output a volte è incomprensibile. CAM :: PDF raggruppa un programma getpdftext.pl , oppure puoi invocare la funzionalità in questo modo:

my $doc = CAM::PDF->new($filename) || die "$CAM::PDF::errstr\n";
for my $pagenum (1 .. $doc->numPages()) {
   my $text = $doc->getPageText($pagenum);
   print $text;
}

Potresti voler guardare PDF :: Core .

L'indice / ricerca full-text più semplice che ho usato è mysql. Basta inserire nella tabella con l'indice appropriato su di essa. Devi dedicare un po 'di tempo a elaborare le ponderazioni relative per i campi (una partita nel titolo potrebbe avere un punteggio più alto di una partita nel corpo), ma tutto ciò è possibile, anche se con qualche sql peloso.

Il plucene è deprecato (non c'è stato alcun lavoro attivo su di esso negli ultimi due anni dopo) a favore di KinoSearch. KinoSearch è cresciuto, in parte, comprendendo i limiti architettonici di Plucene.

Se hai ~ 300 pdf, una volta estratto il testo dal PDF (supponendo che il PDF contenga testo e non solo immagini di testo;) e in base ai volumi di query potresti trovare grep è sufficiente.

Tuttavia, suggerirei caldamente il percorso mysql / kinosearch in quanto hanno coperto un sacco di terreno (stemming, password, ponderazione dei termini, analisi dei token) con cui non trarrai vantaggio da impantanarti.

KinoSearch è probabilmente più veloce della route mysql, ma la route mysql ti offre un'esperienza di software / strumenti / sviluppatori standard più ampiamente utilizzata. E hai la possibilità di usare la potenza di sql per migliorare le tue query di ricerca a testo libero.

Quindi, a meno che tu non stia parlando di insiemi di dati ENORMI e volumi di query folli, i miei soldi sarebbero su mysql.

Potresti provare Lucene (la porta Perl si chiama Plucene). Le ricerche sono incredibilmente veloci e so che PDFBox sa già come indicizzare i file PDF con Lucene. PDFBox è Java, ma è probabile che ci sia qualcosa di molto simile da qualche parte in CPAN. Anche se non riesci a trovare qualcosa che aggiunge già file PDF a un indice Lucene, non dovrebbe essere più di poche righe di codice per farlo da solo. Lucene ti darà molte più opzioni di ricerca rispetto alla semplice ricerca di una stringa in un file.

C'è anche un modo molto veloce e sporco. Il testo in un file PDF viene effettivamente archiviato come testo normale. Se apri un PDF in un editor di testo o usi 'stringhe' puoi vedere il testo lì dentro. La spazzatura binaria è in genere caratteri incorporati, immagini, ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top