HTML und CSS | LaTeX | Formulare | Browsergames | allgemein

PDF-Formulare

In unserer Bürokratie wird für alles Formulare benutzt. Das handschriftliche Ausfüllen ist für den Nutzer nicht nur wegen der fehlenden Korrekturmöglichkeiten umständlich, es ist auch für den Empfänger des Formulars oft schwierig, alles fehlerfrei zu entziffern.
Elektronische Formulare dagegen können direkt am Computer ausgefüllt werden, außerdem können mögliche Eingabefehler direkt entdeckt oder verhindert werden, so dass das Formular am Ende korrekt ausgefüllt ist.

Vorteile des PDF-Formats

Der große Vorteil von Formularen im PDF-Format steckt eigentlich schon im Namen: PDF bedeutet portable document format (portables Dokumentenformat). Mit dem kostenlosen Adobe Reader kann solch ein Formular auf praktisch jedem Rechner geöffnet und bearbeitet werden, unabhängig vom Betriebssystem und sonstiger Software. Durch die Einbindung von Javascript in ein Formular kann man fehlerhafte Eingaben teilweise von vornerein unterbinden oder die Eingabe überprüfen (Wertebereich bei Zahlen, korrekte Syntax einer Mailadresse usw.). Für die Ausführung von Javascript im Formular ist kein weiteres Programm nötig.

Versenden von Formularen

Grundsätzlich gibt es drei Möglichkeiten, die Formulardaten zu versenden:

Setzen mit LaTeX

Ein Formular besteht nicht nur aus den auszufüllenden Feldern, sondern auch aus beschreibendem Text. Da dieser Text nicht einfach hingeschmiert werden kann, muss er so formatiert werden, dass das Formular einerseits angenehm zu lesen ist, andererseits muss der Nutzer das Formular auch verstehen.
Beides wird mit der Nutzung von LaTeX, einem Textsatz-"Programm", ermöglicht. Der Hauptvorteil von LaTeX ist die Unabhängigkeit der Textformatierung vom Textinhalt. Für Neulinge ist LaTeX vor allem deswegen ungewohnt, weil man nicht, wie in einem Textverarbeitungsprogramm, direkt sieht was man "schreibt", sondern den Text erst kompilieren muss, um das Ergebnis zu sehen. Jedoch ist LaTeX sehr mächtig (viele Möglichkeiten) und man kann Formatierungen auch hinterher noch einfach ändern, ohne den ganzen Text überarbeiten zu müssen.

Erstellen eines Formulars

Es gibt viele Wege, ein Formular im PDF-Format zu erstellen. Die meisten davon benötigen Produkte der Firma Adobe, Erfinder des PDF-Formats. Diese Produkte sind jedoch alle kostenpflichtig, da diese Firma damit logischerweise Geld verdienen will. Es gibt jedoch auch die Möglichkeit, ein PDF-Formular ohne kostenpflichtige Programme zu erstellen. Da ich Formulare bisher nur mit dieser Methode erstellt habe, kann ich keinen direkten Vergleich machen und nur entscheiden, ob etwas einfach oder kompliziert ist.

Benutzte Programme

Zur Erstellung der Formulare habe ich untenstehende Programme benutzt. Zur Kompilierung des LaTeX-Textes kann man jedoch auch andere Programme benutzen. Außerdem benötigt man noch das insDLJS-Paket (insert Document Level Java-Script) für LaTeX, welches man hier erhält (insdljs.dtx und insdljs.ins herunterladen, insdljs.ins im TeXnicCenter kompilieren, es wird dann das benötigte insdljs.sty erstellt) sowie das Paket hyperref.sty, das normalerweise in der Standardinstallation enthalten ist. Möglicherweise werden noch andere Pakete benötigt, dies sollte dann aber in der TeXnicCenter-Konsole angezeigt werden. Mit einem Suchprogramm kann man sie dann im Internet finden. Eines davon ist vermutlich everyshi.sty, das hier gefunden werden kann (erzeugen wie insdljs.sty, siehe oben).

