Mit freier Software erzeugte PDF-Formulare lassen sich mit dem freien Adobe Reader nicht abspeichern und deshalb auch nicht per E-Mail verschicken. Nur via HTTP klappt das Senden. Mit FDF-Befehlen sorgt der Server wie bei Webanwendungen für Benutzerfeedback.
Behörden, Vereine und Firmen stellen für Anträge, Anmeldungen oder Bestellungen immer häufiger Onlineformulare bereit. Das spart sowohl beim Versenden als auch bei der Auswertung Zeit und Mühe. Der Ablauf ausdrucken, frankieren und zur Post bringen gehört der Vergangenheit an und beim Empfänger laufen die Daten direkt in eine Datenbank.
Grafisch perfekt
HTML-Formulare, die übertragene Daten direkt in eine Datenbank spielen, sind schnell programmiert. Doch HTML setzt dem Layout Grenzen. So kennen die Tags für Textfelder zwar Größenangaben, die verschiedenen Browser sind sich jedoch nicht darüber einig, wie groß ein Feld in der Anzeige erscheint. Postleitzahlenfelder beispielsweise, deren grafische Gestaltung eine fünfstellige Eingabe andeutet, sind in Webformularen nicht befriedigend zu realisieren.
Als Standard für Dokumente, deren Anzeige anders als bei HTML unabhängig von Betriebssystem und Bildschirmauflösung stets gleich ausfällt, hat sich PDF etabliert. Adobe spendierte dem Austauschformat schließlich auch interaktive Elemente: PDFs dürfen vom Benutzer ausfüllbare Felder und Befehlsschaltflächen enthalten (siehe Abbildung 1). Der Adobe Reader kann die eingegebenen Daten per HTTP an einen Server weiterleiten.

Abbildung 1: PDF-Formulare bieten weit bessere grafische Gestaltungsmöglichkeiten als HTML-Forms. Der kostenlose Adobe Reader verweigert zwar das Speichern des ausgefüllten Formulars, kann die Daten jedoch über HTTP an einen Server schicken.
Recycling
Existieren bereits gedruckte Formblätter, lassen sich diese über die Printfunktion mit minimalem Aufwand in ein PDF umwandeln. Wer die Printformulare bereits kennt, findet sich schnell in der Onlineversion zurecht. Viele Stadtverwaltungen bieten solche PDF-Versionen der seit Langem benutzten Formulare zum Download an. Die meisten sind jedoch wenig komfortabel. Der Benutzer muss sie nach dem Ausfüllen ausdrucken und per Post weiterschicken. Da der Adobe Reader die Daten übers Internet verschicken kann, ist der Umweg über die Schneckenpost nur dann nötig, wenn die Daten zusammen mit der Unterschrift des Benutzers aus rechtlichen Gründen als Hardcopy vorliegen müssen.
Feedback
HTML-Seiten sind leicht dynamisch zu erzeugen, daher ist es bei HTML-basierten Webanwendungen ohne großen Aufwand möglich, den Benutzer mit Feedback zu versorgen. Nach dem Absenden meldet die Anwendung dem Benutzer, dass die Datenübertragung erfolgreich war oder dass er eines der Felder beim Ausfüllen vergessen hat.
Beim Einsatz von PDF-Formularen ist es schwieriger, dem Benutzer mitzuteilen, dass der Datenversand erfolgreich war. Zumindest die Linux-Version des Adobe Reader kann mit HTML nichts anfangen, egal ob sie als eigenständige Anwendung läuft oder als Plugin im Browser eingebunden ist.
Für diesen Zweck hat Adobe FDF entwickelt. Dabei handelt es sich um eine Steuerungssprache für den Reader, die Daten in Formularfelder schreibt oder neue PDF-Dokumente lädt. Ab Adobe Reader 6 gibt es mit XFDF eine übersichtliche XML-Variante.
Die Kombination aus dem Neuladen des Dokuments im Reader-Fenster und dem vom Server initiierten Ausfüllen der Formularfelder lässt sich für eine komfortable Benutzerführung nutzen. Das Flussdiagramm in Abbildung 2 zeigt, wie eine Onlineumfrage drei vorgefertigte PDF-Formulare einsetzt, um mit dem Anwender zu kommunizieren. Hat der Benutzer vollständige Daten verschickt, sieht er einen Screen, der ihn über den erfolgreichen Datenversand informiert (Abbildung 2) und die Daten zur Kontrolle noch einmal anzeigt. Der Button »Korgieren« öffnet erneut das Eingabeformular, dank XFDF mit den bisherigen Werten ausgefüllt.

