wuenscan
Goto Top

Daten aus PDF auslesen und per VBA in Excel schreiben

Hallo zusammen,

ich bin auf der Suche nach einer möglichen Lösung zum automatisierten Auslesen einer PDF-Datei in eine Excel-Datei auf dieses Forum gestoßen. Dabei habe ich mich bisher v.a. mit dem Austausch und der Lösung in diesem Thread beschäftigt. Da die PDF-Datei auf die sich dort bezogen wird aber leider nicht mehr online ist, fällt es mir schwer das Anliegen des damaligen Thread-Erstellers komplett nachzuvollziehen.

Im ersten Schritt würde mich interessieren, ob es wohl generell eine Möglichkeit gibt, bestimmte Daten automatisiert aus dieser PDF-Datei auszulesen und in eine Excel-Datei zu schreiben.

Daten, die ich gerne jeweils in eine Extra Spalte auslesen möchte sind
  • Name des Arztes
  • Fachgebiet
  • Straße
  • PLZ
  • Ort
  • Telefonnummer
unbenannt

Ich hoffe, ich konnte mein Problem/Vorhaben gut genug beschreiben. Bin gespannt, ob es hierfür eine Lösung geben kann oder ob dies aufgrund des Dokument-Aufbaus nicht möglich ist.

Schon mal danke für Eure Mühen, Viele Grüße
Andreas

Content-ID: 623065

Url: https://administrator.de/contentid/623065

Ausgedruckt am: 22.11.2024 um 08:11 Uhr

Fennek11
Fennek11 17.11.2020 um 15:52:34 Uhr
Goto Top
Hallo,

ohne Zusatz-Programme kann wohl nur O365 pro direkt PDF lesen.

Also entweder ein Versuch mit M$ Word oder einem externen Programm zuerst eine Umwandlung in txt

Mit xpdf-tools-win-4.02 konnte ich die PDF in txt wandeln, aber das Format ist etwas ungünstig. Hier im Forum kann ich keine Datei anfügen, bei Bedarf ginge es in http://www.office-loesung.de/p/viewforum.php?f=166

mfg
monstermania
monstermania 17.11.2020 aktualisiert um 16:19:03 Uhr
Goto Top
Zunächst mal muss sichergestellt sein, dass es sich um native PDF bzw. PDF mit einem (OCR)VT-layer handelt.
Wenn es sich um ein gescanntes PDF ohne Volltext handelt wird das Ganze etwas schwieriger.

Aus einem PDF läßt sich z.B. mit dem kostenlosen pdftk und dem darin entahltenenen Tool 'pdftotext.exe' der Volltext als Textdatei extraieren (https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/).
Die Textdatei kann man dann zeilenweise in vba einlesen und per Regular Expressions lassen sich dann die Werte/Informationen auslesen.
Das Ganze dann in etwas vba-Code und in Excel schreiben und fertig!
wuenscan
wuenscan 17.11.2020 um 16:54:46 Uhr
Goto Top
Zitat von @monstermania:

Zunächst mal muss sichergestellt sein, dass es sich um native PDF bzw. PDF mit einem (OCR)VT-layer handelt.
Wenn es sich um ein gescanntes PDF ohne Volltext handelt wird das Ganze etwas schwieriger.
Ist sichergestellt, s. PDF-Datei, die ich verlinkt habe


Aus einem PDF läßt sich z.B. mit dem kostenlosen pdftk und dem darin entahltenenen Tool 'pdftotext.exe' der Volltext als Textdatei extraieren (https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/).
Die Textdatei kann man dann zeilenweise in vba einlesen und per Regular Expressions lassen sich dann die Werte/Informationen auslesen.
Das Ganze dann in etwas vba-Code und in Excel schreiben und fertig!
Den Volltext konnte ich auch schon als Textdatei extrahieren. Jedoch weiß ich nicht, wie ich hier mit Regular Expressions weiterkommen kann (aufgrund des Aufbaus des PDF-Dokuments und der Daten die ich gerne rausziehen möchte) Hier wäre ich für etwas genauere Tipps sehr dankbar
Printe
Printe 17.11.2020 aktualisiert um 17:36:19 Uhr
Goto Top
Jedoch weiß ich nicht, wie ich hier mit Regular Expressions weiterkommen kann
Regular Expressions Tutorial

