PDF-Dateien auslesen mit Powershell

0
37

Wer sich von Euch mit Workflows im Büro oder im Kontext EDI beschäftigt, hat sich sicherlich bereits das ein oder andere Mal die Frage gestellt, ob es nicht eine einfache Möglichkeit gibt eine Vielzahl PDFs automatisiert auszulesen und zu verarbeiten.
Diese Möglichkeit gibt es!
Falls Ihr mit PowerShell bisher keine Berührungspunkte hattet, startet Ihr als Einstieg besser mit diesem Beitrag:
Einstieg Powershell

Im folgenden möchte ich Euch Step-by-Step näher bringen, wie ihr PDFs automatisiert auslesen, filtern und verarbeiten könnt. Ziel ist es eine Funktion in PowerShell zu haben, welche Ihr ganz einfach in Eure bestehenden Ideen oder Abläufe einbinden könnt.

Hierfür verwenden wir im folgenden iTextSharp. iTextSharp könnt ihr hier herunterladen:
iTextSharp Download

iTextSharp einbinden

Um iTextSharp nun innerhalb unseres PowerShell Scripts zu verwenden um PDFs automatisiert auszulesen müssen die es zunächst einbinden.
Dies geschieht so:

Nun stehen uns im weiteren Verlauf Objekte und Methoden hieraus zur Verfügung.

Reader initialisieren

Zunächst beginnen wir mit einem Reader, der uns die jeweilige Datei erst einmal lesend zur Verfügung stellt. Hier kommt es darauf an ob wir von einem Datei-Objekt oder einem Pfad ausgehen. Wenn wir also bspw. in der Variable $filepath den Pfad zur Datei stehen haben legen wir so los:

Im Prinzip haben wir hier eine Dopplung und innerhalb des Reader-Aufrufs könnten wir auch einfach $filepath verwenden, auf die hier gezeigte Weise haben wir allerdings noch die Möglichkeit $filepath mit einem Wildcard zu übergeben(Kunde1234*.pdf).

Seitenweiser Durchlauf der PDF

Nun empfiehlt es sich meines Erachtens die Datei seitenweise zu durchlaufen. Bevor wir die weiteren Schritte erarbeiten sollten wir uns auch Gedanken darüber machen wie unsere entsprechende Datei strukturiert ist. Also welche wiederkehrenden Zeilen wir auslesen möchten und auf welchen Seiten diese sich befinden. In unserem Beispiel durchlaufen wir immer die ersten beiden Seiten einer Datei.

Zeilenweise durchlaufen

Innerhalb des seitenweisen Durchlaufs lesen wir jetzt jeweils den Inhalt der aktuell zu verarbeitenden Seite zeilenweise in ein String-Array. Um das fehlerfrei tun zu können müssen wir das Zeichen kennen, welches als Zeilenumbruch verwendet wird. Hier liegt nicht unbedingt ein Carriage Return oder ein Newline vor, je nach Quelle der PDF-Datei und somit ihrem Aufbau kann das Zeilen-Trennzeichen unterschiedlich sein. In unserem Fall ist es der Character 0x000A.

Zeilen identifizieren

Die Zeilen prüfe wir mit einem regulären Ausdruck auf einen Match unserer Wahl.
Nehmen wir als Beispiel eine PDF-Datei welche immer an einer beliebigen Position die Zeile “Kunden-Nr.:<unterschiedlich viel Whitespace>123456” enthält.
Wir möchten also die 123456, bzw. in der Praxis natürlich echte Kundennummern auslesen.
Hierfür überprüfen wir zunächst ob die Zeile mit dem String “Kunden-Nr.:” beginnt und verwenden vorangestellt den Anker ^. Dann trennen wir die Zeile mit .split anhand unseres Trennzeichens “:” und wählen das zweile zurückgelieferte Element [1], woraufhin wir uns noch von überflüssigem Whitespace verabschieden mit -replace ‘\s’,”.
Anschließend steht in unserer Variable $Kundennummer lediglich die gewünschte 123456.

Somit haben wir unsere PDF-Datei ausgelesen und übrig bleibt nur den Reader zu schließen mit $reader.close().

Zusammenfassung

Das Ganze lässt sich nun sehr einfach in eine wieder verwendbare Subfunktion wrappen.
Hier stellt sich dann nur die Frage, was wir als Parameter verwenden möchten.
Wollen wir bspw. die Anzahl Seiten die zu prüfen sind beim Aufruf direkt mit angeben?
Den regulären Ausdruck anhand dessen die Zeile identifiziert werden soll?
Das Trennzeichen?
Den Dateinamen sowie den gewünschten Rückgabewert benötigen wir in jedem Fall.
Zusammengefasst könnte die Funktion zum automatisierten Auslesen einer Kundennummer aus einer PDF in PowerShell bspw. so aussehen:

Diese Technik zum automatisierten Auslesen von PDF-Dateien lässt sich recht einfach auf den jeweiligen Anwendungsfall adaptieren und spart je nach Büroumgebung oder Auftrag im EDI-Kontext viel händische Arbeit.

Hat Euch dieser Beitrag gefallen?
Lasst uns gerne Feedback, Ideen oder Kritik zukommen.
Gerne könnt Ihr diesen Beitrag auch teilen und uns einen Besuch auf einem unserer Social Media Kanäle abstatten und wenn Ihr möchtet ein Herzchen oder einen Daumen nach oben da lassen.

Wenn Ihr Euch für mehr PowerShell- oder iTextSharp-Content interessiert schreibt uns!

HINTERLASSEN SIE EINE ANTWORT

Bitte geben Sie Ihren Kommentar ein
Bitte geben Sie Ihren Namen ein