Abbildung 2: Datenversand mit Feedback: Dank XFDF erzeugt der Adobe Reader nach dem Abschicken der Daten ein unterschiedlich gestaltetes Formular, je nachdem, ob die Daten vollständig waren oder nicht. Die XML-Sprache lädt auch bereits eingegebenen Text.
Hat der Anwender beim Ausfüllen ein Feld übersehen, lädt das Server-seitige Programm via XFDF eine Formularvariante, die dem Benutzer mitteilt, welche Daten noch fehlen (Abbildung 3). Listing 1 zeigt eine XFDF-Datei, die die PDF-Variante mit Warnmeldung wegen unausgefüllter Felder lädt. Sie füllt außerdem das Feld »Meldung« mit dynamisch erzeugtem Text, der leer gebliebene Formularfelder explizit anmahnt.

Abbildung 3: Hat der Benutzer ein Feld leer gelassen, erzeugt der Server einen Warntext, den er via XFDF in das gelbe Feld lädt.
Dynamisch
Zum Erstellen von PDF-Formularen bietet Adobe für Mac OS und Windows den etwa 650 Euro teuren PDF-Editor an. Unter Linux übernimmt dessen Aufgabe das freie Layoutprogramm Scribus. Die Desktop-Publishing-Software kombiniert grafische Elemente und Text zu einem Gesamtlayout. Sie versteht viele Grafikformate, unter anderem auch PDF. Die Exportfunktion für das Adobe-Austauschformat ist sehr ausgefeilt und beherrscht auch Formularelemente wie Textfelder, Kontrollkästchen, Listenfelder und Befehlsschaltflächen. Die Anwendung bietet daher alle nötigen Voraussetzungen für die in Abbildung 1 skizzierten interaktiven PDF-Formulare.
Doch gab sich Scribus im Test in einem Punkt unzuverlässig: In den Versionen 1.2.5 und 1.3.3.8 speicherte es das Schriftart-Attribut der Formularfelder nicht richtig. Die störendste Konsequenz war, dass sich in die Formularfelder keine Umlaute eingeben ließen [2].
FDF erlaubt es auch, Kommentare dynamisch zu bestehenden Dokumenten hinzufügen. Kommentarelemente sind frei im Dokument platzierbar [3]. Sie eignen sich daher hervorragend, um unausgefüllt gebliebene Felder zu kennzeichnen. Leider verweigert der PDF-Reader bei Dokumenten aus Scribus den nachträglichen Import von Kommentaren, selbst wenn das Kontrollkästchen zum Freischalten der entsprechenden Sicherheitseinstellung im Exportdialog gesetzt ist (Abbildungen 4a und b).

Abbildung 4a und 4b: Sollte funktionieren, tut es aber nicht: Scribus enthält eine Einstellung, um das dynamische Hinzufügen von Kommentaren freizuschalten. Dennoch verweigert der Adobe Reader dies bei sämtlichen mit dem freien Layoutprogramm erstellten PDFs mit einer Sicherheitswarnung.

Abbildung 4a und 4b: Sollte funktionieren, tut es aber nicht: Scribus enthält eine Einstellung, um das dynamische Hinzufügen von Kommentaren freizuschalten. Dennoch verweigert der Adobe Reader dies bei sämtlichen mit dem freien Layoutprogramm erstellten PDFs mit einer Sicherheitswarnung.
Als Ersatz für die elegante Lösung, zu einem statischen PDF-Dokument je nach Bedarf Kommentare mit Texten wie »Bitte füllen Sie das Feld “Adresse” aus« oder »Die übermittelten Daten sind vollständig« dynamisch hinzuzufügen, bleibt nur der Workaround, wie im vorgestellten Beispiel mehrere Formulare zu benutzen: Ein PDF mit der Meldung »Danke fürs Ausfüllen«, wenn die Daten vollständig waren, sowie ein PDF mit dem Read-only-Meldungsfeld: »Bitte folgende Felder ausfüllen: “Adresse”, “Name”«, für den Fall, dass der Benutzer Felder leer gelassen hat. Immerhin sorgt XFDF dafür, dass im Warnungsfeld ein angepasster Text steht.
Generator
Abbildung 5 zeigt ein Beispieldokument mit Formularfeldern vor einem mit dem Grafikprogramm Xaralx gestalteten Hintergrund. Das PDF-Werkzeug in Scribus fügt Schaltflächen, Textfelder, Kontrollkästchen sowie Kombinations- oder Listenfelder hinzu. Dies sind die gleichen Feldtypen, die es auch in HTML gibt. Ein Rechtsklick macht die Einstellungen der Felder unter dem Menüpunkt »PDF-Optionen« zugänglich. Für Formulare, deren Hintergrundgrafik die Felder bereits optisch andeutet, eignen sich am besten Felder mit transparentem Rand, die im PDF, solange sie leer sind, vollständig unsichtbar bleiben.

