Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w01136d3/wordpress/wp-content/plugins/deans_code_highlighter/geshi.php on line 2147

Wer mittels PHP ein PDF Formular mit den Eingaben eines Benutzers ausfüllen will, hat es nicht leicht. Es gibt hier 3 verschiedene Herangehensweisen:

  • PDF selbst generieren
  • Eine FDF Datei erzeugen und dem PDF beilegen
  • PDF Binärcode bearbeiten

Wenn man ein PDF neu generiert hat man zwar mehr Möglichkeiten, das echte PDF Formular in dem Sinne geht aber verloren, was zur Folge hat, dass das PDF Formular danach nicht weiter bearbeitet werden kann. Zum Gestalten von PDFs hatte ich bisher mit FPDF die wenigsten Probleme. Hierbei benötigt man sein Formular als Digitales Bild, welches in den Hintergrund gelegt wird. Danach platziert man die Texteingaben mit X und Y-Koordinaten in die Felder. Nicht sehr elegant, aber es funktioniert immer.

Als zweites möchte ich auf die eigentlich eleganteste Lösung eingehen. Eine FDF Datei erzeugen. PDF steht für Forms Data Format und ist ein Datenformat von Adobe für PDF Formulare. In dieser Datei kann man die ganzen Formulareingaben speichern. Dazu definiert man nur noch das grundlegende PDF. Beim Öffnen der PDF Datei läd der Reader also nur noch die leere PDF Datei und füllt das Formular mit den Daten auf der PDF Datei.  Devlex FDF Forms Data Format bietet eine gute Erklärung des Formates. Adobe bietet ein SDK Toolkit um die PDF Funktionen in PHP nutzen zu können. Hier noch ein FDF Tutorial zu dem Einsatz der FDF Funktionen in PHP. Der Nachteil dabei ist, dass PHP auf dem Server mit –with-fdftk[=DIR] neu kompiliert werden muss.

Eine weitere Möglichkeit ist das Bearbeiten des Binärcodes einer PDF Datei. Hier nimmst man zuerst ein PDF mit Formular her und füllt dieses z.B. mit Adobe Acrobat Reader Pro aus. Welches Programm man nimmt ist egal, es geht nur darum, dass Standardwerte in den Formularfeldern gespeichert werden können.  Als kostenloses Programm kann man die Formulare auch mit dem Foxit Reader ausfüllen und speichern.

PDF Formular mit Standardwerten ausfüllenNun füllt man also jedes Feld mit einem Wert, welches genauso lang ist wie die längst-mögliche Eingabe. Das Bild links zeigt einen Ausschnitt auf einem Formular. Der Standard-Wert in dem Feld Geburtsdatum hat 10 Zeichen; „birthdate“ = 9 + 1 Zeichen für „0“ = 10. Denn dieses Feld soll durch ein Datum der Form „DD.MM.YYYY“ ersetzt werden, welches die Länge 10 hat. Genauso verfahren wir mit allen anderen Feldern und füllen gewünschte Werte mit einem beliebigen Zeichen auf, z.B. Nullen. Die Standardwerte ersetzen wir ja mit PHP durch die echten Werte, nur dass wir diese dann mit Leerzeichen auffüllen, sodass der echte Wert die gleiche Zeichenlänge hat wie der Standardwert. Dies muss so sein, weil in jedem PDF die eigene Dateigröße gespeichert wird. Diese darf sich also nicht verändern, sonst wäre die Datei beschädigt.

Kommen wir nun zum PHP Teil, in dem wir die Werte ersetzen.

// files
$source = "source.pdf";
$target = "target.pdf";

// read file
"r"// define form fields with maximum length
"birthdate" => 10, "phone" => 30, "email" => 34);

// define sample user input data
// later its your html form input eg
"birthdate" => "10.12.2001", "phone" => "0707010203",
    "email" => "mail@example.com");

// replace data
"0"// save file
"w+"

source.pdf ist die das Quell-PDF mit dem Formular. In dem Abschnitt replace data erstellen wir mit $needle den Standardwert, den wir ersetzen möchten. Die Funktion str_pad() füllte dabei den Wert mit Nullen auf. Danachgenerieren wir den Zielwert auf des User Eingaben. substr() kürzt die Eingabe falls der Wert länger als die Maximallänge sein sollte. Der zweite str_pad() füllt den Zielwert mit Leerzeichen auf. Danach einfach die String Ersetzung  und die Speicherung der neuen Datei.

In einigen PDF Readern wie dem Foxit Reader gibt es ein Problem mit der Darstellung von Sonderzeichen wie ä ö ü und Co, auch nach dem Installieren des deutschen Zeichensatzes in Foxit. Eine Lösung habe ich dafür nicht gefunden. Auf manchen Systemen konnten die Daten mit dem Acrobat Reader  nicht weiter bearbeitet, geschweige denn markiert werden. Blöd. Schluss endlich bin ich dann doch bei der PDF Generierung gelandet, vor allem weil mit dieser String Ersetzung das Anhaken von Checkboxen schier unmöglich ist. Ich hatte keine Zeit mehr eine Lösung zu suchen. Hakt man eine Checkbox an wird in einem Container in dem PDF ein neuer sehr langer Textblock angehängt – wer Lust hat kann mir die Lösung schicken 🙂

Mittwoch, 6. Mai 2009 [PHP] RSS 2.0 / Trackback senden

5 Kommentare

  1. Name (erforderlich)

    Donnerstag, 3. März 2011 um 15:00

    „Eine PDF Datei erzeugen. PDF steht für Forms Data Format und ist ein Datenformat von Adobe für PDF Formulare“

    muß doch wohl heißen:

    „Eine FDF Datei erzeugen. FDF steht für Forms Data Format und ist ein Datenformat von Adobe für PDF Formulare“

    oder?

  2. Elias

    Donnerstag, 3. März 2011 um 15:49

    Richtig, Danke für den Hinweis.

  3. Name 2

    Sonntag, 30. Oktober 2011 um 15:21

    Warum ist der Fehler inzwischen nicht behoben worden? Heute ist der 30.10.2011 😉

  4. Torsten

    Dienstag, 8. November 2011 um 13:31

    Da sind noch 2 Fehler im Code:

    1.) $handle = fopen(, „r“); -> $handle = fopen($source, „r“);

    2.) in der Schleife darf es nicht auch $target heißen

    foreach($fields as $key => $len) {
    $needle = str_pad($key, $len, „0“);
    $targetvalue = str_pad(substr($data[$key], 0, $len), $len);
    $pdf = str_replace($needle, $targetvalue, $pdf);
    }

  5. Max

    Freitag, 16. Dezember 2011 um 14:43

    Schau dir mal das an:
    http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/

    zB Auslesen und Anzeigen aller Feldnamen (hier ohne Zusätze)

    echo „“;
    $pdfdata2 = exec(„pdftk.exe $pdfdatei dump_data_fields_utf8“, $pdfdata, $return);

    //print_r($pdfdata);
    foreach ($pdfdata as $row) {
    $pos = strpos($row, „FieldName:“);
    if ($pos !== false) {
    $row = str_replace(„FieldName: „, „“, $row);
    echo „\r\n“.$row;
    }
    }

    FDF erzeugen kann man mit PHP selbst, dafür gibts php.net/manual/de/book.fdf.php

Einen Kommentar hinterlassen

XHTML allowed tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>