VBA PDF auslesen

VBA - Visual Basic for Application

Mit VBA kann man sich sehr viele hilfreiche Makros schreiben, um Arbeitsprozesse innerhalb Microsoft Office zu automatisieren. Ein sehr sinnvolle und nutzvolle Funktion wären, wenn man  mittels VBA Werte aus eine PDF-Datei auslesen und in Excel oder Word übernehmen könnte. Dies würde mühsames abtippen oder händisches Kopieren aus der PDF in Excel oder Word vermeiden und viel Zeit sparen.

Vorbereitung: PDF in Textdatei wandeln

Um dies zu bewerkstelligen bedarf es ein wenig Vorbereitung. Wer die kostenpflichtige Version von Adobe Acrobat hat, der kann es direkt über die Library versuchen. Da die meisten aber nicht die kostenpflichte Version haben werden, nutzen wir ein Kommandozeilen-Tool, um die PDF-Datei in eine Textdatei zu konvertieren, um daraufhin die Textdatei auszulesen. Diese Arbeit übernimmt die pdftotext.exe von XpdfReader. Einfach die Tools herunterladen und die Exe (pdftotext) in einen beliebigen Ordner ablegen. Die Exe-Datei kann auch im selben Ordnerpfad liegen, wie die auszulesenden PDF-Dateien.

Das Auslesen der PDF soll am Beispiel einer Rechnung erfolgen. Nehmen wir an, wir haben die folgende Rechnung vorliegen und wollen daraus den Gesamtbetrag auslesen und in eine Excel-Datei schreiben.

Screenshot PDF-Datei aus welcher Werte automatisch ausgelesen werden sollen
beispielhafte PDF-Rechnung zum exportieren nach Excel

In diesem Beispiel haben wir die PDF und die pdftotext.exe im selben Verzeichnis abgelegt.

Screenshot Verzeichnis mit pdftotext.exe und PDF-Datei
Kommandozeilen-Tool und Beispiel-PDF

Damit wir später die Werte der PDF-Datei mit einem VBA-Makro richtig auslesen können, müssen wir erstmal verstehen, wie die Textdatei aussieht, die das Kommandozeilen-Tool erzeugt. Nur so ist es uns dann später möglich, die Textdatei richtig zu parsen. Dazu erzeugt man am besten erstmal manuell über die Eingabeaufforderung (cmd) die Textdatei. Wie das geht ist in  diesem Beitrag beschrieben. Dort lernt man auch gleich die Syntax kann, die wir nachher noch im VBA-Code benötigen. Die Textdatei wird automatisch im selben Verzeichnis und unter selbigen Namen gespeichert, in welchem auch die PDF-Datei abgelegt ist. Wenn also die PDF-Datei Rechnung.pdf heißt, dann heißt die Textdatei Rechnung.txt.

Für unser Beispiel sieht die erzeugte Textdatei folgendermaßen aus:

Screenshot PDF-Datei als Text auslesen und in Excel und Word einfügen
aus PDF extrahierter Text

Wenn man die Struktur der Textdatei kennt, kann man sich überlegen, wie man den Text am besten weiterverarbeitet und wie man an die gewünschte Information herankommt.

Hinweis: Das Tool pdftotext.exe ist keine Garantie dafür, dass es klappt oder alles richtig ausgelesen wird. Es kann PDF-Dateien geben, die sich nicht auslesen lassen, weil vielleicht die Schriftart nicht bekannt ist, die PDF verschlüsselt, kopiergeschützt oder ähnliches ist. Auch in diesem Beispiel fällt auf, dass zum Beispiel das Euro-Zeichen nicht exportiert worden ist.

VBA-Code

Wie sieht nun das VBA-Makro aus, um zum Beispiel den Gesamtpreis aus der Rechnung einzulesen. Folgende Vorgehensweise

  1. Auslesen des Textes aus der PDF und speichern in eine Textdatei
  2. Textdatei öffnen und den Text einer Variablen zuweisen
  3. Text parsen, am besten mit Regex, um gewünschte Werte zu ermitteln
  4. den gewünschten Wert in eine Excel-Zelle oder ins Word schreiben
  5. Textdatei wieder löschen
