{"id":55000868,"date":"2013-02-01T00:00:00","date_gmt":"2020-05-22T21:33:54","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=868"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"PDF_einlesen_am_Beispiel_eines_Kontoauszugs","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/","title":{"rendered":"PDF einlesen am Beispiel eines Kontoauszugs"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/ff06b34518b24932a2a40f23311f4a4f\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Alle Jahre wieder tritt der Fall auf, dass die Inhalte eines oder mehrerer PDF-Dokumente eingelesen werden sollen. Diesmal sind es die Kontoausz&uuml;ge: Ich habe es vers&auml;umt, die Buchungsdaten rechtzeitig und regelm&auml;&szlig;ig per Onlinebanking einzulesen. Da diese in der Regel nur f&uuml;r die vorherigen drei Monate abrufbar sind, stehe ich vor einem Problem. Das Abtippen der in gedruckter Form vorliegenden Ausz&uuml;ge ist selbstverst&auml;ndlich unter der W&uuml;rde eines Programmierers. Also habe ich mir die PDFs von der Bank zusenden lassen &#8211; immerhin ein Eingest&auml;ndnis.<\/b><\/p>\n<p>Lieber w&auml;re es mir nat&uuml;rlich gewesen, wenn die Bank mir die Daten in Form einer Excel-Datei h&auml;tte zukommen lassen, aber das ist aus technischen Gr&uuml;nden wohl nicht m&ouml;glich gewesen. Gut: PDF-Dokumente sind immerhin ein Kompromiss, denn mit ein wenig Fummelei lassen sich auch strukturiert vorliegende Daten auslesen.<\/p>\n<p>F&uuml;r die in diesem Beitrag beschriebenen Techniken wurde die aktuellste Version von <b>Adobe Reader <\/b>beziehungsweise <b>Adobe Acrobat <\/b>verwendet (Version <b>XI <\/b>beziehungsweise <b>11.0<\/b>).<\/p>\n<p>Eine Seite des Kontoauszuges, der eingelesen werden soll, sieht wie in <span class=\"verweis-ohneumbruch\">Bild 1 aus<\/span>. Er besteht aus mehreren Seiten, die immer die gleiche Struktur aufweisen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_01\/PDFEinlesen-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Dieser Kontoauszug soll eingelesen werden.<\/span><\/b><\/p>\n<p>Welche M&ouml;glichkeiten bietet der Adobe Reader, um die enthaltenen Texte einzulesen oder diese zumindest besser einlesbar zu machen<\/p>\n<p>Wenn Sie rechts auf <b>Werkzeuge<\/b> klicken, erscheinen einige Konvertierungsoptionen etwa nach Word oder Excel (s. Bild 2).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_01\/PDFEinlesen-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Adobe Reader macht Hoffnung auf eine Vereinfachung, aber &#8230;<\/span><\/b><\/p>\n<p>Allerdings handelt es sich hierbei um einen kostenpflichtigen Onlinedienst, wie Bild 3 zeigt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_01\/PDFEinlesen-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Einbinden der Bibliothek f&uuml;r den Zugriff auf den Acrobat Reader<\/span><\/b><\/p>\n<p>Die Kosten sind zwar &uuml;berschaubar, aber wir wissen nicht, wie das Resultat aussehen wird &#8211; und au&szlig;erdem m&uuml;ssen Sie hier gegebenenfalls sensible Daten wie Kontodaten auf den Adobe-Server laden. Das wollen wir nicht und pr&uuml;fen, welche M&ouml;glichkeiten es noch gibt.<\/p>\n<p><b>Copy and Paste<\/b><\/p>\n<p>Die zweite Variante ist es, die Inhalte seitenweise zu markieren, kopieren und etwa in ein Textdokument oder ein Textfeld einzuf&uuml;gen, um diese dann per VBA weiterzuverarbeiten.<\/p>\n<p>Diese M&ouml;glichkeit ist allerdings auch nur ein Zwischenschritt &#8211; Sie m&uuml;ssen immer noch die gew&uuml;nschten Informationen aus den Zeilen und Spalten ermitteln.<\/p>\n<p>Au&szlig;erdem ist Copy and Paste eine nette Sache, wenn es sich um eine begrenzte Anzahl von Operationen handelt &#8211; die Kontoausz&uuml;ge eines Jahres etwa m&ouml;chte ich pers&ouml;nlich nicht alle von Hand kopieren. Zumal auch die Fehleranf&auml;lligkeit mit wachsender Anzahl Vorg&auml;nge steigt.<\/p>\n<p><b>Zugriff per VBA<\/b><\/p>\n<p>Der <b>Acrobat Reader <\/b>liefert eine DLL mit, mit der Sie einige Aktionen ausf&uuml;hren k&ouml;nnen. Der Zugriff auf den Inhalt einer PDF-Datei geh&ouml;rt leider nicht dazu.<\/p>\n<p>Dazu ben&ouml;tigen Sie den kostenpflichtigen <b>Adobe Acrobat XI Pro<\/b>. Die Software kann allerdings kostenlos f&uuml;r 30 Tage getestet werden &#8211; wer die in diesem Artikel beschriebenen Techniken ausprobieren m&ouml;chte, kommt damit locker aus.<\/p>\n<p>Die Vorg&auml;ngerversionen lieferten jeweils eine Schnittstelle, die sich per VBA bedienen lie&szlig;. Auch unter <b>Acrobat Reader XI Pro <\/b>finden Sie im Verzeichnis <b>C:\\Program Files (x86)\\Adobe\\Acrobat 11.0\\Acrobat <\/b>die Datei <b>Acrobat.tlb <\/b>(s. Bild 4).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_01\/PDFEinlesen-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: &#8230; es handelt sich um eine kostenpflichtige Dienstleistung.<\/span><\/b><\/p>\n<p>Diese Datei k&ouml;nnen Sie &uuml;ber den <b>Durchsuchen<\/b>-Dialog als Verweis in das VBA-Projekt der entsprechenden Datenbankanwendung einbinden (s. Bild 5).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_01\/PDFEinlesen-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Diese Bibliothek liefert einige Funktionen f&uuml;r die Programmierung der Acrobat-Funktionen.<\/span><\/b><\/p>\n<p><b>Seitenzahl auslesen<\/b><\/p>\n<p>Mit der folgenden einfachen Prozedur lesen Sie dann ganz einfach beispielsweise die Seitenzahl eines PDF-Dokuments aus:<\/p>\n<pre>Public Sub Seitenzahl()\r\n    Dim objDocument As Acrobat.AcroPDDoc\r\n    Set objDocument = New Acrobat.AcroPDDoc\r\n    With objDocument\r\n        .Open CurrentProject.Path _\r\n            &amp; &quot;\\kontoauszuege.pdf&quot;\r\n        Debug.Print .GetNumPages\r\n    End With\r\nEnd Sub<\/pre>\n<p>Dazu deklarieren und erstellen Sie zun&auml;chst ein Objekt des Typs <b>AcroPDDoc<\/b>, welches auf ein noch zu ladendes Dokument verweist.<\/p>\n<p>Das Laden erledigen Sie mit der <b>Load<\/b>-Anweisung unter Angabe des Dateipfades. Schlie&szlig;lich liefert die Funktion <b>GetNumPages <\/b>die Seitenzahl (beim im Beispiel verwendeten Dokument waren es 284 Seiten &#8211; viel zu viele, um diese manuell zu durchforsten &#8230;).<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">PDF-Inhalt auslesen<\/p>\n<p>Den eigentlichen Inhalt lesen Sie mit der Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-63-anchor\">Listing 1<\/a><\/span> aus.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Ausgabe des Inhalts eines PDF-Dokuments im Direktfenster<\/p>\n<pre>Public Sub SeiteninhalteAusgeben()\r\n    Dim objDocument As Acrobat.AcroPDDoc\r\n    Dim objPage As Acrobat.AcroPDPage\r\n    Dim objSelect As Acrobat.AcroPDTextSelect\r\n    Dim objRect As Acrobat.AcroRect\r\n    Dim objPoint As Acrobat.AcroPoint\r\n    Dim lngNumText As Long\r\n    Dim i As Integer\r\n    Set objDocument = New Acrobat.AcroPDDoc\r\n    With objDocument\r\n        .Open CurrentProject.Path &amp; &quot;\\kontoauszuege.pdf&quot;\r\n        For i = 0 To .GetNumPages - 1\r\n             Set objPage = .AcquirePage(i)\r\n            Set objPoint = objPage.GetSize\r\n            Set objRect = New Acrobat.AcroRect\r\n            objRect.Left = 0\r\n            objRect.Top = objPoint.y\r\n            objRect.Right = objPoint.x\r\n            objRect.bottom = 0\r\n            Set objSelect = objDocument.CreateTextSelect(i, objRect)\r\n            Debug.Print vbCrLf &amp; &quot;*** Seite &quot; &amp; i\r\n            For lngNumText = 1 To objSelect.GetNumText\r\n                Debug.Print objSelect.GetText(lngNumText - 1);\r\n            Next lngNumText\r\n        Next i\r\n        .Close\r\n    End With\r\nEnd Sub<\/pre>\n<p>Diese Prozedur erzeugt zun&auml;chst ein neues Objekt des Typs <b>AcroPDDoc <\/b>und ruft die <b>Open<\/b>-Methode auf, um das Quelldokument zu &ouml;ffnen und zu referenzieren.<\/p>\n<p>Danach durchl&auml;uft es eine Schleife &uuml;ber alle Seiten von <b>0 <\/b>bis <b>.GetNumPages -1<\/b>. Die <b>AcquirePage<\/b>-Methode holt einen Verweis auf die jeweilige Seite.<\/p>\n<p>Interessant ist, dass wir die Inhalte gar nicht unmittelbar auf Basis dieses Objekts des Typs <b>AcroPDPage<\/b> ermitteln.<\/p>\n<p>Dieses dient nur dazu, ein Objekt des Typs <b>AcroPoint <\/b>zu f&uuml;llen. Dies wiederum geschieht mit der Methode <b>GetSize<\/b>.<\/p>\n<p>Das <b>AcroPoint<\/b>-Objekt stellt nun zwei Eigenschaften bereit &#8211; n&auml;mlich die H&ouml;he und die Breite der Seite (<b>x <\/b>und <b>y<\/b>).<\/p>\n<p>Diese Eigenschaften ben&ouml;tigen Sie, um den auszulesenden Bereich auf der jeweiligen Seite zu definieren. Diesen legen Sie mit den Eigenschaften <b>Left<\/b>, <b>Top<\/b>, <b>Right <\/b>und <b>Bottom <\/b>des <b>AcroRect<\/b>-Objekts fest.<\/p>\n<p>Dabei ist der Nullpunkt des Bereichs links unten, sodass die Werte <b>objPoint.x <\/b>und <b>objPoint.y <\/b>den Eigenschaften <b>Right <\/b>und <b>Top <\/b>zugewiesen werden.<\/p>\n<p>Damit ausgestattet k&ouml;nnen Sie mit der Eigenschaft <b>GetNumText <\/b>die Anzahl der Textelemente des markierten Bereichs ermitteln.<\/p>\n<p>Diese wiederum dient als Bereichsende beim Durchlaufen einer Schleife &uuml;ber alle Textelemente.<\/p>\n<p>Innerhalb dieser Schleife gibt die <b>Debug.Print<\/b>-Anweisung jeweils den mit der Funktion <b>GetText <\/b>und der Nummer des zu ermittelnden Textelements gefundenen Text aus.<\/p>\n<p>Der Text der eingangs abgebildeten Seite des Kontoauszugs sieht im Direktfenster beispielsweise wie in Bild 6 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_01\/PDFEinlesen-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Tabelle zum Speichern der ermittelten Daten<\/span><\/b><\/p>\n<p><b>Gew&uuml;nschte Informationen ermitteln<\/b><\/p>\n<p>Nun folgt noch die eigentliche Arbeit &#8211; das Ermitteln der Buchungss&auml;tze aus den Texten der Kontoausz&uuml;ge. Diese sollen in der Tabelle <b>tblBuchungen <\/b>landen, die wie in Bild 7 aussieht.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_01\/PDFEinlesen-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Ausgabe der Prozedur beim Ermitteln des PDF-Texts<\/span><\/b><\/p>\n<p>Um die Texte der Kontoausz&uuml;ge zu parsen, m&uuml;ssen Sie diese zun&auml;chst analysieren und Regeln aufstellen, wo die Prozedur die wichtigen Informationen findet.<\/p>\n<p>Eine einfache Regel lautet hier: immer dort, wo ein Datum in der Form <b>dd.mm<\/b>. zu Beginn der Zeile zu finden ist, beginnt ein neuer Buchungsdatensatz.<\/p>\n<p>Die oberen Zeilen des Auszugs wiederholen sich auf jeder Seite und haben eine feste Position. Eventuell kann man sich deren Untersuchung gleich sparen, indem man den Bereich mit dem <b>AcroRect<\/b>-Objekt entsprechend verkleinert. Dazu misst man entweder das Original-Dokument ab oder findet den richtigen Wert experimentell heraus. Im vorliegenden Fall soll nun nicht mehr das komplette Dokument untersucht werden (<b>y = 300<\/b>), sondern nur der untere Teil (<b>y = 250<\/b>). Dazu ersetzen Sie die Zeile<\/p>\n<pre>objRect.Top = objPoint.y<\/pre>\n<p><!--30percent--><\/p>\n<p>durch die folgende Zeile:<\/p>\n<pre>objRect.Top = 250<\/pre>\n<p>Damit f&auml;llt schon einmal der oberste, sich wiederholende Teil des Auszugs weg (s. Bild 8).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_01\/PDFEinlesen-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Entfernen von Bestandteilen der Texte und Aufteilen nach einzelnen Buchungen<\/span><\/b><\/p>\n<p>Danach k&uuml;mmern wir uns um die auf jeder ersten Seite eines einzelnen Kontoauszugs erscheinende Adresse (das PDF-Dokument enth&auml;lt mehrere davon). <\/p>\n<p><b>Beispieldatei<\/b><\/p>\n<p>Damit Sie die nachfolgenden Prozeduren selbst ausprobieren k&ouml;nnen, finden Sie in den Beispieldateien einen teilweise geschw&auml;rzten Auszug des verwendeten Kontoauszugs (s. Bild 9).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_01\/PDFEinlesen-web-images\/pic010.png\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Geschw&auml;rztes Beispieldokument<\/span><\/b><\/p>\n<p>Der Auszug enth&auml;lt zwei Monate, sodass auch der Monats&uuml;bergang beim Einlesen ber&uuml;cksichtigt werden kann.<\/p>\n<p><b>Einlesen des Dokumenttextes<\/b><\/p>\n<p>Das Eintragen der Buchungen in die Tabelle erfolgt in zwei Schritten. Die Funktion <b>InhaltErmitteln <\/b>soll den kompletten Text des Dokuments zeilenweise einlesen.<\/p>\n<p>Die Prozedur <b>InhaltAuswerten<\/b> ruft diese Funktion auf und verarbeitet die gelieferte Zeichenkette. Zun&auml;chst schauen wir uns jedoch die Funktion an, welche das PDF-Dokument einliest (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-70-anchor\">Listing 2<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 2: Text des Kontoauszuges ermitteln<\/p>\n<pre>Public Function InhaltErmitteln() As String\r\n    Dim objDocument As Acrobat.AcroPDDoc\r\n    Dim objPage As Acrobat.AcroPDPage\r\n    Dim objSelect As Acrobat.AcroPDTextSelect\r\n    Dim objRect As Acrobat.AcroRect\r\n    Dim objPoint As Acrobat.AcroPoint\r\n    Dim lngNumText As Long\r\n    Dim strSeite As String\r\n    Dim strDokument As String\r\n    Dim bolBuchung As Boolean\r\n    Dim strZeilen() As String\r\n    Dim intZeile As Integer\r\n    Dim i As Integer\r\n    Dim j As Integer\r\n    Set objDocument = New Acrobat.AcroPDDoc\r\n    With objDocument\r\n        .Open CurrentProject.Path &amp; &quot;\\kontoauszuege_entpersonalisiert.pdf&quot;\r\n        For i = 0 To .GetNumPages - 1\r\n            bolBuchung = False\r\n            strSeite = &quot;&quot;\r\n            Set objPage = .AcquirePage(i)\r\n            Set objPoint = objPage.GetSize\r\n            Set objRect = New Acrobat.AcroRect\r\n            objRect.Left = 30\r\n            objRect.Top = 250 ''objPoint.y\r\n            objRect.Right = objPoint.x\r\n            objRect.bottom = 0\r\n            Set objSelect = objDocument.CreateTextSelect(i, objRect)\r\n            For lngNumText = 1 To objSelect.GetNumText\r\n                strSeite = strSeite &amp; objSelect.GetText(lngNumText - 1)\r\n            Next lngNumText\r\n            strSeite = Replace(strSeite, &quot;Herr&quot; &amp; vbCrLf &amp; &quot;Andre Minhorst&quot; &amp; vbCrLf _\r\n                &amp; &quot;Borkhofer Str. 17&quot; &amp; vbCrLf &amp; &quot; 47137 Duisburg&quot;, &quot;&quot;)\r\n            If InStr(1, strSeite, &quot;Alter Kontostand Euro&quot;) &gt; 0 Then\r\n                strSeite = Mid(strSeite, 1, InStr(1, strSeite, &quot;Alter Kontostand Euro&quot;) - 1)\r\n            End If\r\n            strZeilen = Split(strSeite, vbCrLf)\r\n            For intZeile = LBound(strZeilen) To UBound(strZeilen)\r\n                If Left(strZeilen(intZeile), 7) Like &quot;[0-9][0-9].[0-9][0-9]. &quot; Then\r\n                    bolBuchung = True\r\n                End If\r\n            Next intZeile\r\n            If bolBuchung = True Then\r\n                strDokument = strDokument &amp; strSeite &amp; vbCrLf\r\n            End If\r\n        Next i\r\n        .Close\r\n    End With\r\n    InhaltErmitteln = strDokument\r\nEnd Function<\/pre>\n<p>Die Prozedur erzeugt zu Beginn ein Objekt des Typs <b>AcroPDDoc<\/b>, &uuml;ber welches das Dokument geladen und referenziert wird.<\/p>\n<p>Das Beispieldokument hei&szlig;t <b>kontoauszuege_entpersonalisiert.pdf<\/b>. Es sollte sich im gleichen Verzeichnis wie die Datenbank befinden, damit es mit<\/p>\n<pre>CurrentProject.Path _\r\n&amp; &quot;\\kontoauszuege_entpersonalisiert.pdf&quot;<\/pre>\n<p>ge&ouml;ffnet werden kann. Gleich im Anschluss beginnt die Prozedur mit dem Durchlaufen aller enthaltenen Seiten des Dokuments &#8211; dies geschieht wie bereits weiter oben beschrieben innerhalb einer <b>For&#8230;Next<\/b>-Schleife.<\/p>\n<p>Innerhalb der Schleife initialisiert die Prozedur die beiden Variablen <b>bolBuchung <\/b>und <b>strSeite<\/b>, die auf die Werte <b>False <\/b>beziehungsweise eine leere Zeichenkette eingestellt werden.<\/p>\n<p>Die Variable <b>objPage <\/b>wird durch die Funktion <b>AcquirePage <\/b>unter Angabe der Seitenzahl (beginnend bei <b>0<\/b>) mit der aktuell einzulesenden Seite gef&uuml;llt.<\/p>\n<p>Danach wird mit <b>GetSize <\/b>die Gr&ouml;&szlig;e der Seite ermittelt und in <b>objPoint <\/b>gespeichert. Dies dient dazu, den zu ber&uuml;cksichtigenden Bereich zu definieren.<\/p>\n<p>Die dazu n&ouml;tigen Koordinaten legen wir im Objekt <b>objRect <\/b>ab, wobei die Breite der Seitenbreite entspricht und die H&ouml;he &#8211; wie bereits besprochen &#8211; dem Bereich unterhalb des Dokumentkopfes (<b>250<\/b>).<\/p>\n<p>Die Methode <b>CreateTextSelect <\/b>liest den kompletten in diesem Bereich der aktuellen Seite enthaltenen Text ein. Eine weitere <b>For&#8230;Next<\/b>-Schleife durchl&auml;uft alle Text-Elemente und f&uuml;gt die mit <b>GetText <\/b>ermittelten Ausdr&uuml;cke zu einer langen Zeichenkette zusammen &#8211; diese landet in der Variablen <b>strSeite<\/b>.<\/p>\n<p>Die erste Seite eines Kontoauszugs enth&auml;lt unten links die Adresse des Kontoinhabers sowie eine Zahl (in diesem Beispiel lag diese immer zwischen 1 und 12 &#8211; siehe beispielsweise in Bild 10).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_01\/PDFEinlesen-web-images\/pic011.png\" alt=\"pic011.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Omin&ouml;se Zahl auf der Startseite eines jeden Auszugs<\/span><\/b><\/p>\n<p>W&auml;re diese Zahl nicht (manchmal fehlt diese auch), k&ouml;nnte man einfach die Adresse ersetzen.<\/p>\n<p>So m&uuml;sste man aber immer noch pr&uuml;fen, ob sich zu Beginn der letzten Adresszeile die Zahl befindet. Aber es geht auch einfacher: Wir wenden einfach den Trick von eben nochmals an, mit dem wir einfach einen nicht ben&ouml;tigten Teil des Dokuments nicht ausgelesen haben &#8211; nur, dass wir diesmal nicht den oberen, sondern den linken Rand ausklammern.<\/p>\n<p>Dazu stellte die Prozedur bereits ein paar Zeilen weiter oben die Eigenschaft <b>Left <\/b>des zu lesenden Bereichs auf <b>30 <\/b>ein.<\/p>\n<p>Die nun folgende Zeile ersetzt den kompletten Adressblock (Zeilenumbr&uuml;che werden durch <b>vbcrlf <\/b>abgebildet) durch eine leere Zeichenfolge.<\/p>\n<p><b>Kontostand entfernen<\/b><\/p>\n<p>Ebenfalls nicht eingelesen werden soll der Kontostand. Dieser wird immer auf der letzten Seite eines Kontoauszugs angezeigt, eingeleitet durch eine Zeile wie die folgende:<\/p>\n<pre>Alter Kontostand Euro 1.204,90 +<\/pre>\n<p>Sollte sich die Zeichenkette <b>Alter Kontostand Euro <\/b>also auf einer Seite befinden, schneidet die Prozedur den Text ab dieser Zeile ab.<\/p>\n<p>Schlie&szlig;lich kann es noch sein, dass hinter dem eigentlichen Kontoauszug noch eine Seite mit allgemeinen Informationen folgt &#8211; etwa der Hinweis, dass mal wieder irgendein TAN-Verfahren abgel&ouml;st wird.<\/p>\n<p>Auf dieser Seite befanden sich auf den untersuchten Ausz&uuml;gen regelm&auml;&szlig;ig keine Buchungen, sodass wir einfach nur pr&uuml;fen m&uuml;ssen, ob die Seite mindestens ein f&uuml;r einen Buchungssatz typisches Element enth&auml;lt. Eine Buchung startet immer mit einer Datumsangabe im Format <b>dd.mm.<\/b>, also brauchen wir nur danach zu suchen.<\/p>\n<p>Dazu teilen wir die einzelnen Zeilen des Textes auf die Elemente eines String-Arrays auf und durchlaufen danach alle Elemente dieses Arrays.<\/p>\n<p>Innerhalb der daf&uuml;r verwendeten <b>For&#8230;Next<\/b>-Schleife pr&uuml;ft die Prozedur, ob eine Zeichenkette der Form <b>[0-9][0-9].[0-9][0-9]. <\/b>in der aktuellen Zeile vorkommt. Falls ja, wird die Variable <b>bolBuchung <\/b>auf <b>True <\/b>eingestellt und die Schleife verlassen.<\/p>\n<p>Die folgende <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob <b>bolBuchung <\/b>den Wert <b>True <\/b>aufweist, und h&auml;ngt gegebenenfalls den Inhalt der aktuellen Seite an die Variable <b>strDokument <\/b>an, welche die Inhalte aller Seiten zusammenfasst.<\/p>\n<p>Nach dem Durchlaufen aller Seiten gibt die Funktion den Wert der Variablen <b>strDokument <\/b>an die aufrufende Prozedur zur&uuml;ck. <b>strDokument <\/b>enth&auml;lt zu diesem Zeitpunkt alle Buchungen des kompletten Dokuments.<\/p>\n<p><b>Auslesen der Buchungsdatens&auml;tze<\/b><\/p>\n<p>Diese aufrufende Prozedur hei&szlig;t <b>InhaltAuswerten<\/b> und ist in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-71-anchor\">Listing 3<\/a><\/span> zu finden. Die Prozedur l&ouml;scht zun&auml;chst alle Datens&auml;tze der Tabelle <b>tblBuchungen<\/b>.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Buchungsdatens&auml;tze aus dem Inhalt von Bankausz&uuml;gen ermitteln<\/p>\n<pre>Public Sub InhaltAuswerten()\r\n    Dim db As DAO.Database\r\n    Dim strInhalt As String\r\n    Dim strInhalte() As String\r\n    Dim lngInhalt As Long\r\n    Dim strBuchung As String\r\n    Dim datBuchung As Date\r\n    Dim strBetrag As String\r\n    Dim strVorzeichen As String\r\n    Set db = CurrentDb\r\n    db.Execute &quot;DELETE FROM tblBuchungen&quot;, dbFailOnError\r\n    strInhalt = InhaltErmitteln\r\n    strInhalte = Split(strInhalt, vbCrLf)\r\n    For lngInhalt = LBound(strInhalte) To UBound(strInhalte)\r\n         If Left(strInhalte(lngInhalt), 18) = &quot;Rechnungsabschluss&quot; Then\r\n        ElseIf Left(strInhalte(lngInhalt), 14) = &quot;Abschlusssaldo&quot; Then\r\n         Else\r\n            If Left(strInhalte(lngInhalt), 7) Like &quot;[0-9][0-9].[0-9][0-9]. &quot; Then\r\n                If Len(strBuchung) &gt; 0 Then\r\n                    datBuchung = CDate(Left(strBuchung, 6) &amp; &quot;2011&quot;)\r\n                    strBetrag = Left(strBuchung, InStr(1, strBuchung, vbCrLf) - 1)\r\n                    strVorzeichen = Right(Trim(strBetrag), 1)\r\n                    strBetrag = Trim(Left(strBetrag, Len(strBetrag) - 2))\r\n                    strBetrag = Mid(strBetrag, InStrRev(strBetrag, &quot; &quot;))\r\n                    strBetrag = Replace(strBetrag, &quot;.&quot;, &quot;&quot;)\r\n                    strBetrag = strVorzeichen &amp; Replace(strBetrag, &quot;,&quot;, &quot;.&quot;)\r\n                    db.Execute &quot;INSERT INTO tblBuchungen(Buchungsdatum, Betrag, Buchungstext) VALUES(&quot; _\r\n                        &amp; Format(datBuchung, &quot;\\#yyyy\\\/mm\\\/dd\\#&quot;) &amp; &quot;,&quot; &amp; strBetrag &amp; &quot;, ''&quot; _\r\n                        &amp; strBuchung &amp; &quot;'')&quot;, dbFailOnError\r\n                End If\r\n                strBuchung = &quot;&quot;\r\n            End If\r\n            strBuchung = strBuchung &amp; strInhalte(lngInhalt) &amp; vbCrLf\r\n        End If\r\n    Next lngInhalt\r\nEnd Sub<\/pre>\n<p>Danach verwendet sie die soeben vorgestellte Funktion <b>InhaltErmitteln<\/b>, um die Buchungstexte des Dokuments mit den Kontoausz&uuml;gen zu analysieren.<\/p>\n<p>Die folgende Anweisung verwendet die <b>Split<\/b>-Funktion, um die einzelnen Zeilen der Zeichenkette als neue Elemente eines String-Arrays anzulegen. Diese werden anschlie&szlig;end innerhalb einer <b>For&#8230;Next<\/b>-Schleife durchlaufen.<\/p>\n<p>Es gibt noch einen Ausnahmefall, in dem die enthaltenen Zeilen keine Buchungsdaten enthalten &#8211; und zwar dann, wenn ein Quartal um ist. In diesem Fall zeigt das Dokument beispielsweise die folgenden beiden Zeilen an:<\/p>\n<pre>Rechnungsabschluss -\r\nAbschlusssaldo per 31.03.11 Haben 4.461,29 Euro<\/pre>\n<p>Diese beiden Zeilen sollen durch den Einsatz einer geeigneten <b>If&#8230;Then<\/b>\/<b>ElseIf<\/b>-Bedingung umgangen werden. Erst im <b>Else<\/b>-Teil k&uuml;mmert sich die Prozedur um die tats&auml;chlichen Buchungsdatens&auml;tze.<\/p>\n<p>Ein solcher Buchungsdatensatz setzt sich nun aus mehreren Elementen des Arrays zusammen, die zusammengefasst etwa wie folgt aussehen:<\/p>\n<pre>23.03. 23.03. 0054 Gutschrift 29,90 +\r\nANDRE MINHORST\r\nRECHNR. 12121212-123\r\nKarl Klammer<\/pre>\n<p>Jedes Mal, wenn die Prozedur eine Zeile mit zwei Datumsangaben im Format <b>dd.mm. dd.mm <\/b>vorfindet, geht sie davon aus, dass ein neuer Buchungsdatensatz beginnt.<\/p>\n<p>In diesem Fall wird jeweils der vorherige (!) Buchungsdatensatz verarbeitet, denn erst wenn ein neuer Buchungsdatensatz erkannt wird, wurden alle Zeilen des vorherigen Buchungsdatensatzes eingelesen und k&ouml;nnen in das Feld <b>Buchungstext <\/b>der Tabelle <b>tblBuchungen <\/b>eingetragen werden (s. Bild 11). Beim ersten Buchungsdatensatz findet sich gleich die Ausnahme: Dieser beginnt zwar mit einem Datum, allerdings ist zu diesem Zeitpunkt die Variable <b>strBuchung <\/b>noch leer &#8211; was darauf hindeutet, dass zuvor noch keine Buchung eingelesen wurde.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_01\/PDFEinlesen-web-images\/pic012.png\" alt=\"pic012.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 11: Eingelesene Buchungen<\/span><\/b><\/p>\n<p>Deshalb wird in diesem Fall einfach nur die erste Zeile in die Variable <b>strBuchung <\/b>geschrieben &#8211; genau wie bei den folgenden Zeilen.<\/p>\n<p>Wenn die Prozedur dann auf die n&auml;chste Zeile mit einem Buchungsdatum st&ouml;&szlig;t, ist die vorherige Buchung komplett in der Variablen <b>strBuchung <\/b>enthalten und die Anweisungen in der innersten <b>If&#8230;Then<\/b>-Bedingung werden abgearbeitet.<\/p>\n<p>Sie speichert das Buchungsdatum (also die ersten sechs Zeichen im Format <b>dd.mm. <\/b>plus das Jahr, hier <b>2011<\/b>) in der Variablen <b>datBuchung<\/b>. Das Einlesen des Betrags ist etwas aufwendiger.<\/p>\n<p>Dieser landet zun&auml;chst in der Variablen <b>strBetrag <\/b>&#8211; und zwar in Form der kompletten ersten Zeile, die etwa so aussieht und die im ersten Schritt um den Zeilenumbruch (<b>vbCrLf<\/b>) erleichtert wird:<\/p>\n<pre>23.03. 23.03. 0054 Gutschrift 29,90 +<\/pre>\n<p>Im zweiten Schritt speichert die Prozedur das Vorzeichen am Ende der Zeile in der Variablen <b>strVorzeichen<\/b>.<\/p>\n<p>Dieses schneidet die Prozedur im folgenden Schritt ab, um schlie&szlig;lich nur noch den hintersten Teil der Zeile bis zum ersten Leerzeichen von hinten als neuen Wert der Variablen <b>strBetrag <\/b>festzulegen. Dieser lautet dann beispielsweise <b>29,90<\/b> oder <b>1.000,00<\/b>.<\/p>\n<p>Da die gleich folgende SQL-Aktionsabfrage nichts mit dem Punkt als Tausendertrennzeichen anfangen kann, wird dieser in der folgenden Anweisung elimiert, bevor zu guter Letzt das Komma als Dezimaltrennzeichen durch einen Punkt ersetzt und um das Vorzeichen erg&auml;nzt wird &#8211; der Wert von <b>strBetrag <\/b>lautet also nun etwa <b>+29.90 <\/b>oder <b>-1000.00<\/b>.<\/p>\n<p>Damit haben wir alle Informationen zusammen, die mit einer <b>INSERT INTO<\/b>-Anweisung in einen neuen Datensatz der Tabelle <b>tblBuchungen <\/b>landen sollen. Damit die Prozedur die gleichen Daten nicht nochmals verwendet, leert sie <b>strBuchungen <\/b>durch das Zuweisen einer leeren Zeichenfolge. Fertig &#8211; die Tabelle <b>tblBuchungen <\/b>sollte nach dem Ausf&uuml;hren der Prozedur, die je nach der Seitenzahl des Kontoauszugs auch einige Sekunden dauern kann, wie in Bild 10 gef&uuml;llt sein.<\/p>\n<p><b>Seiten des Dokuments bearbeiten<\/b><\/p>\n<p>Im Falle der Kontoausz&uuml;ge, die als Beispiel f&uuml;r diesen Beitrag herhalten, hat die Bank es etwas zu gut gemeint: Die kompletten Informationen hingen n&auml;mlich zwei Mal hintereinander, sodass der hintere Teil abgetrennt werden muss.<\/p>\n<p>So etwas k&ouml;nnen Sie leicht per VBA erledigen, wenn Sie die Acrobat Pro-Version installiert haben.<\/p>\n<p>Wie dies funktioniert, zeigt die Prozedur <b>SeitenEntfernen<\/b> aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-67-anchor\">Listing 4<\/a><\/span>. Die Prozedur &ouml;ffnet das Dokument, referenziert es mit der Objektvariablen <b>objDocument <\/b>und f&uuml;hrt dann die <b>DeletePages<\/b>-Methode aus. Diese erwartet als Parameter die erste und die letzte zu l&ouml;schende Seitenzahl. Ich wollte beispielsweise die Seiten 143 bis 284 des Dokuments l&ouml;schen, also die komplette zweite H&auml;lfte.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Seiten aus einem PDF-Dokument l&ouml;schen<\/p>\n<pre>Public Sub SeitenEntfernen()\r\n    Dim objDocument As Acrobat.AcroPDDoc\r\n    Set objDocument = New Acrobat.AcroPDDoc\r\n    With objDocument\r\n        .Open CurrentProject.Path &amp; &quot;\\kontoauszuege.pdf&quot;\r\n        If .DeletePages(142, 283) = True Then\r\n             .Save PDSaveFull, CurrentProject.Path &amp; &quot;\\kontoauszuege_gekuerzt.pdf&quot;\r\n        Else\r\n             MsgBox &quot;Fehlgeschlagen. Seitenindex beginnt bei 0!&quot;\r\n        End If\r\n        .Close\r\n    End With\r\nEnd Sub<\/pre>\n<p>Die Methode <b>DeletePages <\/b>liefert einen <b>Boolean<\/b>-Wert zur&uuml;ck, der angibt, ob diese erfolgreich ausgef&uuml;hrt wurde. Bei den ersten Versuchen gelang dies nicht &#8211; und wenn man nicht wei&szlig;, dass die Seitenzahlen im <b>AcroPDDoc<\/b>-Objekt mit <b>0 <\/b>beginnen, k&ouml;nnte man an einer einfachen Aufgabe wie dieser verzweifeln.<\/p>\n<p>Ich habe es intuitiv zun&auml;chst mit den beiden Werten <b>143 <\/b>und <b>284 <\/b>als erster und letzter zu l&ouml;schender Seite probiert, aber keinen Erfolg verzeichnen k&ouml;nnen. Schlie&szlig;lich lieferte ein Blick in die Dokumentation den Hinweis auf die 0-basierte Seitennummerierung. Mit den Seitennummern <b>142 <\/b>und <b>283 <\/b>l&ouml;schte die Prozedur schlie&szlig;lich die zweite H&auml;lfte des Dokuments.<\/p>\n<p>Nach erfolgtem L&ouml;schvorgang soll die Prozedur das Dokument noch unter einem neuen Namen speichern.<\/p>\n<p>Die <b>Save<\/b>-Methode erwartet zwei Parameter. Der erste enth&auml;lt ein Flag, das die Speichermethode definiert &#8211; wir haben hier <b>PDSaveFull <\/b>verwendet. Eine Liste der m&ouml;glichen Werte erhalten Sie am schnellsten &uuml;ber den Objektkatalog des VBA-Editors (s. Bild 12). Der zweite Parameter erwartet den Namen der zu speichernden Datei.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_01\/PDFEinlesen-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12: Konstanten f&uuml;r die Save-Methode des Dokuments<\/span><\/b><\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>kontoauszuege.pdf<\/p>\n<p>PDFEinlesen.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{0363CA15-1417-42CE-838B-F32D06E28A1A}\/aiu_868.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Alle Jahre wieder tritt der Fall auf, dass die Inhalte eines oder mehrerer PDF-Dokumente eingelesen werden sollen. Diesmal sind es die Kontoausz&uuml;ge: Ich habe es vers&auml;umt, die Buchungsdaten rechtzeitig und regelm&auml;&szlig;ig per Onlinebanking einzulesen. Da diese in der Regel nur f&uuml;r die vorherigen drei Monate abrufbar sind, stehe ich vor einem Problem. Das Abtippen der in gedruckter Form vorliegenden Ausz&uuml;ge ist selbstverst&auml;ndlich unter der W&uuml;rde eines Programmierers. Also habe ich mir die PDFs von der Bank zusenden lassen &#8211; immerhin ein Eingest&auml;ndnis.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012013,662013,44000026],"tags":[],"class_list":["post-55000868","post","type-post","status-publish","format-standard","hentry","category-66012013","category-662013","category-Interaktiv"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>PDF einlesen am Beispiel eines Kontoauszugs - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PDF einlesen am Beispiel eines Kontoauszugs\" \/>\n<meta property=\"og:description\" content=\"Alle Jahre wieder tritt der Fall auf, dass die Inhalte eines oder mehrerer PDF-Dokumente eingelesen werden sollen. Diesmal sind es die Kontoausz&uuml;ge: Ich habe es vers&auml;umt, die Buchungsdaten rechtzeitig und regelm&auml;&szlig;ig per Onlinebanking einzulesen. Da diese in der Regel nur f&uuml;r die vorherigen drei Monate abrufbar sind, stehe ich vor einem Problem. Das Abtippen der in gedruckter Form vorliegenden Ausz&uuml;ge ist selbstverst&auml;ndlich unter der W&uuml;rde eines Programmierers. Also habe ich mir die PDFs von der Bank zusenden lassen - immerhin ein Eingest&auml;ndnis.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:33:54+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/ff06b34518b24932a2a40f23311f4a4f\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"PDF einlesen am Beispiel eines Kontoauszugs\",\"datePublished\":\"2020-05-22T21:33:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/\"},\"wordCount\":2821,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/ff06b34518b24932a2a40f23311f4a4f\",\"articleSection\":[\"1\\\/2013\",\"2013\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/\",\"name\":\"PDF einlesen am Beispiel eines Kontoauszugs - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/ff06b34518b24932a2a40f23311f4a4f\",\"datePublished\":\"2020-05-22T21:33:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/ff06b34518b24932a2a40f23311f4a4f\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/ff06b34518b24932a2a40f23311f4a4f\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PDF einlesen am Beispiel eines Kontoauszugs\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PDF einlesen am Beispiel eines Kontoauszugs - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/","og_locale":"de_DE","og_type":"article","og_title":"PDF einlesen am Beispiel eines Kontoauszugs","og_description":"Alle Jahre wieder tritt der Fall auf, dass die Inhalte eines oder mehrerer PDF-Dokumente eingelesen werden sollen. Diesmal sind es die Kontoausz&uuml;ge: Ich habe es vers&auml;umt, die Buchungsdaten rechtzeitig und regelm&auml;&szlig;ig per Onlinebanking einzulesen. Da diese in der Regel nur f&uuml;r die vorherigen drei Monate abrufbar sind, stehe ich vor einem Problem. Das Abtippen der in gedruckter Form vorliegenden Ausz&uuml;ge ist selbstverst&auml;ndlich unter der W&uuml;rde eines Programmierers. Also habe ich mir die PDFs von der Bank zusenden lassen - immerhin ein Eingest&auml;ndnis.","og_url":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:33:54+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/ff06b34518b24932a2a40f23311f4a4f","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"PDF einlesen am Beispiel eines Kontoauszugs","datePublished":"2020-05-22T21:33:54+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/"},"wordCount":2821,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/ff06b34518b24932a2a40f23311f4a4f","articleSection":["1\/2013","2013","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/","url":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/","name":"PDF einlesen am Beispiel eines Kontoauszugs - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/ff06b34518b24932a2a40f23311f4a4f","datePublished":"2020-05-22T21:33:54+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/ff06b34518b24932a2a40f23311f4a4f","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/ff06b34518b24932a2a40f23311f4a4f"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/PDF_einlesen_am_Beispiel_eines_Kontoauszugs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"PDF einlesen am Beispiel eines Kontoauszugs"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000868"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000868\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}