VBA PDF auslesen

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

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht.