Zum Hauptinhalt springen Skip to page footer

PDF-Formulare erstellen

Formulare, die digital bleiben können, macht man vielleicht am besten mit HTML. HTML5 bietet jede Menge Möglichkeiten zur Datenprüfung und zu Eingabehilfen. Wo ein Ausdruck doch noch nötig ist (zum Beispiel für Stempel und Unterschrift), muss es eben PDF sein, weil ein PDF-Reader wohl als vorhanden vorausgesetzt werden kann. Ich möchte nicht verschweigen, dass es auch hybride Lösungen gibt. Wenn Sie ohnehin Typo3 am Laufen haben, erzeugen Sie ein Formular mit Powermail und nach dem Ausfüllen erhält die Anwenderin dank PowermailPdf ein PDF zum Ausdrucken. Etwas zusätzliche Dokumentation gibt es hier.

Man gelangt auf zwei Wegen zu einem PDF-Formular:

  • Die Software, mit der man ein Papierformular erstellt hätte, beherrscht auch Formularfelder, die nach PDF exportiert werden,
  • Felder werden nachträglich mit Adobe Acrobat Pro zugefügt.

Ein gutes Formular

  • lässt sich bequem sowohl von Hand wie auch am Computer ausfüllen,
  • bietet genug Erklärungen, um Missverständnisse zu vermeiden,
  • passt auf eine Seite.

Leider lassen sich alle drei Anforderungen nur schwer gemeinsam erfüllen.

Formulare mit Acrobat Pro

Acrobat Pro ist in vielen Fällen in der Lage, Formularfelder zu erraten, er legt sie dann selbstständig an. Vielleicht muss man ein Ankreuzfeld in ein Radiofeld ändern oder Felder ergänzen oder löschen. Prinzipiell ist das kein Problem. Das Ändern der Feldnamen ist obligat, weitere Nachbearbeitungen (Tooltips usw.) müssen auf jeden Fall vorgenommen werden. JavaScript lässt sich zufügen, falls gewünscht.

Wie wir alle wissen, sind digitale Dokumente nie endgültig fertig. Ein Formular wird also nicht nur einmal erstellt und so sollten möglichst wenige Schritte erforderlich sein, um Änderungen zu übernehmen, was eher gegen die Nachbearbeitung mit Acrobat Pro spricht. Um auf die Schnelle ein eingescanntes Papierformular aufzupeppen, ist Acrobat alternativlos. Und auch wenn man auf Software angewiesen ist, die keine PDF-Formular-Elemente exportieren kann (z.B. Microsoft Word), bleibt nur der Weg über Acrobat.

Office- und DTP-Software

Ich konnte mit folgenden Programmen PDF-Formulare erzeugen:

  • Adobe InDesign
  • LibreOffice
  • Scribus

Solange kein JavaScript im Formular benötigt wird, sind alle drei Programme geeignet. Wenn es darum geht, Listen- oder Combofelder zu befüllen, gibt es je nach Programm einiges zu beachten, Text- und Ankreuzfelder sind generell kein Problem. Letztlich können Sie die Auswahl nach Ihren persönlichen Vorliegen (und Ihrem Budget) treffen.

LibreOffice geht davon aus, dass Sie Formulare benutzen, um auf eine Datenbank zuzugreifen. Für den PDF-Export ist das nicht wirklich hilfreich, es steht aber einer Benutzung nicht wirklich im Wege. Bei Scribus gilt die dringende Empfehlung, die aktuellste Entwicklerversion zu verwenden, da die Formularunterstützung laufend ausgebaut wird.

TeX

PDFTeX unterstützt Formulare vollumfänglich. Es mangelt etwas an aktueller Dokumentation, aber die grundsätzliche Vorgehensweise wurde schon lange offengelegt. Für mich ist der besondere Charme dieses Vorgehens, dass ich mit einem einzigen Übersetzungsvorgang ohne Nachbearbeitungsschritte ein fertiges Formular erzeugen kann. Für mich nützlich waren

  • Hyperref Manual (Heiko Oberdiek et al.)
  • Formular Support in Hyperref (Dirk Krause)
  • JavaScript API-Referenzen der Firma Adobe

Stand Ende 2022 tut sich einiges bei der Implementation von PDF-Formularen für LaTeX3. Googeln Sie nach l3pdffield.

Tipps

Mehrseitige Formulare

Wenn mehrseitige Formulare gedruckt werden, muss die Zuordnung der Seiten erhalten bleiben. Es gibt eine einfache Möglichkeit: Ein Feld (etwa mit dem Namen des Antragstellers) wird auf jeder Seite wiederholt. Hat das Feld überall den selben Namen, wird es auch überall gleich befüllt. Hierfür braucht es kein JavaScript.

Daraus folgt auch: Wenn Ihnen auffällt, dass manche Formularelemente unbeabsichtigt synchronisiert werden (wie zwei Ankreuzfelder), sollten Sie sie verschieden nennen.

Radioknöpfe

Damit Radioknöpfe (runde Ankreuzfelder) tatsächlich abwechselnd geschaltet werden, müssen Sie zu einer Gruppe gehören. Auch hirfür brauchen Sie kein JavaScript, Sie müssen nur Gruppennamen setzen.

Den Medienbruch überwinden

In einem ausgedruckten Formular liegen Eingaben vor, die meist irgendwie digitalisiert werden müssen. Eintippen ist ein Anachronismus, Einscannen erzielt nur mäßge Erfolge. Welche weiteren Möglichkeiten gibt es?

  • Adobe bietet eine Möglichkeit, auf Formularen einen 2D-Barcode mit den Eingaben zu erzeugen, der dann eingescannt wird. Dies erfordert eine spezielle Lizenz.
  • Formulareingaben können auf Knopfdruck über das Internet übertragen werden. Dokumentation gibt es bei Adobe.
  • Beim indirekten Weg über PowermailPDF werden die Formulareingaben ohnehin auf dem Server gespeichert.

JavaScript in Formularen

Mit JavaScript können Sie unter anderem

  • Gültigkeitsprüfungen vornehmen
  • Ausfüllhilfen anbieten

Allerdings kann es passieren, dass ein übereifriger Virenschutz interaktive PDF-Formulare beim Benutzer sperrt, vor allem im Firmenumfeld. Das kann es erforderlich machen, eine zweite Formularversion ohne JavaScript anzubieten. JavaScript wird von den meisten Dokumentenbetrachtern unterstützt, insbesondere von

  • Adobe Acrobat (auch die kostenlose Version)
  • Firefox
  • Google Chrome

Damit steht einem Einsatz von JavaScript nicht viel im Wege. Spezialitäten wie das Script-gesteuerte Ausfüllen eines gesperrten Feldes muss man sich gegebenenfalls verkneifen, wenn man damit rechnen muss, dass JavaScript nicht unterstützt oder blockiert wird. Im Einzelfall gibt es kleinere Schwierigkeiten, die sich von Programm zur Programm unterscheiden.

Software-Unterstützung

Das Einbringen von JavaScript wird unterstützt von

  • Acrobat Pro
  • Scribus (ab Version 1.5.8)
  • TeX

LibreOffice bietet Skripte für Formulare in verschiedenen Sprachen an, auch JavaScript ist dabei. Allerdings sind diese Skripte für die Ausführung innerhalb von LibreOffice gedacht und nicht für den PDF-Export. Um JavaScript zu debuggen, führt kein Weg an Acrobat Pro vorbei.

Einsatzorte für JavaScript

Es wird unterschieden zwischen Document-Level und Formularelement-bezogenem JavaScript. Typischerweise stellen Sie allgemeine Funktionen auf Dokumentenebene zur Verfügung und rufen sie dann aus Eventhandlern einzelner Formularelemente auf. Betrachten wir ein Beispiel: Der Benutzer gibt Postleitzahl und Ort für mehrere Anschriften ein. Falls die Postleitzahl gängig ist, wird der Ort automatisch ausgefüllt. Das ergibt auf Dokumentenebene zwei Funktionen.

Document Level JavaScript