Abbildung 5: Scribus fügt dem im Grafikprogramm Xaralx gestalteten Formular interaktive Elemente wie ausfüllbare Felder und einen Absenden-Button hinzu.
Bei Textfeldern fehlt nach dem Aufziehen mit dem Feldwerkzeug nur noch eine Einstellung: Unter den »PDF-Optionen« erwartet Scribus einen Feldnamen. Um das Formular abschicken zu können, ist eine Befehlsschaltfläche erforderlich. Nach dem Einfügen wählt der Webprogrammierer hier unter »PDF-Optionen« im Reiter »Aktion« den Typ »Formular senden« aus. Unter »Sende an URL:« steht die Adresse für die PHP-Datei, die die Daten weiterverarbeitet. Im Beispiel ist dies die Datei »pdf/pdf.php« relativ zum Webroot. Für einen Test mit dem lokalen Webserver lautet die URL also »http://localhost/pdf/pdf.php«. Das Kontrollkästchen »Sende Daten als HTML« stellt sicher, dass der Adobe Reader die Formulardaten per POST über HTML verschickt. Die Daten eines Feldes stehen in PHP dann unter »$_POST[\’ Feldname\’]« zur Verfügung.
Server-Logik
Listing 1 zeigt ein PHP-Skript, das das Flussdiagramm von Abbildung 1 umsetzt. Zum Erzeugen des XFDF-Code nutzt es die GPL-lizenzierte XFDF-Funktion von Justin Koivisto [4]. Die Zeilen 25 bis 35 übertragen die vom Reader versandten Daten in das Array »$data«. Das einfache Beispielskript schreibt sie zeilenweise in eine Logdatei.
Die Übertragung in eine Datenbank ist leicht umzusetzen. Die »if … elseif … else«-Verzweigung erzeugt abhängig davon, ob es unausgefüllte Textfelder gibt, unterschiedlichen XFDF-Code. Hat der Benutzer ein Feld übersehen, erzeugen die Zeilen 37 bis 47 die Ausgabe von Listing 2. Das Feld »<f href=”http://localhost/pdf/umfrage_warn.pdf” />« in Zeile 30 der XML-Datei lädt die Formularvariante mit der Warnnachricht in den Reader. »<field name=”Meldung”>« in Zeile 25 zeigt dem Benutzer mit einer dynamisch geladenen Meldung, welche Felder noch auszufüllen sind.
Sind die abgesandten Daten vollständig, lädt der in den Zeilen 49 bis 52 von Listing 1 erzeugte XFDF-Code ein Formular, das die Daten in als read-only markierten Feldern zur Kontrolle noch einmal anzeigt, um versehentlichem Überschreiben vorzubeugen. Möchte der Anwender die Daten nun erneut editieren, bringt ihn ein Klick auf »ändern« wieder zum ersten Schritt, dem editierbaren PDF-Formular. XFDF füllt dabei die Formularfelder erneut aus.
Ein von der Webprogrammierung bekannter Trick verhindert, dass die Server-seitige Programmlogik nach dem »POST« der vollständigen Daten erneut zum Read-only-Formular verzweigt: Das PDF, das der Benutzer nach dem erfolgreichen Datenversand sieht, enthält ein verstecktes Feld »Flag«, das Zeile 56 mit dem Wert »true« gefüllt hat.
|
Listing 1: |
|---|
01 <?php
02 // XFDF-Generator von Justin Koivisto (GPL)
03 include('koivisto.php');
04
05 // Namen aller Formularfelder
06 $fields = array(
07 'Vorname'
08 ,'Nachname'
09 ,'Strasse'
10 ,'Nummer'
11 ,'Postleitzahl'
12 ,'Stadt'
13 ,'Shell'
14 );
15
16 // Logfile zum schreiben öffnen
17 $file = fopen('/tmp/umfrage.txt', 'a');
18 // Kopf mit Datum schreiben
19 fwrite($file, "===> ".date('d.m H:i')+"n");
20
21 $blank = '';
22 $data = '';
23
24 //POST-Felder lesen
25 foreach ($fields as $field){
26 $contend = $_POST[$field];
27 // Daten ins Logfile schreiben
28 fwrite($file, $contend +"n");
29 if ($contend ==''){
30 // wenn leer, fehlendes Feld notieren
31 $blank[] = $field;
32 }
33 // Daten für XFDF-Erzeugung speichern
34 $data[$field] = $contend;
35 }
36
37 if ($blank==true) { // unvollständig ausgefüllt
38 // Message mit fehlenden Feldern erzeugen
39 $message = 'Bitte füllen Sie folgende(s) Feld(er) noch aus: ';
40 foreach ($blank as $blankfield){
41 $message .= $blankfield . ", ";
42 }
43 // Message in das Feld 'Meldung" schreiben, Komma am Schluss entfernen
44 $data['Meldung'] = substr($message, 0, -2);
45 // XFDF für die Felder in $data erzeugen, PDF mit Warnung laden
46 $xfdf = createXFDF('http://localhost/pdf/umfrage_warn.pdf', $data);
47 }
48
49 elseif ($_POST['Flag']) {
50 // Flag gesetzt: von 'umfrage_ok.pdf' über "ändern" zurückgesandt
51 $xfdf = createXFDF('http://localhost/pdf/umfrage.pdf', $data);
52 }
53
54 else {
55 // Feld "Flag" setzen, um bei Klick auf "ändern" erneut 'umfrage.pdf' anzuzeigen
56 $data['Flag'] = true;
57 // XFDF für die Felder in $data erzeugen, PDF "Danke fürs ausfüllen"
58 $xfdf = createXFDF('http://localhost/pdf/umfrage_ok.pdf', $data);
59 }
60
61 // Mime-Type setzen
62 header('Content-type: application/vnd.adobe.xfdf');
63
64 // XFDF-Code erzeugen und ausgeben
65 echo $xfdf;
66
67 ?>
|
|
Listing 2: XFDF-Code |
|---|
01 <?xml version="1.0" encoding="UTF-8"?> 02 <xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve"> 03 <fields> 04 <field name="Vorname"> 05 <value>Hans</value> 06 </field> 07 <field name="Nachname"> 08 <value>Mustermann</value> 09 </field> 10 <field name="Strasse"> 11 <value>Teststraße</value> 12 </field> 13 <field name="Nummer"> 14 <value>123</value> 15 </field> 16 <field name="Postleitzahl"> 17 <value>12345</value> 18 </field> 19 <field name="Stadt"> 20 <value></value> 21 </field> 22 <field name="Shell"> 23 <value></value> 24 </field> 25 <field name="Meldung"> 26 <value>Bitte füllen Sie folgende(s) Feld(er) noch aus: Stadt</value> 27 </field> 28 </fields> 29 <ids original="922b3efbf9e49c81197a1ad5e4fc4c4a" modified="1188986062" /> 30 <f href="http://localhost/pdf/umfrage_warn.pdf" /> 31 </xfdf> |
Hallo, Welt!
Das PHP-Skript in Listing 1 ist in der vorliegenden Form noch nicht praxistauglich. Zu Testzwecken schreibt es unabhängig von der Vollständigkeitsprüfung jedes Mal einen Datensatz in die Logdatei, wenn der Benutzer das Formular abschickt. Die einfache Überprüfung auf leere Felder übernehmen, etwa bei der Postleitzahl, besser Plausibilitätschecks vom Typ Numerisch, 5-stellig.
Statt in eine Textdatei lassen sich die Daten mit PHP oder anderen Sprachen ebenso leicht in eine Datenbank schreiben. Das Beispielskript demonstriert jedoch, wie mit dem freien Programm Scribus erzeugte PDF-Formulare Hand in Hand mit Server-seitigen Skripten Daten abfragen, auf Plausibilität prüfen und dem Benutzer Feedback geben.
|
Infos |
|---|
|
[1] Clib-PDF-PHP-Erweiterung: [http://www.php.net/manual/de/ref.cpdf.php] [2] Scribus-Bug bei Umlauten in Formularfeldern: [http://bugs.scribus.net/view.php?id=5408] [3] Adobes XFDF-Spezifikation: [http://partners.adobe.com/public/developer/en/xml/xfdf_2.0_draft.pdf] [4] Justin Koivistos PHP-XFDF-Funktion: [http://koivi.com/fill-pdf-form-fields] |





