Wie extrahiere ich Text aus einem PDF? [geschlossen]

152

Kann jemand eine Bibliothek / API zum Extrahieren von Text und Bildern aus einem PDF empfehlen? Wir müssen in der Lage sein, auf Text zuzugreifen, der in bekannten Bereichen des Dokuments enthalten ist, daher muss die API uns Positionsinformationen zu jedem Element auf der Seite geben.

Wir möchten, dass diese Daten in xmloder im jsonFormat ausgegeben werden. Wir schauen uns gerade PdfTextStream an, was ziemlich gut zu sein scheint, aber gerne die Erfahrungen und Vorschläge anderer Leute hören würde.

Gibt es Alternativen (kommerzielle oder kostenlose), um Text programmgesteuert aus einem PDF zu extrahieren?

Budda007
quelle
1
Für diejenigen, die etwas wirklich Einfaches benötigen (keine Positionsinformationen), kann dieser Perl-Regex ausreichen : /^\s*\[?\((.*?)\)\]?\s*T[Jj]/mg. Es wird nur nach dem Tj / TJ-Operator gesucht, der den gesamten normalen Text in einer PDF-Datei kennzeichnet.
Alex R
1
Verwenden Sie die TomRoush PdfBox- Bibliothek, dies funktioniert gut auf Android
FaisalAhmed

Antworten:

113

Ich erhielt eine 400-seitige PDF-Datei mit einer Datentabelle, die ich importieren musste - zum Glück keine Bilder. Ghostscript hat bei mir funktioniert:

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

Die Ausgabedatei wurde in Seiten mit Überschriften usw. aufgeteilt, aber es war dann einfach, eine App zu schreiben, um Leerzeilen usw. zu entfernen und alle 30.000 Datensätze einzusaugen. -dSIMPLEund -dCOMPLEXmachte in diesem Fall keinen Unterschied.

user2176753
quelle
37
Unter Linux und Cygwin ist der Befehl gsanstelle von gswin64c. Funktioniert perfekt. Kein patentierter bezahlter Mist. Es funktioniert einfach.
Jannes
4
Ja, funktioniert super! Jetzt kann ich "grep" ungestraft für meine PDF-Dateien verwenden. Da ich besser grepen kann als ich lesen kann, ist es ein Gewinn! (:-) Upvote.
David Elson
1
Das einzige Problem, das ich damit hatte, war die Verwendung in PDFs mit eingebetteten "alten" Schriftarten. Funktioniert perfekt für lokal generierte PDFs, ist jedoch bei dunklen Quellen schwieriger. Ansonsten ein ausgezeichnetes Scriptlet.
Jon M
was macht -sDEVICE=txtwritedas Ich verstehe nicht viel, nachdem ich gelesen habe, wie man Ghostscript | verwendet Auswählen eines Ausgabegeräts
Ooker
Verwenden Sie für die Standardausgabe anstatt als Textdatei zu speichern gswin64c -sDEVICE=txtwrite -o- input.pdf. Quelle (von mir leicht verändert): gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526ac
LuH
33

Seit heute weiß ich es: Das Beste für die Textextraktion aus PDFs ist TET, das Toolkit zur Textextraktion . TET ist Teil der PDFlib.com-Produktfamilie.

PDFlib.com ist das Unternehmen von Thomas Merz. Falls Sie seinen Namen nicht erkennen: Thomas Merz ist der Autor der "PostScript and PDF Bible".

Die erste Inkarnation von TET ist eine Bibliothek . Dieser kann wahrscheinlich alles tun, was Budda006 wollte, einschließlich Positionsinformationen zu jedem Element auf der Seite. Oh, und es kann auch Bilder extrahieren. Es rekombiniert Bilder, die in Stücke fragmentiert sind.

pdflib.com bietet auch eine weitere Inkarnation dieser Technologie, das TET-Plugin für Acrobat . Und die dritte Inkarnation ist der PDFlib TET iFilter . Dies ist ein eigenständiges Tool für Benutzerdesktops. Beide können (wie bei Bier) kostenlos für private, nicht kommerzielle Zwecke verwendet werden.

Und es ist wirklich mächtig. Viel besser als die eigene Textextraktion von Adobe. Es hat Text für mich extrahiert, bei dem andere Tools (einschließlich Adobe) nur Müll ausspucken.