LaTeX-Grundgerüst

LaTeX selbst ist eine Sprache wie HTML. Will man einen Text erstellen, so muss man zuerst einige Definitionen machen, die beim Kompilieren interpretiert werden. Einige Definitionen sind Manche Definitionen sind schon in der Standarddefinition enthalten, man muss sie also nur einfügen, wenn man sie ändern möchte. Da Formulare normalerweise nicht riesengroß sind, habe ich die Dokumentenklasse scrartcl verwendet. Sie wird für Artikel verwendet, die noch nicht die Größe eines Berichts haben. Diese Klasse ist eine Art Erweiterung der Klasse article mit typisch deutschen Standardeinstellungen (z.B. Seitengröße DIN A4).
Zuerst möchte ich ein kommentiertes Grundgerüst zeigen, das später erweitert wird (das Prozentzeichen leitet einen Kommentar ein). Dieses Grundgerüst ist nicht unbedingt ein Minimalbeispiel:

\documentclass[12pt,% Schriftgröße
a4paper,% Papiergröße (A4 ist eigentlich Standard bei scrartcl
footexclude, headexclude% Fuß- und Kopfzeile außerhalb des Textbereichs
]{scrartcl}% Dokumentenklasse Artikel, die das Koma-Skript benutzt

%\usepackage[Option]{Paketname} bindet ein Paket mit entsprechender Option ein
\usepackage[latin1]{inputenc}%stellt den europäischen Zeichensatz zur Verfügung
\usepackage[T1]{fontenc}%erlaubt die direkte Eingabe von deutschen Sonderzeichen
%weitere \usepackage[]{}
\usepackage[pdftex]{hyperref}%zur Erstellung von Links im PDF

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}% beginnt die Umgebung, in die man den Text schreibt
%%%%%%%%%%%%%%%%%%%% Ab hier kommt der Text
\begin{Form}
\title{NameDesTitels}% nur wenn benötigt
\author{NameDesAutors}
\date{\today}%\today schreibt immer das aktuelle Datum
\maketitle
\paragraph{Überschrift 1.˜Ordnung}
Etwas Einleitungstext

neuer Absatz
\subparagraph{Überschrift 2.˜Ordnung}
Noch mehr Text.\\% erzwungener Zeilenumbruch
Und noch mehr. % Eine Leerzeile erzeugt einen neuen Absatz

