Extrahieren von Tabellen aus pdf-Datei (excel), pref. w/ vba
Ich versuche zum extrahieren von Tabellen aus pdf-Dateien mit vba und exportieren Sie Sie in excel. Wenn alles klappt wie es sollte, es sollte alles automatisch. Das problem ist, dass die Tabelle nicht standardisiert sind.
Dies ist, was ich habe, so weit.
- VBA (Excel) läuft XPDF, und konvertiert alle .pdf-Dateien im aktuellen Ordner eine text-Datei.
- VBA (Excel) liest jeden text-Datei Zeile für Zeile.
Und den code:
With New Scripting.FileSystemObject
With .OpenTextFile(strFileName, 1, False, 0)
If Not .AtEndOfStream Then .SkipLine
Do Until .AtEndOfStream
//do something
Loop
End With
End With
Diesem funktioniert alles Super. Aber jetzt bin ich immer auf das Problem der Extraktion von Tabellen aus Textdateien.
Was ich versuche zu tun, ist VBA finden Sie einen string z.B. "Year' s Income", und dann die Ausgabe der Daten, nachdem Sie in Spalten. (Bis die Tabelle endet.)
Der erste Teil ist nicht sehr schwierig (finden Sie eine bestimmte Zeichenfolge), aber wie würde ich mich über den zweiten Teil. Die text-Datei sieht wie dieses Pastebin. Das problem ist, dass der text nicht standardisiert. So zum Beispiel einige Tabellen haben 3-Jahres-Spalten (2010 2011 2012) und manche nur zwei (oder 1), einige Tabellen haben mehrere Leerzeichen zwischen die verändert sich, und einige nicht bestimmte Zeilen (z.B. Anlagevermögen, Netto).
Dachte ich an sowas aber nicht sicher, wie man es in VBA.
- Finden Benutzer-definierten string. zB. "Tabelle 1: Jahre' Zurück."
-
ein. Nächsten Zeile finden Jahren; wenn es zwei, wir brauchen drei Spalten in der Ausgabe (Titel +, 2x Jahr), wenn es drei, die wir benötigen vier (Titel +, 3x im Jahr).. usw.
b. Erstellen Sie Titel-Spalte + Spalte für jedes Jahr. - Bei erreichen das Ende der Zeile, gehen Sie zur nächsten Zeile
-
ein. Text Lesen -> output-Spalte 1.
b. Erkennen Leerzeichen (Leerzeichen > 3?) als Anfang der Spalte 2. Zahlen Lesen -> Ausgabe in Spalte 2.
c. (wenn Spalte = 3) Erkennen von Leerzeichen als Beginn der Spalte 3. Zahlen Lesen -> Ausgabe in Spalte 3.
d.... (wenn Spalte = 4) zu Erkennen, Leerzeichen als Beginn der Spalte 4. Zahlen Lesen -> Ausgabe-Spalte 4. - Jeder Zeile an, loop 4.
- Nächste Zeile enthält keine zahlen - End-Tabelle. (wahrscheinlich die easiet nur ein Benutzer definiert Anzahl, nach 15 Zeichen keine Zahl? Ende der Tabelle)
Ich basierte meine erste version auf Pdf zu excel, aber online Lesen die Leute nicht empfehlen OpenFile
sondern FileSystemObject
(obwohl es scheint eine Menge langsamer).
Irgendwelche Hinweise zu bekommen, begann mich, vor allem bei Schritt 2?
Danke, aber ich durfte nicht mehr als 2 links. Vielen Dank für die änderungen!
Beispieltext erhalten aus der PDF-Datei sehr hilfreich!!!
Ich bezweifle, dass können Sie in der Regel parse-Tabellen basierend auf lediglich den text extrahieren. Sie mehr wahrscheinlich müssen einige Bibliotheken, die extrahiert text mit der Positionierung Informationen. Ihr Algorithmus sehr wahrscheinlich scheitern wird, im Falle von Tabellen mit einigen leeren Einträge und PDF-Dateien erstellt, die von einigen PDF-Erstellung Software.
InformationsquelleAutor MeRuud | 2013-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie eine Reihe von Möglichkeiten, um zu sezieren, eine text-Datei und je nachdem, wie Komplex es ist, werden Sie möglicherweise lehnen eine oder andere Weise. Ich habe diese und es kam ein wenig aus der hand... genießen.
Basierend auf der Probe, die Sie haben und die zusätzlichen Kommentare, bemerkte ich Folgendes. Einige von Ihnen funktionieren gut für einfache Dateien, aber kann man unhandlich mit größeren komplexeren Dateien. Darüber hinaus kann es etwas effizienter Methoden oder tricks zu dem, was ich hier verwendet habe, aber diese werden auf jeden Fall erhalten Sie eine erzielen das gewünschte Ergebnis. Hoffentlich macht das Sinn in Verbindung mit dem code:
InStr
auf der aktuellen Zeile zubestimmen Sie in einer Tabelle nach der Suche nach dem text 'Tabelle' und dann
sobald Sie wissen, dass Sie in das 'Table' - Abschnitt der Datei starten
Suche für das "Vermögen" § usw
Split
Funktion zusammen mit einer Schleife tundie job.
Datei Zeile haben immer ein dollar-Zeichen vor der zu Ihnen, dann
Sie weiß, dass dies definieren Sie die Spaltenbreite und Sie können diese auf
die folgenden Zeilen text.
Den folgenden code extrahieren wird das Vermögen der Informationen aus der text-Datei, Sie können die mod es zu extrahieren, die anderen Abschnitte. Es sollte in der Lage mehrere Zeilen. Hoffentlich habe ich kommentiert es ausreichend. Werfen Sie einen Blick und ich werde Sie Bearbeiten, wenn nötig zu helfen, weiter.
Ich denke, meine Zusammenstellung Fehler ist, da die .pdf-Datei sind zu groß. Aber Nein Abschnitt enthält mehr als 10 Zeilen, so dass nicht sicher, wie Sie es erreichen konnte, die 99 Grenze.
iNoColumns
scheint nicht zu behalten Ihre Nummer auch.. Aber wieder ich denke, das ist mehr wegen meiner Implementierung als alles andere.Froh, dass es hilft 🙂 die Probleme, Die Sie immer wie der
iColumns(1)
sind die kleinen Probleme wirst du verfeinern, wie Sie Lesen in mehreren Dateien. Es scheint, dass, wenniColumns
ist Redim würde für die neue Tabelle hat noch keine Spalten, soiColumns(1)
ausfällt. Sie würde wollen, um eine check-in für diese. Ich glaube nicht, dass es an der Größe Ihrer pdf-Datei, es sollte in der Lage sein zu handhaben 32767 Zeilen (Größe von Int). Ich würde auch empfehlen, dass Sie Ihre sub ein wenig. Ich würde split aus der sub, der liest in der text-Datei. Sie können dann konvertieren Sie ein paar PDF-Dateien und testen Sie die Ergebnisse separat.Danke für die zusätzlichen Kommentare und Anregungen. Ich benutzte die falsche template Datei oben (die text-Datei-Beispiel), aber die logischen macht viel mehr Sinn, jetzt, und ich sollte in der Lage sein zu leiten. Nochmals vielen Dank!
InformationsquelleAutor CuberChase
Kann ich nicht überprüfen Sie die sample-Daten als PasteBin wurde entfernt. Basierend auf dem, was ich auflesen kann aus der Beschreibung von dem problem, es scheint mir, dass mit Regulären Ausdrücken machen würde, der Analyse der Daten viel einfacher.
Fügen Sie einen Verweis auf die Scripting Runtime scrrun.dll für das FileSystemObject.
Fügen Sie einen Verweis auf die Microsoft VBScript Regular Expressions 5.5. Bibliothek für das RegExp-Objekt.
Instanziieren eines RegEx-Objekts mit
Dim objRE As New RegExp
Legen Sie die Pattern-Eigenschaft auf "" (\bd{4}\b){1,3}"
Die angegebenen Muster übereinstimmen sollten in Zeilen mit strings wie:
2010
2010 2011
2010 2011 2012
Die Anzahl der Leerzeichen zwischen dem Jahr strings ist irrelevant, solange es mindestens ein (da wir Sie nicht erwartet zu begegnen, sind Zeichenfolgen wie 201020112012 zum Beispiel)
Setzen Sie die Global-Eigenschaft auf True
Die aufgenommenen Gruppen wird in den einzelnen Match-Objekte aus der MatchCollection zurück durch die Execute-Methode der RegEx-Objekt objRE. So deklarieren Sie die entsprechenden Objekte:
Vorausgesetzt, Sie haben eine FileSystemObject-Objekt und Scannen den text-Datei, Lesen Sie jede Zeile in eine variable "strLine"
Erste test, um zu sehen, ob die aktuelle Zeile enthält das Muster gesucht:
Dies ist nur ein grober Umriss, wie ich den Ansatz dieser Herausforderung. Ich hoffe, es ist etwas in diesem code-Gliederung, dass wird Ihnen helfen.
InformationsquelleAutor Cyraneau de Beargerac