Ich habe gerade das Desktop-Standalone-Tool getestet, und was sie auf ihrer Webseite sagen, ist wahr. Es hat eine sehr gute Kommandozeile. Einige meiner "problematischen" PDF-Testdateien wurden vom Tool zu meiner vollsten Zufriedenheit verarbeitet.

Diese Sache wird von nun an meine Empfehlung für alle anspruchsvollen und herausfordernden Anforderungen an die PDF-Textextraktion sein.

TET ist einfach großartig. Es erkennt Tabellen. In Tabellen werden Zellen identifiziert, die sich über mehrere Spalten erstrecken. Es identifiziert Tabellenzeilen und Inhalte jeder Tabellenzelle separat. Es geht sehr gut mit Silbentrennungen um: Es entfernt Bindestriche und stellt vollständige Wörter wieder her. Es unterstützt Nicht-ASCII-Sprachen (einschließlich CJK, Arabisch und Hebräisch). Bei Ligaturen werden die ursprünglichen Zeichen wiederhergestellt ...

Versuche es.

Kurt Pfeifle
quelle
32
Es gibt keine Testversion, und 440 US-Dollar sind ein bisschen viel für "Probieren Sie es aus".
Rok Strniša
Ist dieser Service über eine API verfügbar?
Bart
1
Ich habe es getestet, es erkennt keine Spalten. Ich habe eine englische Boulevard-Titelseite gescannt. Der Text wurde auf dem Papier in drei Spalten aufgeteilt, aber dieses Plugin mischte die Sätze insgesamt, sodass es jibberisch aussah. Ghostscript, das kostenlos ist, hatte genau die gleiche Ausgabe.
NoWhereToBeSeen
1
@RedHotScalability: Auch BTW, die TET tut colums erkennen , wenn mit den richtigen Parametern verwendet. Aber ich überlasse es dem ehrgeizigen JS-Scripter, die Dokumentation zu lesen und herauszufinden, wie ...
Kurt Pfeifle
29

Ein effizientes, kostenloses Open Source-Befehlszeilentool, das sowohl unter Linux als auch unter Windows verfügbar ist: einfach pdftotext genannt. Dieses Tool ist Teil der xpdf-Bibliothek.

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

131
quelle
4
Nebenbei bemerkt: Verwenden Sie den -layoutSchalter, um Tabellen zu erhalten, funktioniert ziemlich gut.
Sebastian
12

Hier ist mein Vorschlag. Wenn Sie Text aus PDF extrahieren möchten, können Sie die PDF-Datei in Google Text & Tabellen importieren und dann in ein benutzerfreundlicheres Format wie .html, .odf, .rtf, .txt usw. exportieren. All dies mithilfe der Drive-API . Es ist kostenlos * und robust. Schauen Sie sich an:

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

Da es sich um eine Rest-API handelt, ist sie mit ALLEN Programmiersprachen kompatibel. Die Links, die ich oben gepostet habe, enthalten Arbeitsbeispiele für viele Sprachen, darunter Java, .NET, Python, PHP, Ruby und andere.

Ich hoffe, es hilft.

oabarca
quelle
2
Ich habe diese Option verwendet und würde sie nicht empfehlen. Die PDF-Textextraktion von Google ist nicht so gut wie viele Alternativen (insbesondere für Nicht-Englisch) und auch sehr, sehr langsam.
Björn Lindqvist
10

PdfTextStream (von dem Sie sagten, dass Sie es sich angesehen haben) ist jetzt kostenlos für Single-Threaded-Anwendungen. Meiner Meinung nach ist seine Qualität viel besser als bei anderen Bibliotheken (insbesondere bei funky eingebetteten Schriftarten usw.).

Alternativ sollten Sie sich Apache PDFBox , Open Source, ansehen .

Renaud
quelle
PdfTextStream wird in Android nicht unterstützt. Gibt es einige gute Bibliotheken wie diese für Android?
FaisalAhmed
@FaisalAhmed was ist mit PDFBox?
Renaud
Ja, PdfBox wird auch in Android nicht unterstützt. Sowohl PdfTextStream als auch PdfBox verwenden einen awt-Teil, der in Android nicht unterstützt wird
FaisalAhmed
Ich benutze diese Bibliothek, die gut auf Android funktioniert github.com/TomRoush/PdfBox-Android
FaisalAhmed
6

In einem der Kommentare hier wurde gs unter Windows verwendet. Damit hatte ich auch unter Linux / OSX einige Erfolge mit der folgenden Syntax:

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