Mit Ansatz aus dem o. g. Thread und einem Basis-Regex den du als ersten Anhaltspunkt hernehmen könntest (o. Gewähr auf Vollständigkeit):
Sub PDF2Excel()
    Dim i As Integer
    Dim strCMDLine As String, strTXT As String
    Dim FSO As Object, objSFold As Object, objWks As Object, WSHShell As Object, file As Object, rngLastRow As Range
    Dim colPFiles As New Collection, colTFiles As New Collection, regex As Object
    
    ' Objects erstellen  
    Set WSHShell = CreateObject("WScript.Shell")  
    Set FSO = CreateObject("Scripting.FileSystemObject")  
    Set regex = CreateObject("vbscript.regexp")  
    
    ' Regex Options  
    regex.MultiLine = True: regex.Global = True: regex.IgnoreCase = True
    
    Set objSFold = FSO.GetFolder(ThisWorkbook.Path)
    
    strCMDLine = """D:\Download\pdftk\pdftotext.exe"" -raw -nopgbrk "  
        
    For Each file In objSFold.Files                                  ' alle Dateien einlesen  
        If Right(file.Path, 4) = ".pdf" Then colPFiles.Add file.Path  ' nur *.pdf  
    Next

    For i = 1 To colPFiles.Count
         WSHShell.Run strCMDLine & """" & colPFiles.Item(i) & """", 0, True  
    Next

    For Each file In objSFold.Files                                  ' wieder alles einlesen  
        If LCase(Right(file.Path, 4)) = ".txt" Then colTFiles.Add file.Path  ' nur *.txt  
    Next
    
    Set objWks = Worksheets(1)
    Set rngLastRow = objWks.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
    
    For i = 1 To colTFiles.Count
        strTXT = FSO.OpenTextFile(colTFiles.Item(i)).ReadAll
        ' Ärzte auslesen  
        regex.Pattern = "(^.+)[\r\n]*((^(Hausarzt|Fachärztin|Facharzt)[\r\n]+)?^(Facharzt|Fachärztin|Hausarzt) .*?)[\s\S]+?^(.*)[\r\n]+^(\d{5}) (.*)[\s\S]*?^Tel\.: (.*)"  
        Set matches = regex.Execute(strTXT)
        If matches.Count > 0 Then
            For Each m In matches
                rngLastRow.Cells(1, 1).Value = Trim(m.submatches(0)) ' Name des Arztes  
                rngLastRow.Cells(1, 2).Value = Trim(m.submatches(4)) ' Art des Arztes  
                rngLastRow.Cells(1, 3).Value = Trim(m.submatches(5)) ' Adresse  
                rngLastRow.Cells(1, 4).Value = Trim(m.submatches(6)) ' PLZ  
                rngLastRow.Cells(1, 5).Value = Trim(m.submatches(7)) ' Ort  
                rngLastRow.Cells(1, 6).Value = Trim(m.submatches(8)) ' Telefonnummer  
                Set rngLastRow = rngLastRow.Offset(1, 0)
            Next
        End If
        
        'Textdatei löschen  
        Kill colTFiles.Item(i)
    Next
    Set FSO = Nothing
    Set regex = Nothing
    Set WSHShell = Nothing
    Set objSFold = Nothing
End Sub
wuenscan
wuenscan 18.11.2020 um 11:50:06 Uhr
Goto Top
Hallo Printe,

vielen Dank für die Bereitstellung des Codes, welcher schon sehr gut funktioniert. Da ich bisher noch nie damit zu tun hatte, versuche ich aktuell so gut es geht alles nachzuvollziehen und habe mir dazu auch den RegexBuddy besorgt.

Einige Punkte, die ich noch nicht wirklich verstehe
  • Woran erkennt der Code genau, an welcher Stelle der Name des Arztes steht?
  • Wieso werden z.B. für den letzten Eintrag in der Liste keine Daten erkannt?
Dr. med. Birgit Wagner
Facharzt
Krankenhausstraße 1
84489 Burghausen
Tel.: 08677-880450
Zweigpraxis
Sprechzeiten:
Montag 08:00-10:00
Dienstag 08:00-10:00
Mittwoch 08:00-10:00
Donnerstag 08:00-10:00
Freitag 08:00-09:00

  • Wenn ich versuche die Details zur Art des Arztes mit auszulesen z.B. "Fachärztin für Allgemeinchirurgie" statt "Fachärztin" funktioniert dies nicht, wenn ich folgende Anpassung vornehme (^(Hausarzt|Fachärztin für Allgemeinchirurgie|Facharzt)[\r\n]+)? - warum nicht?

Wäre super wenn du mir noch ein paar Denkanstöße zur Selbsthilfe geben würdest.
wuenscan
wuenscan 19.11.2020 um 13:08:13 Uhr
Goto Top
Hallo zusammen,

ich habe mich weiter mit den RegEx beschäftigt und meinen Code mittlerweile folgendermaßen angepasst:

(^.+)[\r\n]*^((Hausarzt|Fachärztin|Facharzt|Psychologische\ Psychotherapeutin|Psychologischer\ Psychotherapeut|Kinder\-\ und\ Jugendlichenpsychotherapeut\b|Kinder\-\ und\ Jugendlichenpsychotherapeutin|Psychotherapeutisch).*)[\s\S]+?^(.+)[\r\n]+^(\d{5}) (.*)[\s\S]*?^Tel\.: (.*)

Mit den Ergebnissen bin ich nun schon fast zu 100% zufrieden. Zu einem Problem bräuchte ich aber bitte noch einmal eure Hilfe.

Die Daten können Generell zwei verschiedene Strukturen haben. Zeile 1, 2, 4, 5, 6 sind immer vorhanden, die Angaben in Zeile 3 nicht immer. Wenn die Angaben in Zeile 3 vorhanden sind, sollen diese auch ausgelesen werden, falls nicht, dann soll das ignoriert werden/leer bleiben. Wie kann ich das umsetzen?

Gerne nehme ich auch Vorschläge an, wie/ob ich den oben dargestellten Code verbessern kann.

1 Dr. med. Stefan Achatz
2 Hausarzt
3 Facharzt für Allgemeinmedizin
4 Miesbacher Straße 5
5 83737 Irschenberg
6 Tel.: 08062-1517

Vielen Dank für eure Hilfe.