Frage

Ich habe eine Reihe von PDF-Dateien und meine Perl-Programm benötigt eine Volltextsuche von ihnen zu tun zurückzukehren, welche davon eine bestimmte Zeichenfolge enthalten. Bis heute habe ich das schon mit:

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

Dabei steht $ string ist der Text zu suchen. Doch diese für die meisten PDF-Dateien schlägt fehl, da das Dateiformat offensichtlich nicht ASCII ist.

Was kann ich tun, das ist am einfachsten?

Zur Verdeutlichung: Es gibt etwa 300 PDF-Dateien, deren Namen ich nicht weiß im Voraus. PDF :: Core ist wahrscheinlich übertrieben. Ich versuche, pdftotext zu bekommen und grep miteinander zu spielen schön gegeben Ich weiß nicht, die Namen der PDF-Dateien, ich noch nicht die richtige Syntax finden.

Endlösung mit Adam Bellaire Vorschlag unter:

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

Lösung

Der PerlMonks Thread hier spricht über dieses Problem.

Es scheint, dass für Ihre Situation, könnte es am einfachsten sein zu bekommen pdftotext (das Kommandozeilen-Tool), dann können Sie so etwas wie:

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

Andere Tipps

Ich zweite Adam Bellaire Lösung. Ich benutzte pdftotext Dienstprogramm Volltextindex meiner E-Book-Bibliothek zu erstellen. Es ist ein wenig langsam, aber macht seinen Job. Wie für den Volltext, versucht PLucene oder KinoSearch Volltextindex zu speichern.

Meine Bibliothek, CAM :: PDF , hat die Unterstützung für das Extrahieren von Text, aber es ist ein von Natur aus schwer Problem der grafische Ausrichtung der PDF-Syntax angegeben. So ist der Ausgang manchmal Kauderwelsch. CAM :: PDF bündelt ein getpdftext.pl Programm oder Sie können die Funktionalität wie so aufrufen:

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

Sie können unter PDF :: Kern suchen.

Der einfachste Volltextindex / Suchanfrage ich verwendet habe, ist mysql. Sie fügen einfach in die Tabelle mit dem entsprechenden Index auf sich. Sie müssen einige Zeit ausarbeitet, die relativen Gewichtungen für Felder (ein Spiel im Titel punkten könnte höher als ein Spiel im Körper) verbringen, aber das ist alles möglich, wenn auch mit einigen haarigen sql.

Plucene ist veraltet (es hat keine aktive Arbeit auf sie in den letzten zwei Jahren afaik) zugunsten von KinoSearch. KinoSearch wuchs zum Teil aus den architektonischen Grenzen Plucene zu verstehen.

Wenn Sie ~ 300 pdfs haben, dann, wenn Sie den Text aus dem PDF extrahiert haben (das PDF unter der Annahme hat Text und nicht nur Bilder von Text;) und je nach Abfragevolumen können Sie feststellen, grep ausreichend ist.

Allerdings würde ich stark die mysql / kinosearch Route vorschlagen, da sie viel Boden bedeckt haben (ergeben, Stoppwörter, Begriff Gewichtung, Token-Analyse), die Sie mit verzetteln nicht von Nutzen zu werden.

KinoSearch ist wahrscheinlich schneller als die MySQL-Route, aber die MySQL-Route gibt Ihnen mehr weit verbreitete Standard-Software / Tools / Entwickler-Erfahrung. Und haben Sie die Möglichkeit erhalten, die Leistung von SQL zu verwenden, um Ihre Freitextsuchanfragen augement.

Also, wenn Sie sprechen riesig Daten-Sets und verrückt Abfrage Bände, mein Geld auf mysql wäre.

Sie könnten versuchen, Lucene (die Perl-Port Plucene genannt). Die Durchsuchungen sind unglaublich schnell und ich weiß, dass PDFBox bereits weiß, wie PDF-Dateien mit Lucene zu indizieren. PDFBox ist Java, aber die Chancen sind etwas sehr ähnlich irgendwo in CPAN ist. Auch wenn Sie nicht etwas, das bereits fügt PDF-Dateien in einem Lucene Index finden können, sollte es nicht mehr als ein paar Zeilen Code sein, es selbst zu tun. Lucene wird Ihnen ziemlich viele mehr Suchoptionen, als nur für eine Zeichenfolge in einer Datei suchen.

Es gibt auch eine sehr schnelle und schmutzige Art und Weise. Text in einer PDF-Datei ist eigentlich als Klartext gespeichert. Wenn Sie eine PDF-Datei in einem Texteditor öffnen oder verwenden ‚Strings‘ können Sie den Text in dort sehen. Die binäre Junk ist in der Regel Schriften eingebettet, Bilder, etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top