function getOrtFromPlz(plz)
{
    switch(plz){
    case 75172:
    case 75173:
    case 75175:
    case 75177:
    case 75179:
    case 75180:
    case 75181: return "Pforzheim"; break;
    case 75196: return "Remchingen"; break;
    case 75210: return "Keltern"; break;
    case 75217: return "Birkenfeld"; break;
    default: return ""; break;
    }
}
function setOrtFromPlz(plzfeld,ortsfeld)
{
    if(this.getField(ortsfeld).value > " ")
        return;
    this.getField(ortsfeld).value = getOrtFromPlz(this.getField(plzfeld).value);
}

Dann bleibt noch, die Funktion an das OnBlur-Ereignis (ObBlur wird aufgerufen, wenn das Feld den Fokus verliert) der PLZ-Felder zu binden. Nehmen wir an, das Feld, das verlassen wird, heißt PlzWohnung und das Feld mit dem Ort heißt OrtWohnung. Das ergibt dann sinngemäß folgenden Code: setOrtFromPlz("PlzWohnung ","OrtWohnung");

Kurze Erklärung: Der Ort wird nur verändert, wenn das Ortsfeld noch leer ist. Wir wollen keinen Ärger verursachen. Man könnte noch weiter prüfen, ob die PLZ tatsächlich aus fünf Ziffern besteht, und gegebenenfalls einen Hinweis ausgeben. Der Einfachheit halber ist dieser Code jedoch abgespeckt.

Umsetzung mit TeX

Ich zeige hier nur ein paar Schnipsel, die für den Anfang ausreichen sollten. Als konservativer Mensch habe ich PDFLaTeX verwendet, XeTeX funktioniert genauso, wenn die üblichen Anpassungen vorgenommen sind. In der Präambel werden zwei Pakete zwingend benötigt:

\usepackage{hyperref}
\usepackage{insdljs}
\begin{insDLJS}[test]{test}{JavaScript}
function get OrtFromPlz(plz)
...
\end{insDLJS}

Der Code auf Dokumentenebene wird gleich eingebunden. Und dann können Formularelemente benutzt werden.

Wichtig: Die Benutzung von german.sty oder entsprechenden Optionen von Babel verträgt sich nicht mit Anführungszeichen, auch dann nicht, wenn man auf OriginalTeX zurückschaltet. Ebenfalls wichtig: insdljs.sty ist Bestandteil des AcroTeX bundle. Beachten Sie gegebenenfalls dessen Lizenzierungsbestimmungen; auf CTAN gibt es AcroTeX zu den Bedingungen der LPPL.

Formularelemente sollten zur Gestaltung des Dokumentes passen. Die Hyperref-typischen roten Rahmen passen nicht immer. Ich habe mir daher eigene Definitionen gebastelt:

\newcommand{\textfeld}[2]{%
  \TextField[name=#1,width=#2,height=10pt,charsize=9pt,bordercolor={0.22 0.33 0.64},borderstyle=U]{\null}}
\newcommand{\auswahlmenue}[3]{ChoiceMenu[combo,name=#1,charsize=10pt,height=10pt,width=#2,%
  bordercolor={0.22 0.33 0.64},borderstyle=U]{\null}{#3}}
\newcommand{\ankreuzfeld}[3]{%\vrule width 0pt height 12pt depth 3pt%
  \CheckBox[name=#1,width=12pt,height=10pt,checkboxsymbol=\ding{51},%
  bordercolor={0.22 0.33 0.64},#2]{\null}{\quad #3}}

Kurz zu den Parametern: Der erste Parameter ist jeweils der Name, den das Feld im PDF bekommt - wichtig zum Zugriff per JavaScript. Zweiter Parameter ist die Breite, gegebenenfalls gefolgt von weiteren Optionen. Beim Auswahlmenü ist der dritte Parameter eine mit Kommas getrennte Liste der Optionen, beim Ankreuzfeld die Beschriftung.

Die Formularelemente müssen in eine Form-Umgebung eingeschlossen werden. Damit landet man etwa hier:

\begin{Form}[action={https://my-domain.net/receiveform.cgi}]
\textfeld{PlzWohnung}{1.5cm,onblur={setOrtFromPlz("PlzWohnung","wohnort");}} \quad\textfeld{OrtWohnung}{5.4cm}}
\auswahlmenue{geschlecht}{3.5cm}{männlich,weiblich,divers}
% und so weiter
\end{Form}

Ein einfaches Demo-Formular (Quelltext und PDF).