Word RTF dynamisch erstellen
Aus php bar
Inhaltsverzeichnis |
Problem
Man soll aus einer Formulareingabe dynamisch ein Word Dokument erzeugen. PDF scheidet aus, da das Dokument noch nachbearbeitet werden soll.
Lösung
Man erstellt in Word ein Template, markiert darin die Bereiche die ersetzt werden sollen und speichert es als RTF mit der Dateiendung .doc ab. Das RTF-Format ist nicht binär und kann somit von PHP als ASCII-Text interpretiert werden. Nun nur noch nach den Platzhaltern suchen und ersetzen...
PHP Snippet - Datei auf dem Server erstellen
1 /** 2 * Word-Dokument (RTF, aber als .DOC kaschiert) aufbauen und als Anhang verschicken 3 */ 4 /* ... */ 5 // Template öffnen 6 $brief = file_get_contents('my_template.doc.php'); 7 // Template ist gegen direktes Lesen mit php-Tags geschützt, diese jetzt entfernen 8 $brief = str_replace('<?php /*', '', $brief); 9 $brief = str_replace('*/?>', '', $brief); 10 11 $brief = str_replace('*tagesdatum*', strftime("%d.%m.%Y"), $brief); 12 if ($anrede == 'Herr') { 13 $qanrede1 = 'Herrn'; 14 $qanrede2 = 'r Herr'; 15 } else { 16 $qanrede2 = ' Frau'; 17 } 18 //n an Herr anhängen 19 $brief = str_replace('*qanrede1*', $qanrede1, $brief); 20 $brief = str_replace('*vname*', $vname, $brief); 21 $brief = str_replace('*nname*', $nname, $brief); 22 $brief = str_replace('*strasse*', $strasse, $brief); 23 $brief = str_replace('*haus*', $haus, $brief); 24 $brief = str_replace('*plz*', $plz, $brief); 25 $brief = str_replace('*ort*', $ort, $brief); 26 //'sehr geehrter Herr'/'sehr geehrte Frau' 27 $brief = str_replace('*qanrede2*', $qanrede2, $brief); 28 /* ... */ 29 // Datei speichern (mit Endung .DOC) 30 $file_name = 'my_template.doc'; 31 $fp = fopen('tmp/' . $file_name, 'w'); 32 if (!$fp) { 33 trigger_error('file_put_contents cannot write in file.', E_USER_ERROR); 34 return; 35 } 36 fputs($fp, $brief); 37 fclose($fp);
PHP Snippet - RTF direkt an Browser leiten
Einfach im obigen Skript Zeile 29 bis 37 durch folgenden Code ersetzen:
1 header('Content-Type: application/rtf'); 2 header('Content-Disposition: attachment; filename="Brief.rtf"'); 3 print $brief;
Hinweis: Vor "header" darf kein Zeichen an den Browser gesendet worden sein!