Ich habe dSIMPLEstattdessen verwendet, dCOMPLEXweil letzteres 1 Zeichen pro Zeile ausgibt.

kvz
quelle
5

Da es sich bei der Frage speziell um alternative Tools zum Abrufen von Daten aus PDF als XML handelt , sollten Sie sich das kommerzielle Tool "ByteScout PDF Extractor SDK" ansehen, das genau dies kann: Text aus PDF als XML zusammen mit extrahieren die Positionierungsdaten (x, y) und Schriftartinformationen:

Text im Quell-PDF:

Products | Units | Price 

XML ausgeben:

 <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>

PS: Zusätzlich wird der Text in eine tabellenbasierte Struktur unterteilt.

Offenlegung: Ich arbeite für ByteScout

Eugene
quelle
3

Das Beste, woran ich derzeit denken kann (innerhalb der Liste der "einfachen" Tools), ist Ghostscript (aktuelle Version ist v.8.71) und das PostScript-Dienstprogramm ps2ascii.ps. Ghostscript versendet es in seinem libUnterverzeichnis. Versuchen Sie dies (unter 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

Dieser Befehl verarbeitet die Seiten 3-7 von input.pdf. Lesen Sie die Kommentare in der ps2ascii.psDatei selbst, um zu sehen, was die "seltsamen" Zahlen und zusätzlichen Informationen bedeuten ( sie geben Zeichenfolgen, Positionen, Breiten, Farben, Bilder, Rechtecke, Schriftarten und Seitenumbrüche an ... ). Ersetzen Sie das -dCOMPLEXTeil durch, um eine "einfache" Textausgabe zu erhalten -dSIMPLE.

Kurt Pfeifle
quelle
2
Wie Sie sich vorstellen können, wird hier nur ein ASCII-Test ausgegeben. Obwohl kostenlos, keine großartige Option für Software, die Sie mit anderen Sprachen als Englisch planen.
Userx
3
@userx: Wie Sie sich vorstellen können, handelt es sich um freie Software. Daher ist Quellcode verfügbar. Mögliche Verlängerung für die Unterstützung von Nicht-ASCII ...
Kurt Pfeifle
@userx: Heute habe ich 'TET' entdeckt, das Text Extraction Toolkit von pdflib.com. Siehe meine andere Antwort.
Kurt Pfeifle
ps2ascii von Ghostscript 9.07 hat auf meinem OpenBSD-System wunderbar funktioniert. Ich habe gerade ein 526-seitiges PDF in einfachen Text konvertiert. Jetzt kann ich leicht Text für Notizen greifen und extrahieren. Ich habe den einfachen Befehl verwendet ps2ascii book.pdf notes.txt. Wenn Ihr Dokument überwiegend ASCII ist, haben Sie Glück.
Clint Pachl
3

Ich weiß, dass dieses Thema ziemlich alt ist, aber dieses Bedürfnis lebt noch. Ich habe viele Dokumente, Foren und Skripte gelesen und ein neues erweitertes Dokument erstellt, das komprimiertes und unkomprimiertes PDF unterstützt:

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

In einigen Fällen ist die Befehlszeile aus Sicherheitsgründen verboten. Eine native PHP-Klasse kann also viele Anforderungen erfüllen.

Hoffe es hilft jedem

Sebastien Malot
quelle
1

QuickPDF scheint eine vernünftige Bibliothek zu sein, die zu einem vernünftigen Preis das tun sollte, was Sie wollen.

http://www.quickpdflibrary.com/ - Sie haben eine 30-Tage-Testversion.

Andrew Cash
quelle
0

Auf meinen Macintosh-Systemen finde ich, dass "Adobe Reader" einigermaßen gute Arbeit leistet. Ich habe auf meinem Desktop einen Alias ​​erstellt, der auf "Adobe Reader.app" verweist, und alles, was ich tue, ist, eine PDF-Datei auf dem Alias ​​abzulegen, wodurch es zum aktiven Dokument in Adobe Reader wird, und dann über das Menü "Datei". Ich wähle "Als Text speichern ...", gebe ihm einen Namen und wo er gespeichert werden soll, klicke auf "Speichern" und ich bin fertig.

Dick Guertin
quelle
5
Das OP suchte nach einer Lösung, um Text programmgesteuert aus einem PDF zu extrahieren . Ihre Antwort schlägt stattdessen eine manuelle Routine vor.
mkl