\TextField[width=1cm,name=summemieteundkaution,bordercolor=0 0 0]{Beschreibungstext}
Das ist der neue Absatz. Und jetzt kommt noch etwas Fülltext, den ich einfach so hinschreibe. Das schreibe ich alles mit \LaTeX .\\
Bis jetzt ist es noch kein Formular mit Funktionen, es ist auch noch kein Javascript integriert.
\TextField[width=1cm,bordercolor=0 0 0]{test}
{\renewcommand\LayoutTextField[2]{\leavevmode#2}% \leavevmode sorgt dafür, dass aus dem vertikalen Modus (Anordnung der Absätze usw.) in den horizontalen Modus gewechselt wird. Schreibt man einen Text, dann passiert das automatisch, jedoch nicht unbedingt bei Befehlen.

sdafs \TextField[width=1cm,bordercolor=0 0 0]{Feldname}% da hier ein Text davorsteht, wäre \leavevmode nicht notwendig.
}

Die Textfelder werden vom Paket \emph{hyperref} zur Verfügung gestellt.
\end{Form}
%%%%%%%%%%%%%%%%%%%%% Textende
\end{document}% beendet die Textumgebung
Beispiel als .tex und Ergebnis als PDF

Dieses Grundgerüst kann kompiliert werden, es enthält jedoch nur Text. Als nächstes soll ein Textfeld erstellt werden. Dazu muss direkt innerhalb der document-Umgebung die Form-Umgebung erstellt werden (mit \begin{Form} und \end{Form}), darin kann dann mit \TextField[Optionen]{Beschreibungstext} das Textfeld erstellt werden. Die Optionen sowie eine kommentierte Beispielsanwendung sind hier sehr gut erklärt, darauf werde ich nicht weiter eingehen. In diesem Beispiel wird schon Javascript verwendet, wofür man nach dem Paket hyperref noch \usepackage[pdftex]{insdljs}einfügen muss. Anmerkung: wird bei einem Textfeld kein Name verwendet (Option name=einName), dann wird der Beschreibungstext als Name genommen. Das ist vor allem bei der programmatischen Erstellung von Textfeldern praktisch, da man die Optionen leider nicht als LaTeX-Befehl setzen kann. Weitere Optionen gibt es auch hier.
Danach kann man zwischen die Zeilen \begin{insDLJS}{myform}{Meine Definitionen} und \end{insDLJS} die Javascript-Funktionen einfügen.
Eine kurze Erklärung zu AFNumber_Format(nDec,sepStyle, negStyle, unused, currencySymbol, currencySymbol_InFront):

Funktionen, die beim Öffnen des Dokumentes aufgerufen werden sollen, werden zwischen den runden Klammern in der folgenden Zeile, die direkt vor \begin{document} steht, eingefügt:
\OpenAction{/S /JavaScript /JS ()}
Die Befehle müssen (wie in Javascript üblich) mit ; getrennt werden, nach dem letzten Befehl sollte auch ein ; stehen. Als funktionsfähiges Beispiel ein Formular, bei dem etwas gerechnet wird:
\documentclass[12pt,% Schriftgröße
a4paper,% Papiergröße (A4 ist eigentlich Standard bei scrartcl
footexclude, headexclude% Fuß- und Kopfzeile außerhalb des Textbereichs
]{scrartcl}% Dokumentenklasse Artikel, die das Koma-Skript benutzt

%\usepackage[Option]{Paketname} bindet ein Paket mit entsprechender Option ein
\usepackage[latin1]{inputenc}%stellt den europäischen Zeichensatz zur Verfügung, dadurch werden Umlaute erst möglich
\usepackage[T1]{fontenc}%erlaubt die direkte Eingabe von deutschen Sonderzeichen
\usepackage[ngerman]{babel}% neue deutsche Rechtschreibung zur Silbentrennung verwenden
%weitere \usepackage[]{}
\usepackage[pdftex]{hyperref}%zur Erstellung von Links im PDF
\usepackage[pdftex]{insdljs}% Einbindung von Javascript ins PDF


\begin{insDLJS}[]{JSDateiname}{irgendeinTitel} % Inhalt der Umgebung wird in JSDateiname.djs gespeichert und steht im PDF zur Verfügung
function initialisiereFelder() {% Übergabeparameter in den runden Klammern, Funktion in geschweiften
readOnlyFields = new Array("Ergebnis1","Ergebnis2","Endergebnis"); % diese Felder sollen schreibgeschützt werden
for (i=0; i<readOnlyFields.length; i++) {% for-Schleife von 0 bis eins kleiner als Arraylänge
this.getField(readOnlyFields[i]).readonly = true;% setze Feldeigenschaft schreibgeschützt auf wahr
}% Ende der Schleife
}

function berechne(){% führe die Berechnung durch
var ergebnis1 = AFMakeNumber(this.getField("Wert11").value) * AFMakeNumber(this.getField("Wert12").value);
this.getField("Ergebnis1").value = ergebnis1;
var ergebnis2 = AFMakeNumber(this.getField("Wert21").value) * 5;
this.getField("Ergebnis2").value = ergebnis2;
this.getField("Endergebnis").value = ergebnis1 + ergebnis2;
}
\end{insDLJS}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\OpenAction{/S /JavaScript /JS (initialisiereFelder();)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}% beginnt die Umgebung, in die man den Text schreibt
%%%%%%%%%%%%%%%%%%%% Ab hier kommt der Text
\begin{tabular}{lccr}%erstelle Tabelle
\TextField[width=2cm, onblur={berechne()}]{Wert11} & multipliziert mit &\TextField[width=2cm, onblur={berechne()}]{Wert12}& ergibt \TextField[width=2cm]{Ergebnis1}\\
\TextField[width=2cm, onblur={berechne()}]{Wert21}& multipliziert mit & 5&ergibt \TextField[width=2cm]{Ergebnis2}\\
\hline
\multicolumn{3}{r}{Summe}&\TextField[width=2cm]{Endergebnis}\\
\end{tabular}
%%%%%%%%%%%%%%%%%%%%% Textende
\end{document}% beendet die Textumgebung
Beispiel als .tex und Ergebnis als PDF.

Syntax für die insDLJS-Umgebung [frei übersetzter Auszug aus insdljs.pdf, Kapitel 4.4 (The insDLJS Environments)]:
\begin{insDLJS}[<function>]{<base_name>}{<script_name>}
<JavaScript-Funktionen und Code>
...
...
\end{insDLJS}

<function>: Optionaler Parameter, der für dvipsone und dvips erforderlich ist (wird ansonsten ignoriert). Sein Wert muss der Name einer der innerhalb der Umgebung definierten Funktionen sein, damit Acrobat erkennen kann, ob DLJS schon geladen wurde.
<base_name>: Ein alphabetisches Wort ohne Leerzeichen und mit maximal 8 Buchstaben. Wird benutzt, um die Namen von Hilfsdateien und von der Umgebung benutzte Makros zu erstellen.
<script_name>: Dieser Titel erscheint im Document-level JavaScript Dialog von Acrobat.

Kommentare

LaTeX hat genauso seine Kommentare wie JavaScript. Da der Text zuerst von LaTeX interpretiert wird, gehen diese Kommentare vor. Alles ab dem LaTeX-Kommentar-Einleitungszeichen "%" wird sozusagen abgeschnitten, taucht also nicht mehr im Dokument auf, auch nicht im JavaScript-Teil. Ein für JavaScript benötigtes "%" muss entsprechend geschrieben werden, "\%", damit es nicht als Kommentarbeginn interpretiert wird.
Ein JavaScript-Kommentar bis zum Zeilenende wird mit "//" eingeleitet, ein mehrzeiliger Kommentar muss zwischen "/*" und "*/" stehen. Dieser Kommentar wird in den JavaScript-Teil des PDFs übertragen, aber nicht von JavaScript interpretiert.
Beispiel:
\begin{insDLJS}[test]{dateinam}{Beispiel}
var text = "Dieser Text erscheint in der Meldung"; //JavaScript-Kommentar: Diese Variable ist in allen Funktionen gültig
function test() {% LaTeX-Kommentar: Eine einfache Testfunktion. Dieser Kommentar taucht im JavaScript des PDF nicht auf
var text2 = "Zweiter Text.";
/* Dies ist ein mehrzeiliger Kommentar, der im JavaScript des PDF noch da ist.
Variablen innerhalb einer Funktion sind für andere Funktionen unsichtbar. */
app.alert(text,3);
/* app.alert(text,i)
i = 0: Fehlermeldung (rotes Kreuz); gleicher Effekt wie app.alert(text)
i = 1: Achtung (Ausrufungszeichen in gelbem Dreieck)
i = 2: Frage (Fragezeichen in Sprechblase)
i = 3: Information (kleines i in Sprechblase)
i > 3: nichts (kein Symbol)
*/
}
\end{insDLJS}


Links

Klaus Höppner: PDF zum Ausfüllen -- PDF-Formulare erstellen mit pdflatex und hyperref
JavaScript-FAQ
 © Christian Weiß Impressum
Stand Hauptseite: Wednesday, 01. June 2011, 21:17:23 Uhr CEST
Stand Hauptnavigation: Wednesday, 01. June 2011, 21:17:23 Uhr CEST
Stand Unternavigation: Wednesday, 01. June 2011, 21:16:58 Uhr CEST
Stand Inhaltsseite: Wednesday, 01. June 2011, 21:16:59 Uhr CEST
Valid HTML 4.01 Transitional CSS ist valide!