Seit der Verbreitung des Internets besteht großes Interesse, PDF-Dokumente online zu erstellen. Unter anderem hat [2] gezeigt, wie das geht. Doch auch dort hat es sich gezeigt, dass gerade das exakte Layout sehr mühsam ist. Einfacher ist es da schon, für das Design ein Programm zu nehmen, dass das auch kann: Entweder eine Satz-Software oder eine Textverarbeitung. Doch dann ist es nicht mehr möglich, eigene Informationen und Daten zu integrieren.
Mit ein wenig Aufwand lässt sich das natürlich per Makro ein wenig automatisieren, wie das beispielsweise OpenOffice.org oder auch Microsoft Office vormachen. Doch das Gelbe vom Ei ist das nicht. Es gibt mittlerweile zahlreiche Softwareprodukte, die hier eine Lösung versprechen, die Arbeitsersparnis aber in harten Euro gerne bezahlt hätten.
Die PDFlib bietet in manchen Versionen noch PDI-Funktionalitäten an. Damit ist es möglich, bestehende PDF-Dokumente zu öffnen und Elemente hinzuzufügen. Doch diese Funktionalität ist kostenpflichtig und deswegen im Rahmen dieser Serie auch nicht qualifiziert.Zum Datenaustausch von FDF hat Adobe das Forms Data Format (FDF) geschaffen. Dabei handelt es sich um ein Dateiformat, mit dem Formulardaten innerhalb von FDF-Dokumenten verarbeitet werden können. Das geht in zwei Richtungen: Zum einen können Daten, die aus einem Formular kommen, im FDF-Format abgespeichert werden. Zum anderen ist es auch möglich, FDF-Daten in ein Dokument zu laden.Leider hat Adobe ein paar Hürden zwischen die Entwickler und die Verwendung von FDF gesetzt. Denn nur Mitglieder im ASN Developer Program [3] erhalten vollen Zugriff auf die Dokumentation und die dazugehörigen SDKs, mit denen FDF-Daten erstellt werden können. Es gibt mehrere Varianten der Mitgliedschaft im Programm. Die günstige Variante belastet das Budget mit jährlich rund 200 US-Dollar, die Premium-Ausgabe kostet etwa 1.000 US-Dollar. Wer nur am SDK interessiert ist: Für Kunden aus den USA und Kanada schlägt das mit etwa 100 Euro zu Buche, doch ausländische Kunden können so und so nur per Telefon bestellen (möglicherweise zu einem anderen Preis).Mittlerweile gibt es jedoch auch ein FDF-Toolkit [4], ein API, um serverseitig auf FDF-Daten zuzugreifen. Eben dieses Toolkit wird auch von den FDF-Funktionen von PHP [5] als Voraussetzung angegeben (siehe Kasten Die FDF-Funktionen von PHP).
|
Wer es ganz luxuriös will: Der Adobe LifeCycle Designer [6] ist eine Art besserer XML-Editor, der daraus PDF- oder HTML-Dateien generieren kann.Doch all dieser Aufwand soll nicht nötig sein. Justin Koivisto hat schon vor einiger Zeit das FDF-Format genauer analysiert und die Erstellung in ein paar unter GPL gestellten Funktionen gekapselt; neuerdings gibt es auch noch ein Tutorial auf seiner Website [7]. Damit können Sie sich die Anmeldung sparen. Ein Tool zum Erstellen von PDFs mit Formularfeldern benötigen Sie aber trotzdem noch.
PDF erstellen
Erstellen Sie zunächst ein PDF mit dem Rahmen-Layout. Hier bietet sich etwa eine Textverarbeitung an. Im Beispiel soll eine sehr vereinfachte Steuererklärung erstellt werden, die fast noch auf einen Bierdeckel passen könnte. Den Textrahmen geben Sie vor, doch interessant wird es erst, wenn Sie Felder hinzufügen. Die Steuererklärung erwartet nur drei Angaben: Den Namen, die Einnahmen und die (abzugsfähigen) Ausgaben. Den Rest weiß das Finanzamt sowieso schon.Außerdem fügen Sie in Acrobat noch ein Feld für die Differenz aus Einnahmen und Ausgaben ein. Acrobat bietet dazu keine vorgefertigte Rechenregel, wohl aber eine für die Addition. Da Sie das Feld später selbst mit Werten füllen, können Sie festlegen, dass die Ausgaben immer als negativer Wert eingetragen werden. Deswegen können Sie angeben, dass sich das Differenz-Feld als Summe der Einnahmen und Ausgaben berechnet. Gleichzeitig können Sie es mit einem Schreibschutz versehen, der Benutzer sieht dann nur noch die Ausgabe. Prinzipiell ist es natürlich eine gute Idee, die anderen Felder auch mit einem Schreibschutz zu belegen, außer Sie wollen es den Benutzern ermöglichen, die Angaben noch direkt im Adobe Reader (ehemals: Acrobat Reader) zu bearbeiten.FDF erstellen
Sobald die Datei gespeichert ist, geht es auch direkt an das Einfügen der Daten via FDF. Ein kleines Formular fragt die steuerlich relevanten Daten ab:<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">Steuerpflichtiger: <input type="text" name="Name" /><br />Einnahmen: <input type="text" name="Ein" /><br />Ausgaben: <input type="text" name="Aus" /><br /><input type="submit" value="Steuererklärung erzeugen" /></form>
<< /T (<Feldname>) /V ('<Feldwert>')>>
Listing 1
<?php/*KOIVI HTML Form to FDF Parser for PHP (C) 2004 Justin KoivistoVersion 2.0Last Modified: 12/21/2004 4:44PMThis library is free software; you can redistribute it and/or modify itunder the terms of the GNU Lesser General Public License as published bythe Free Software Foundation; either version 2.1 of the License, or (atyour option) any later version.This library is distributed in the hope that it will be useful, butWITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITYor FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General PublicLicense for more details.You should have received a copy of the GNU Lesser General Public Licensealong with this library; if not, write to the Free Software Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USAFull license agreement notice can be found in the LICENSE file containedwithin this distribution package.Justin Koivistojustin.koivisto@gmail.comhttp://www.koivi.com*//** createFDF v2 - Justin Koivisto 12/21/2004 4:44PM** Takes values submitted via an HTML form and fills in the corresponding* fields into an FDF file for use with a PDF file with form fields.** @param $file The pdf file that this form is meant for. Can be either* a url or a file path.* @param $info The submitted values in key/value pairs. (eg. $_POST)* @result Returns the FDF file contents for further processing.*/function createFDF($file,$info){$data="%FDF-1.2\n%âãÏÓ\n1 0 obj\n<< \n/FDF << /Fields [ ";while(list($field,$val)=@each($info))$data.='<< /T ('.$field.') /V ('.trim($val).')>> ';$data.="] \n/F (".$file.") /ID [ <".md5(time()).">\n] >>"." \n>> \nendobj\ntrailer\n"."<<\n/Root 1 0 R \n\n>>\n%%EOF\n";return $data;}?>
require 'fdf.inc.php';$fdf = createFDF('steuer.pdf',array('Name' => $_POST['Name'],'Einnahmen' => $_POST['Ein'],'Ausgaben' => '-' . $_POST['Aus']));
$zufall = mt_rand(100000, 999999) . mt_rand(100000, 999999);file_put_contents("$zufall.fdf", $fdf);echo "<p>Steuererklärung erzeugt!</p>";echo "<p><a href=\"$zufall.fdf\">Download</a></p>";
%FDF-1.2%âãÏÓ1 0 obj<</FDF << /Fields [ << /T (Name) /V (Christian Wenz)>> << /T (Einnahmen) /V (1000)>> << /T (Ausgaben) /V (-750)>> ]/F (steuer.pdf) /ID [ <6aa279633f28f98325ade722885338da>] >>>>endobjtrailer<</Root 1 0 R>>%%EOF
Listing 2
<!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head><title>Online-Steuererklärung</title></head><body><h1>Online-Steuererklärung</h1><?phpif (isset($_POST['Name']) && isset($_POST['Ein']) && isset($_POST['Aus'])) {require 'fdf.inc.php';$fdf = createFDF('steuer.pdf',array('Name' => $_POST['Name'],'Einnahmen' => $_POST['Ein'],'Ausgaben' => '-' . $_POST['Aus']));$zufall = mt_rand(100000, 999999) . mt_rand(100000, 999999);file_put_contents("$zufall.fdf", $fdf);echo "<p>Steuererklärung erzeugt!</p>";echo "<p><a href=\"$zufall.fdf\">Download</a></p>";} else {?><form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">Steuerpflichtiger: <input type="text" name="Name" /><br />Einnahmen: <input type="text" name="Ein" /><br />Ausgaben: <input type="text" name="Aus" /><br /><input type="submit" value="Steuererklärung erzeugen" /></form><?php}?></body></html>
Christian Wenz ist als Autor, Trainer und Berater mit Schwerpunkt Webtechnologien tätig und spricht auf Konferenzen im In- und Ausland. In seiner Serie x ohne x zeigt er in jeder Ausgabe des PHP Magazins, wie PHP ungeahnte Fähigkeiten entwickeln kann. Seine Steuererklärung lässt noch auf sich warten.
Links und Literatur
- [1] partners.adobe.com/public/developer/en/acrobat/fdf/fdf-application.pdf
- [2] Christian Wenz, PDF ohne PDF, in PHP Magazin 4.04
- [3] partners.adobe.com/public/asn/developer/detail.html
- [4] partners.adobe.com/public/developer/acrobat/fdf/topic.html
- [5] php.net/fdf
- [6] partners.adobe.com/public/developer/livecycle/topic_designer.html
- [7] www.koivi.com/fill-pdf-form-fields/






