Parsen von PDF-Dateien (vor allem mit Tabellen) mit PDFBox
Ich brauche zum analysieren einer PDF-Datei mit tabellarischen Daten. Ich bin mit PDFBox um die Datei zu extrahieren text zu analysieren, das Ergebnis (String) später. Das problem ist, dass der text-Extraktion nicht funktioniert, als ich erwartet hatte für tabellarische Daten. Zum Beispiel habe ich eine Datei, die enthält eine Tabelle wie diese (7 Spalten: die ersten beiden haben immer Daten, nur eine Komplexität Spalte Daten enthält, wird nur eine Finanzierung, die Spalte Daten):
+----------------------------------------------------------------+
| AIH | Value | Complexity | Financing |
| | | Medium | High | Not applicable | MAC/Other | FAE |
+----------------------------------------------------------------+
| xyz | 12.43 | 12.34 | | | 12.34 | |
+----------------------------------------------------------------+
| abc | 1.56 | | 1.56 | | | 1.56|
+----------------------------------------------------------------+
Dann benutze ich PDFBox:
PDDocument document = PDDocument.load(pathToFile);
PDFTextStripper s = new PDFTextStripper();
String content = s.getText(document);
Diese zwei Zeilen von Daten extrahiert werden, wie diese:
xyz 12.43 12.4312.43
abc 1.56 1.561.56
Gibt es keine Leerzeichen zwischen den letzten beiden zahlen, aber das ist nicht das größte problem. Das problem ist, dass ich nicht weiß, was die letzten beiden zahlen bedeuten: Mittel, Hoch, Nicht anwendbar? MAC/Andere, FAE? Ich habe nicht die Beziehung zwischen den zahlen und Ihren Spalten.
Ist es nicht erforderlich, dass für mich mit der PDFBox-Bibliothek, also eine Lösung, die verwendet eine andere Bibliothek ist in Ordnung. Was ich will ist zu können, analysieren Sie die Datei, und wissen, was jeder analysiert Zahl bedeutet.
PDF wurde entwickelt, um eine Ausgabe-display-format und nicht für die Extraktion. Die Schuld der Benutzer, nicht das format.
Wenn die PDF-Datei wird von einem festen layout dann gibt es andere Möglichkeiten der Extraktion der Daten aus den Spalten. Ich habe gerade ein tool geschrieben, um zu extrahieren PDF-text aus festen feldpositionen in einem Formular. Es wäre interessant zu sehen sein, die PDF-Datei, Matheus bezieht.
Leider kann ich nicht zeigen, die PDF-Datei. Es enthält Projekt-client-Daten und kann nicht weitergegeben werden.
Ich habe das gleiche problem mit einer anderen Bibliothek (pdfparser.org). Es scheint nicht zu einem library-problem. Die Lösung kam ich, nach viel suchen ist der Prozess unterteilt sich in zwei: 1)PDFtoHTML & 2)HTMLtoTXT.
InformationsquelleAutor matheus.emm | 2010-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie entwickeln einen Algorithmus zum extrahieren der Daten in ein verwendbares format. Unabhängig davon, welche PDF-Bibliothek, die Sie verwenden, werden Sie brauchen, um dies zu tun. Zeichen und Grafiken sind gezeichnet durch eine Reihe von stateful-Zeichenoperationen, d.h. bewegen sich zu dieser position auf dem Bildschirm und ziehen Sie das Symbol für Zeichen 'c'.
Schlage ich vor, dass Sie verlängern
org.apache.pdfbox.pdfviewer.PDFPageDrawer
ab und setzen diestrokePath
Methode. Von dort aus können Sie abfangen, die Zeichenoperationen für horizontale und vertikale Liniensegmente und verwenden Sie diese Informationen, um zu bestimmen, die Spalten-und Zeilen-Positionen für Ihre Tabelle. Dann eine einfache Frage der Einstellung text-Regionen und die Festlegung, welche zahlen/Buchstaben/Zeichen gezeichnet werden, in der region. Da Sie wissen, das layout der Regionen, Sie werden in der Lage sein zu sagen, welche Spalte der text-Extraktion gehört.Auch der Grund, warum Sie können keine Leerzeichen zwischen dem text, der optisch abgetrennt ist, dass sehr oft ein Leerzeichen ist nicht gezeichnet von der PDF-Datei. Statt die text-matrix wird aktualisiert und eine Zeichnung " - Befehl für 'bewegen' ausgegeben wird, das nächste Zeichen zu ziehen und eine "Breite Raum" abgesehen von der letzten.
Glück.
Ich habe etwas ähnliches vor kurzem, außer, dass ich zu tun hatte mit mehreren Zeilen text. Werfen Sie auch einen Blick auf die ExtractText Reihe von Klassen, um herauszufinden, wie um zu ziehen aus dem eigentlichen text nachdem Sie die Spalten und Zeilen. Auf einer anderen Anmerkung, ich hatte Probleme immer die Zeilen richtig, aber war in der Lage, passen Sie durch die Annahme einer neuen Zeile, wenn ich ging zurück Spalten.
Wie Sie behandelt mehrzeiligen text?
gibt es eine Möglichkeit, zu identifizieren, Tisch-position?
Sie müssen, um reverse-Engineering des formats, die verwendet wird, durch was auch immer schrieb das PDF-Dokument, um herauszufinden, die genaue Art und Weise Sie behandelt - verschiedene PDF-Generatoren handhaben dies anders. Im Allgemeinen werden Sie in der Lage sein, zu erkennen, mehrere Linien, indem man die Positionen des gezeichneten text.
InformationsquelleAutor purecharger
Hatte ich viele tools zum extrahieren Tabelle aus pdf-Datei, aber es hat nicht funktioniert für mich.
Also implementierte ich meine eigenen Algorithmus ( sein name ist
traprange
) zu analysieren tabellarische Daten in pdf-Dateien.Folgenden sind einige Beispiel-pdf-Dateien und Ergebnisse:
Besuchen Sie meine Projekt-Seite bei traprange.
bitte prüfen Sie in dieser Datei github.com/thoqbk/traprange/blob/master/pom.xml
Es scheint, dass wir haben es nicht in maven central ? search.maven.org
Nein, wir nicht
InformationsquelleAutor Tho
Können Sie extrahieren Sie text von Bereich zu Bereich in PDFBox. Finden Sie die
ExtractByArea.java
Beispiel-Datei, in derpdfbox-examples
Artefakt, wenn man mit Maven. Ein snippet sieht wieDas problem ist immer die Koordinaten in den ersten Platz. Ich habe Erfolg Verlängerung der normalen
TextStripper
überschreibenprocessTextPosition(TextPosition text)
- und Ausgabe der Koordinaten für jedes Zeichen und herauszufinden, wo im Dokument Sie sind.Aber es gibt einen viel einfacheren Weg, zumindest wenn Sie auf einem Mac. Öffnen Sie das PDF in der Vorschau mit ⌘I zu zeigen, der Inspektor, wählen Sie die Crop-Registerkarte und stellen Sie sicher, dass die Einheiten sind in Punkten, aus dem Werkzeuge-Menü wählen Sie " Rechteckige Auswahl, und wählen Sie den Bereich von Interesse. Wenn Sie wählen Sie einen Bereich aus, der inspector zeigt Ihnen die Koordinaten, die Sie Runden und in füttern der
Rectangle
Konstruktor Argumente. Sie brauchen nur zu bestätigen, wo der Ursprung ist, unter Verwendung der ersten Methode.InformationsquelleAutor Emerson Farrugia
Ist es vielleicht zu spät für meine Antwort, aber ich denke, das ist nicht schwer. Verlängern Sie die PDFTextStripper-Klasse und überschreiben Sie die writePage() und processTextPosition (...) - Methoden. In deinem Fall nehme ich an, dass die Spaltenüberschriften sind immer die gleichen. Das bedeutet, dass Sie wissen, die x-Koordinate der Kopfzeile jeder Spalte und vergleichen Sie die x-Koordinate die zahlen zu denen der Spaltenüberschriften. Wenn Sie nahe genug sind (Sie haben zu testen, um zu entscheiden, wie nahe), dann kann man sagen, dass diese Zahl gehört in diese Spalte.
Ein anderer Ansatz wäre, zum abfangen des "charactersByArticle" Vektor nach jeder Seite geschrieben:
Wissen, Ihre Spalten, können Sie für Ihren Vergleich der x-Koordinaten, um zu entscheiden, welche Spalte jede Zahl gehört.
Dem Grund haben Sie keine Leerzeichen zwischen den zahlen ist, weil Sie haben zu setzen Sie die Wort-Trennzeichen.
Ich hoffe, dies ist nützlich für Sie oder für andere, die versuchen könnten ähnliche Dinge.
InformationsquelleAutor impeto
Gibt es PDFLayoutTextStripper wurde konzipiert, um das format der Daten.
Aus der README:
InformationsquelleAutor Matthias Braun
Ich habe gute Erfolge mit der Analyse von text-Dateien generiert, die von der pdftotext - Dienstprogramm (sudo apt-get install poppler-utils).
InformationsquelleAutor scott
Extrahieren von Daten aus PDF-gebunden zu sein, mit Problemen behaftet. Sind die Dokumente erstellt, die durch eine Art automatischen Prozeß? Wenn ja, könnten Sie erwägen, die Umwandlung der PDF in ein nicht komprimiertes PostScript (versuchen Sie pdf2ps) und sehen, ob der PostScript enthält irgendeine Art von regelmäßige Muster, die man ausnutzen kann.
InformationsquelleAutor Todd Owen
Ich hatte das gleiche problem beim Lesen der pdf-Datei, in der die Daten in Tabellenform an. Nach der regulären analysieren mit PDFBox jeder Zeile extrahiert wurden, mit Komma als Trennzeichen... verlieren die säulenförmige position.
Zum beheben dieses ich verwendet PDFTextStripperByArea und über die Koordinaten die ich extrahiert die Daten Spalte um Spalte für jede Zeile. Voraussetzung ist, dass Sie haben ein festes format pdf.
Dann Zeile 2 und so weiter...
InformationsquelleAutor manu
Können Sie PDFBox ist
PDFTextStripperByArea
Klasse zum extrahieren von text aus einer bestimmten region eines Dokuments. Auf die Sie bauen können dies durch die Identifizierung der region jede Zelle der Tabelle. Dies ist nicht gestellt out of the box, aber das BeispielDrawPrintTextLocations
- Klasse veranschaulicht, wie Sie analysieren die bounding-Boxen der einzelnen Zeichen in einem Dokument (es wäre toll, zu analysieren bounding-Boxen von strings oder Absätze, aber ich habe nicht gesehen, Unterstützung bei der PDFBox - siehe diese Frage). Sie können diesen Ansatz verwenden, gruppieren Sie sich alle berühren bounding-Boxen zu identifizieren, die verschiedene Zellen einer Tabelle. Ein Weg dies zu tun ist, halten eine Reiheboxes
vonRectangle2D
Regionen und dann für jedes Analysierte Charakter finden dem Begrenzungsrahmen des Zeichens als inDrawPrintTextLocations.writeString(String string, List<TextPosition> textPositions)
und verschmelzen es mit den vorhandenen Inhalt.Können Sie dann diese Regionen passieren zu
PDFTextStripperByArea
.Können Sie auch gehen, eine weitere, und trennen die horizontalen und vertikalen Komponenten dieser Regionen, und so folgern Regionen alle Tabellen-Zellen, unabhängig davon, ob dann halten Sie einen beliebigen Inhalt.
Hatte ich Ursache, um diese Schritte durchzuführen, und schließlich schrieb meine eigenen
PDFTableStripper
Klasse mit PDFBox. Ich habe meine code als gist auf GitHub. Diemain
Methode gibt ein Beispiel, wie die Klasse verwendet werden kann:InformationsquelleAutor beldaz
Versuchen Sie es mit TabulaPDF (https://github.com/tabulapdf/tabula) . Dies ist eine sehr gute library um die Tabelle extrahieren von Inhalten aus der PDF-Datei. Es ist sehr wie erwartet.
Glück. 🙂
InformationsquelleAutor SURESH KUMAR S
http://swftools.org/ diese Jungs haben eine pdf2swf-Komponente. Sie können auch Tabellen anzeigen.
Sie geben auch die Quelle an. So könnten Sie vielleicht check it out.
InformationsquelleAutor kaushalc
Dies funktioniert gut, wenn die PDF-Datei hat "Nur Rechteckige Tisch" mit pdfbox 2.0.6. Funktioniert nicht mit jeder anderen Tabelle nur die Rechteckigen Tisch.
InformationsquelleAutor Sunil K Chaudhary
Ich bin nicht vertraut mit PDFBox, aber du könntest versuchen Sie bei itext. Auch wenn die homepage sagt, PDF-Generierung, können Sie auch PDF-manipulation und Extraktion. Werfen Sie einen Blick und sehen, ob es passt Ihre Nutzung Fall.
Ich fand einen einfachen Weg, um Lesen Sie den Inhalt mithilfe von iText, aber es hat mir nicht helfen. Mit PdfTextExtractor bekomme ich ein ähnliches Ergebnis wie mit PDFBox. 🙁
es ist schon eine Weile her, aber ist es nicht PdfReader dann .getContent()?
InformationsquelleAutor Paul Sanwald
Wie etwa Druck -, Bild-und tun OCR?
Klingt furchtbar ineffektiv, aber es ist praktisch der Zweck von PDF zu text ist unzugänglich, du musst tun, was du tun musst.
Ich habe sehr wenig Erfahrung mit OCR-software. Etwas sehr ungeschickt genannt ReadIris, kam frei mit meinem HP-Drucker, und eine erstaunlich leistungsfähige, aber dennoch preiswerte Produkt namens aabby FineReader (glaube ich). Wenn ich mich richtig erinnere, sind beide in der Lage zu Lesen, Dokumente mit Tabellen in MS Word-format und enthalten Tabellen. Bitte nehmen Sie diese info als Hinweis für die weitere exploration, nicht um eine konkrete Empfehlung.
OCRing wäre sinnlos, wie haben Sie Zugang zu den eigentlichen Charakter und die X,Y-Position, die mindestens in jedem PDF API
Ich Ihre Methode für eine geordnete, wenn auch arbeitsintensiv, Extraktion von einfachen Tabellen in einem PDF-Dokument benutze ich die OCR von PDF X-Change viewer, dann verwenden Sie die Auswahl-Werkzeuge, dann geschnitten und schließlich einfügen in eine Tabellenkalkulation. Es ist ein mehrere Schritt-Prozess. Das Auswahl-Werkzeug arbeitet mit der [alt] - Taste, um durch die Spalte, wenn auch nicht völlig vorhersehbar (Spalte, Zeilen Grenzen nicht immer halten). Dies wurde besser als die Transkription. Aber für lange Tabellen aufgeteilt auf viele Seiten mit Header, diese Methode ist mühsam. Meinem naiven Verständnis ist PDFs fehlen einer verwertbaren Tabelle Formalismus.
InformationsquelleAutor Carl Smotricz
Für das Lesen von Inhalt von der Tabelle aus der pdf-Datei,müssen Sie nur das tun, nur konvertieren Sie die pdf-Datei in eine text-Datei mit jedem API(ich habe verwenden PdfTextExtracter.getTextFromPage() von iText) und Lesen Sie dann die txt-Datei von Ihrem java-Programm..jetzt nach der Lektüre ist die wesentliche Aufgabe ist getan.. Sie haben zu filtern der Daten, die du brauchst. Sie können es tun, indem Sie kontinuierlich mit split-Methode der String-Klasse, bis Sie finden die Aufzeichnung Ihrer intrest.. hier ist mein code, die ich extrahieren, die Teil des Datensatzes durch eine PDF-Datei und schreiben Sie in eine .CSV-Datei.. - Url der PDF-Datei ist..http://www.cea.nic.in/reports/monthly/generation_rep/actual/jan13/opm_02.pdf
Code:-
InformationsquelleAutor Abhishek Yadav