Sub ReadPDFFile()
    Dim WSHShell As Object
    Dim FSO As Object
    Dim regex As Object
    Dim strCommand, pdfFilePath, txtFilePath, strText, txt As String
    On Error GoTo ErrorHandling

    Set WSHShell = CreateObject("WScript.Shell")
    Set FSO = CreateObject("Scripting.FileSystemObject")

    'Verzeichnispfad zu PDF-Datei
    pdfFilePath = "c:\temp\Rechnung.pdf"

    'mit Kommandozeilen-Tool pdftotext.exe in eine Textdatei umwandeln
    strCommand = """c:\temp\pdftotext.exe"" -raw " & """" & pdfFilePath & """"
    WSHShell.Run strCommand, 0, True
    
    'Pfad der Textdatei bestimmen und Textdatei auslesen
    txtFilePath = Replace(pdfFilePath, ".pdf", ".txt")
    strText = FSO.OpenTextFile(txtFilePath).ReadAll
    
    'Text mit regex parsen
    Set regex = CreateObject("vbscript.regexp")
    regex.Pattern = "Gesamt:\s*\d*,\d{2}"
    Set match1 = regex.Execute(strText)
    If match1.Count > 0 Then
        txt = match1(0)
        txt = Replace(txt, "Gesamt:  ", "")
        'in Excel-Zelle einfügen
        Cells(3, 3).Value = txt
    End If
    
    'Textdatei nach getaner Arbeit wieder löschen
    Kill (txtFilePath)

    Set regex = Nothing
    Set WSHShell = Nothing
    Set FSO = Nothing
    
    Exit Sub
ErrorHandling:
        'Ein paar Bereinigungen durchführen, falls es zu einem Fehler kommt
        Kill (txtFilePath)
        Set regex = Nothing
        Set WSHShell = Nothing
        Set FSO = Nothing
End Sub

Mit diesem Code wird die PDF-Datei ausgelesen und der Gesamtbetrag der Rechnung in die Excel-Zelle C3 geschrieben.

Screenshot Datenexport von PDF nach Excel mittels VBA

Bestseller Nr. 1
Bestseller Nr. 2

4 Kommentare

  1. Hallo Zusammen, vielen Dank für das Beispiel. Wie würde der Code aussehen, wenn die gesamte PDF in Excel kopiert werden soll? Besten Dank und viele Grüße

    1. Hallo Lena, bei diesem Beispiel wird der Text der PDF komplett ausgelesen und in einer Textdatei zwischengespeichert. Danach wird der Text der Textdatei ausgelesen und in der Variabel strText zugewiesen. Dies steckt in der Zeile

      strText = FSO.OpenTextFile(txtFilePath).ReadAll

      Das heißt der komplette Text ist in strText enthalten und kann jetzt komplett in Excel, z.B. einer Zelle, eingefügt werden. Den Code-Absatz mit dem Regex parsen müsste man dann weglassen. Ob es dafür einen konkreten Anwendungsfall gibt? Der komplette Text ist unformatiert und dürfte erstmal nicht gut aussehen in Excel. Meistens möchte man ja konkrete Werte aus der PDF einer bestimmten Excel-Zelle zuweisen!? Hier helfen dann Regex-Ausdrücke oder irgendwelche Suchfunktionen, wie z.B. InStr.

      1. Hallo Daniel, Danke für deine Antwort. Ich würde gerne nur mehrere Spaltenden einer PDF-Datei mit VBA kopieren und so auch in Excel einfügen. Beispielsweise bei der Rechnung im Beispiel oben die Spalten Produkt und Preis. Diese Spalten sollten in Excel auch in zwei Spalten kopiert werden (Spalte A und B). Wie könnte man sowas mit einem Regex-Ausdruck erstellen?

        1. Hallo Lena, das lässt sich leider nicht pauschal beantworten. Es wird ja zuallererst die PDF-Datei in eine Textdatei gewandelt. Man muss sich dann erstmal genau den Aufbau der Textdatei anschauen und daraufhin den Regex-Ausdruck anpassen. Es ist also eine sehr individuelle Entwicklung des Scripts angepasst auf die jeweilige Rechnung. Die prinzipielle Vorgehensweise dafür ist eigentlich im Artikel beschrieben. Man muss es halt versuchen auf den eigenen Anwendungsfall zu übertragen. Und ich weiß, Regex-Ausdrücke, sind nicht gerade leicht zu durchschauen und es ist oftmal eine Bastelei bis man den richtigen Regex-Ausdruck hat. Im Einzelfall kann ggf. auch auf Regex verzichten und es versuchen mit VBA-Suchfunktionen, wie zum Beispiel InStr(), zum Durchsuchen eines Strings, zu bewältigen.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert