11. Oktober 2025, 21:00
Lesezeit: ca. 5 Min

PDF-Formulare automatisiert einlesen

Das Portable Document Format (PDF)1 ist ein schönes Beispiel, wie ein ursprünglich geniales Konzept zur Anzeige von Print-Dokumenten im Verlauf der Jahrzehnte kaputt gemacht wurde. Als Nachfolger von Postscript2 angedacht, ist es zu einem universellen Containerformat verkommen. Texte, Bilder, Vektoren, Skripte, Schriften, Formulardaten, komplette 3D-Modelle: Es gibt kaum etwas, was nicht in einer PDF landen könnte, sogar das Computerspiel Doom.3

Pseudo-Standard PDF

Für die Praxis bedeutet das: Kaum eine PDF gleicht der anderen. Eine Information kann in drölfzig Arten verpackt werden, ganz abhängig davon, mit welchem Programm gearbeitet wird.4 Und wir sind noch nicht beim Thema Signaturen.5

Immerhin existieren ISO-Normen zur Langzeitarchivierung wie das PDF/A6. Das gibt wenigstens etwas Struktur und ist Referenz für alle Systeme und Viewer. So dass niemand gezwungen wird, Produkte von Adobe zu nutzen, dem Unternehmen hinter dem unsäglichen Acrobat-Viewer.7

Es mag verwirrend klingen: PDF ist das denkbar schlechteste Austauschfomat. Zugleich ist es aber auch das beste, weil es so universell und überall einsetzbar ist.

Ausfüllbare PDF-Formulare, aber bitte richtig!

Mir schicken Menschen immer wieder PDFs, die ich ausfüllen soll. Die wenigsten davon sind jedoch wirklich im Browser oder einem PDF-Viewer ausfüllbar. Soll ich tatsächlich alles ausdrucken, ausfüllen, einscannen und wieder zurücksenden? Oder mit der Maus frei im PDF rumzeichnen? Bei so was möchte ich laut schreien:

Erstellt ausfüllbare PDF-Formulare und nicht PDFs, die wie Formulare aussehen!

Eine mögliche Erklärung: Viele dieser “professionellen” Dokumente kommen aus Microsoft Office, das im Jahr 2025 noch immer keine ausfüllbare PDF-Formulare erstellen kann.8

Wer für seine Prozesse PDF-Formulare einsetzen will, möge bitte LibreOffice verwenden.9 Ich empfehle LibreOffice nicht, weil es besonders gut darin ist, sondern weil es eine verfügbare und vor allem funktionierende Lösung ist. Mit einigen Stolperfallen, die man kennen muss.

Die so erstellten PDF-Formulare können auf allen gängigen Systemen, Viewern und Browsern ausgefüllt und zurückgeschickt werden. Ganz ohne proprietärer Zusatzsoftware mit Abo-Modell und Vendor-Lock-In.10

Erstellen eines PDF-Formulars in LibreOffice, rechts das fertige PDF in einem BetrachterErstellen eines PDF-Formulars in LibreOffice, rechts das fertige PDF in einem Betrachter

PDF-Formulare und wie weiter?

Wie PDF-Formulare in LibreOffice erstellt werden, soll nicht Thema dieses Beitrags sein. Ich fokussiere mich auf die Frage, was anschließend passiert. Wenn die ausgefüllten Formulare sich in einem Ordner stapeln. Genau hier beginnt die eigentliche Magie und zugleich auch die tagtäglich erlebte Tragödie.

Statt die bereits strukturierten Formulardaten automatisiert weiterzuverarbeiten, passiert meist Folgendes: PDFs landen in verschachtelten (SMB-)Ordnerstrukturen, oder schlimmer, in Outlook-/Exchange-Postfächern. Für immer verloren. Ein Informationstransfer erfolgt wenn überhaupt, nur manuell.

Das ist in vielen Büros vermutlich der wahre Grund für Arbeitsplätze mit zwei Bildschirmen: Links eine PDF mit Inhalten, rechts das ERP-System, in das händisch die Informationen abgetippt werden. Oder es wird gleich die schön strukturierte PDF als unstrukturierter BLOB11 rüber geschoben. So richtig klassisch mit Heftklammer-Icon. Digitalisierung aus Absurdistan.

Extrahieren von Informationen aus PDF-Formularen

Nachfolgend beschreibe ich meinen eigenen Prozess, wie ich mit etwas Bash und freier Software Daten aus PDF-Formularen automatisiert weiter verarbeite. Wie immer ohne Anspruch auf Vollständigkeit und Allgemeingültigkeit: Your mileage may vary.

Die Abhängigkeitsliste für alle meine Technik-Stacks versuche ich kurz und überschaubar zu halten: pdfcpu,12 jq13 und curl.14 Während pdfcpu manuell aus seinem Git-Repo zu installieren ist, sind die beiden anderen in den Standard-Repos der verschiedenen GNU/Linux Distribution enthalten.

Links die Ansicht des ausgefüllten PDF-Formulars. Rechts das, was pdfcpu an Informationen aus den Formulardaten ziehtLinks die Ansicht des ausgefüllten PDF-Formulars. Rechts das, was pdfcpu an Informationen aus den Formulardaten zieht

Das kompakte pdfcpu Go-Binary extrahiert dabei PDF-Formulardaten in eine strukturierte JSON-Datei.15 Ein Zwischenformat, das anschliessend mit jq weiterverarbeitet wird. Zwei typische Szenarien:

Export in CSV-Datei

Das folgende Snippet zeigt, wie aus einer Menge von .json-Dateien in einem Verzeichnis eine CSV-Datei zur Weiterverarbeitung erzeugt wird. Die Namen der Formularfelder sind auf meine zuvor erstellte PDF abgestimmt. Der Einfachheit halber haben die ja/nein Antworten der verschiedenen Optionsfelder eine Nummer.

OUT_FILE="/exportfile.csv"

for f in *.json; do
  jq -r '
    (.forms[0] // {}) as $f
    | (($f.textfield // []) + ($f.datefield // []) + ($f.radiobuttongroup // []))
    | map({key:.name, value:(.value // "")}) | from_entries
    | [.Datum, .Firma, .Funktion, .Unterschrift, .Email, .Rufnummer,
       .["1"], .["2"], .["3"], .["4"], .["5"], .["6"], .["7"]]
    | @csv
  ' "$f" >> "$OUT_FILE"
done

Erschreckend oft bilden CSV-Dateien noch immer das einzige Datenaustauschformat zwischen Systemen. Oft in Kombination mit einer weiteren IT-Absurdität: Der Ablage auf SMB-Netzwerkfreigaben. Selbstverständlich quer über bewusst gezogene VLAN-Sicherheitszonen hinweg. Ein Albtraum für Operations und Informationssicherheit.

Zusammenwirken von pdfcpu und jq anhand eines PDF-FormularsZusammenwirken von pdfcpu und jq anhand eines PDF-Formulars

Senden an eine REST-API

Zeitgemäßer ist natürlich der Datenaustausch über eine REST-API.16 Wer für seine alten Anwendungen keine hat, kann sich mein REST-API Skeleton ansehen und es anpassen. Das hilft zumindest, die operativen Schmerzen rund um SMB-Shares und Security ein wenig zu lindern.17

Das folgende Snippet zeigt, wie mit jq die gesammelten Inhalte vieler PDF-Formulare in einem Verzeichnis abgerufen und mit curl an eine REST-API übermittelt werden:

API_URL="https://any-rest.api"
API_TOKEN="**SECURITY-TOKEN***"

for f in *.json; do
  PAYLOAD="$(jq -c '
    (.forms[0] // {}) as $f
    | (($f.textfield // []) + ($f.datefield // []) + ($f.radiobuttongroup // []))
    | map({key:.name, value:(.value // "")}) | from_entries
    | {
        datum:        .Datum,
        firma:        .Firma,
        funktion:     .Funktion,
        unterschrift: .Unterschrift,
        email:        .Email,
        rufnummer:    .Rufnummer,
        antworten: {
          "1": .["1"], "2": .["2"], "3": .["3"], "4": .["4"],
          "5": .["5"], "6": .["6"], "7": .["7"]
        },
      }
  ' "$f")"

  HTTP_CODE="$(
    curl -sS -o "$(mktemp /tmp/XXXXXX.json)" -w '%{HTTP_CODE}' \
      -X POST "$API_URL" \
      -H "Authorization: Bearer $API_TOKEN" \
      -H "Content-Type: application/json" \
      --data-raw "$PAYLOAD"
  )"

Fazit

Mit diesem Beitrag zeige ich, wie eine Weiterverarbeitung ausgefüllter PDF-Formulare ganz praktisch aussehen kann. Die Snippets skizzieren bewusst nur die grobe Richtung. Für einen produktiven Einsatz bedarf es natürlich noch etwas mehr an Details, die Copilot, ChatGPT & Co. nicht kennen.

Ich stehe da mit meinem Know-how gerne zur Verfügung und helfe überall dort, wo Digitalisierung nachhaltig, automatisiert und vor allem unabhängig von proprietären, kostenintensiven Lösungen sein soll.

Oder, um es provokanter zu sagen: Wer PDF-Formulare einsetzt ohne diese automatisiert weiter zu verarbeiten, betreibt aktive Digitalisierungsverhinderung.

In diesem Sinne,
Euer Tomas Jakobs

© 2025 Tomas Jakobs - Impressum und Datenschutzhinweis

Unterstütze diesen Blog - Spende einen Kaffee