Spaces. Smartes Cloud Hosting für anspruchsvolle Webprojekte. Loslegen und Spaces testen. Von Mittwald.
Thomas Weise 12. Februar 2009

PDF-Dokumente mit PHP erzeugen

PDF-Dateien zu erstel­len, ist schon lan­ge kein Problem mehr. Spätestens seit OpenOffice die Möglichkeit bot, Textdokumente ins PDF-Format zu kon­ver­tie­ren (und mög­li­cher­wei­se auf­grund des­sen ande­re nam­haf­te Anbieter nach­zo­gen), ist es für jeder­mann leicht mög­lich, sei­ne Informationen in Form eines PDF-Dokumentes anzu­bie­ten. Anders sieht es aus, wenn man mal schnell auf sei­ner Website aktu­el­le Inhalte “zur Laufzeit” dyna­misch in einer PDF-Datei anbie­ten möch­te.

Das wäre zum Beispiel nötig, wenn man Benutzereingaben aus Formularen in die­se PDF-Datei inte­grie­ren muss. Ein mög­li­ches Szenario wäre ein Bestellformular, wel­ches nach erfolg­ter Bestellung dem Benutzer die Möglichkeit bie­tet, eine Bestellung als PDF-Datei auszudrucken/herunterzuladen.

Lösungsansatz / Alternativen

Wie immer gibt es meh­re­re Lösungen. In unse­rem Fall wird die PDF-Erzeugung durch Verwendung der Klasse FPDF gezeigt. Diese Klasse ist frei erhält­lich und darf sowohl für pri­va­te als auch für kom­mer­zi­el­le Zwecke genutzt wer­den. Das ist der ers­te Grund, wes­halb wir FPDF hier ver­wen­den, der zwei­te ist die Stabilität. Die FPDF-Klasse wird seit 2001 ent­wi­ckelt und kann sich heu­te auf die Fahne schrei­ben, eine rela­tiv ein­fach zu ver­wen­den­de, erprob­te und sta­bi­le PHP-Klasse zu sein. Eine Doku zu FPDF gibt es hier.

Als Alternative zu FPDF muss an ers­ter Stelle PDFlib genannt wer­den. Diese Klasse ist jedoch nicht auf jedem Webserver ver­füg­bar und Einrichtung und Umfang sind nicht tri­vi­al.  Wer sich die Sache trotz­dem anse­hen möch­te, kann die­se schön geschrie­be­ne Anleitung lesen. Eine ande­re inter­es­san­te Alternative könn­te TCPDF sein. Der Vollständigkeit hal­ber sei­en “PDFlib Lite”, “CPDF” und “Zend_Pdf” für das Zend-Framework erwähnt.

Grundlagen / eigene Klasse

Für unse­re Übung soll­te auf Ihrem Webserver PHP5 lau­fen. Falls Sie kei­ne Möglichkeit haben PHP5 zu nut­zen, sind ein paar klei­ne Änderungen am Quellcode not­wen­dig, dass die Skripte auch auf PHP4 lauf­fä­hig sind. Dazu am Ende mehr.

Am Besten legen Sie sich für die fol­gen­den Versuche ein neu­es Verzeichnis an (so kön­nen Sie die­ses even­tu­ell schnell und pro­blem­los wie­der löschen, wenn Ihnen die Sache am Ende nicht gefällt). In die­ses Verzeichnis ent­pa­cken Sie die FPDF-Klasse, die Sie hier her­un­ter­la­den. Erstellen Sie ein wei­te­res Verzeichnis neben dem soeben ent­pack­ten fpdf-Verzeichnis und nen­nen es twpdf. Dies ist nur ein Vorschlag, Sie haben freie Auswahl. Manchmal jedoch ist es vor­teil­haft, bei den selbst erstell­ten Verzeichnis-, Datei-, Funktions- und Variablennamen eine Art Vorzeichen anzu­hän­gen, um im Code immer schnell erken­nen zu kön­nen, was eige­ne Tests und was vor­ge­ge­be­ne, erprob­te Dinge sind. Alles was wir in unse­ren Übungen “pro­bie­ren” erhält die “Vorsilbe” tw, so beu­gen wir dem ver­se­hent­li­chen Löschen der FPDF-Klasse vor.

Am Ende soll­ten Sie jeden­falls eine Verzeichnisstruktur ähn­lich der im fol­gen­den Bild vor­lie­gen haben:

Testklasse01

Beginnen wir mit einer klei­nen Testklasse um die grund­le­gen­den Dinge ken­nen­zu­ler­nen und gleich­zei­tig eine Art Vorlage für alle spä­te­ren Arbeiten zu haben.

// unsere Testklasse erbt von der FPDF-Klasse
class Testklasse01 extends FPDF {

	// hier werden die Variablen für diese Klasse deklariert (also: "bekanntgemacht")
	private $twVariable01 = "";
	private $twVariable02 = ""; 

	// der Konstruktor dieser Klasse
	function __construct() {
		// Konstruktor der vererbenden Klasse aufrufen (also den von FPDF)
		parent::__construct("P", "mm", "A4"); // L=Querformat(Landscape), P=Hochformat(Portrait)

		// hier werden die Variablen dieser Klasse initialisiert (also: "gefüllt")
		$this->twVariable01 = "Hallo, ich bin der Probetext aus Testklasse01";
		$this->twVariable02 = date("d.m.Y");

		// Einstellungen für das zu erstellende PDF-Dokument
		$this->SetDisplayMode(100);      // wie groß wird Seite angezeigt(in %)

		// Seite erzeugen (sozusagen: starten)
		$this->AddPage();
	}	

	// eine Funktion zur Anzeige des Inhalts
	function Header() {
		$this->SetFont("Arial","B","16");                    // Schrift
		$this->SetTextColor(255, 000, 000);                  // Schriftfarbe
		$this->SetXY(20, 50);                                // Position
		$this->Cell(90, 10, $this->twVariable01, 1, 1, "L"); // Box(Textbox)
	}	

	function Footer() {
		// Farben und Schrift allgemein
		$this->SetFont("Courier","I","9");
		$this->SetTextColor(180);
		$this->SetXY(25, 288);
		$this->Cell(170, 5, "dieses Dokument wurde am ". $this->twVariable02. " erstellt", 1, 1, "R");
	}
}
// ACHTUNG: darf kein Zeichen hinter phpend sein (auch kein Leerzeichen) !!!

Testklasse01.php

Diese klei­ne Testklasse könn­te ein­fa­cher auf­ge­baut sein, doch für umfang­rei­che­re PDF-Dokumente spä­ter ist es rat­sam, sich schon jetzt die­sen Aufbau mit Variablendeklarationen, Konstruktor, Header uns Footer anzu­ge­wöh­nen. Der abge­bil­de­te Quellcode soll­te anhand der ein­ge­füg­ten Kommentare selbst­er­klä­rend sein. Trotzdem an die­ser Stelle Erläuterungen zu den FPDF-Funktionen:

  • Zeile 12: Ruft den Konstruktor der (ver­er­ben­den) FPDF-Klasse auf und setzt dabei das Papierformat, Maßeinheit und Papiergröße.
  • Zeile 19: SetDisplayMode() legt fest, wie das Dokument ange­zeigt wer­den soll, also mit wel­chem Zoomfaktor.
  • Zeile 22: AddPage() Erzeugt eine neue Seite im Dokument (bezie­hungs­wei­se über­haupt eine Seite).
  • Zeilen 26 bis 32: Header() Erzeugt den Header der Seite. Kann jedoch auch für den gesam­ten Seiteninhalt ver­wen­det wer­den.
    • SetFont() Bestimmt Schriftart, Style (B=fett, I=kursiv, U=unterstrichen) und die Schriftgröße. Die gerin­ge Auswahl an Schriftarten ist der­zeit das größ­te Manko von FPDF, aber mal Hand aufs Herz, wie­vie­le ver­schie­de­ne Schriftarten ver­wen­det man schon in einem Dokument?
    • SetTextColor() Bestimmt die Textfarbe. Angabe bsp. (220, 000, 110) oder nur (220) (steht für (220, 220, 220)).
    • SetXY() Position von lin­ken obe­ren Seitenrand (x=horizontal, y=vertikal). Bestimmt den Punkt, an dem es wei­ter­geht.
    • Cell() Zeichnet eine neue Zelle (oder halt Box) im Dokument. Diese kann optio­nal Text, einen Rahmen und einen Hintergrund erhal­ten. Die lin­ke obe­re Ecke beginnt an dem zuvor mit SetXY() zuge­wie­se­nem Punkt. Die Zellenbreite und -höhe wird in den bei­den ers­ten Parametern fest­ge­legt.
  • Zeilen 35 bis 41: Footer() Die Fußzeile sozu­sa­gen.

php-Skript, welches das PDF-Dokument ausgibt, indem es die Testklasse01 benutzt

Es folgt der Code für die php-Datei. Erläuterungen fol­gen im Anschluss.

// ACHTUNG: darf kein einziges Leerzeichen vor phpstart sein, wegen header!

// FPDF-Klasse und das Verzeichnis der FPDF-Schriftarten einbinden
define("FPDF_FONTPATH","fpdf16/font/");
include_once('fpdf16/fpdf.php');

// unsere selbsterstellte Testklasse01 einbinden
include_once("twpdf/Testklasse01.php");

// pdf erzeugen (aus unserer selbsterstellten Testklasse01)
$pdf = new Testklasse01();  

// pdf ausgeben (im Browser oder in Datei schreiben)
$pdf->Output();   // Ausgabe (wenn in Datei schreiben, dateiname in Klammer)

// ACHTUNG: in der aufgerufenen Klasse darf kein Leerzeichen hinter phpende sein!

testseite01.txt

  • Zeile 4 und 5: Hier wer­den die FPDF-Klasse und die Schriftarten ein­ge­bun­den.
  • Zeile 8: Hier bin­den wir unse­re selbst erstell­te Klasse ein.
  • Zeile 11: Ein Objekt erzeu­gen von der Testklasse01.
  • Zeile 14: Output() Output gibt das PDF-Dokument aus, bezie­hungs­wei­se, wenn man als Argument einen Dateiname angibt, dann wird eine PDF-Datei auf dem Server ange­legt.

Wenn Sie kein PHP5 auf Ihrem Webserver nutzen können

Wenn Ihnen kein PHP5 zur Verfügung steht, benut­zen Sie für die­ses Beispiel fol­gen­de Dateien.

  • testseite01_fuer_altes_php kopie­ren
  • Testklasse01_fuer_altes_php kopie­ren

Der Unterschied die­ser bei­den Dateien zu den vor­ge­stell­ten Dateien ist gering. Hier wur­den nur die “pri­va­te/­pu­blic-Angaben” umge­än­dert in “var” und der Konstruktoraufruf der ver­er­ben­den Klasse hat eine ande­re Syntax. Diese klei­nen Unterschiede in den Dateien haben jedoch kei­nen Einfluss auf unse­re Beispiele. Also, falls Sie beim Testen unse­rer Beispiele eine ähn­li­che Fehlermeldung wie die fol­gen­de erhal­ten, dann läuft auf Ihrem Webserver kein PHP5.

Ein erstes Beispiel

An die­ser Stelle könn­te jetzt ein Anwendungsbeispiel erschei­nen. Man könn­te eine ein­fa­che Rechnung zu gene­rie­ren – so es wie die­ses Beispiel zeigt. Aber viel­leicht haben Sie ganz ande­re Ideen…

Thomas Weise

Thomas Weise ist gelernter Anwendungsentwickler. Ihn zog es aber immer schon in Richtung Internet und Webentwicklung. Seine Artikel auf drweb sind Gastartikel, selbst bloggt er auf

36 Kommentare

  1. Dein Beitrag ist Spitze !

    Dezent grund­sätz­lich, trotz­dem recht wahr usw.

    ———

    eine Methode, die Ich lan­ge such­te.

    Es schei­ter­te nur dar­an, den rich­ti­gen Suchbegriff in die Engines ein­zu­ge­ben.

    —————————————

    Ich habe nicht viel Möglichkeiten, aber wenn ein Info – Austausch erwünscht ist,
    mai­len().

    Ich habe auch so Einiges ent­wi­ckelt !

    ————-
    mein Prinzip:

    benut­ze nur Grundcode, der recht lan­ge hält.

    habe mir dar­aus lang gel­ten­de Code-tools ent­wi­ckelt.

    ———–

    Intersesse():

    1: ein AdminC – upload mit Ordnung der Bilder – Reihenfolge aus php, ohne js – Abhängigkeit.
    2: diver­se php – Methoden, um ein select trotz­dem auf css zu ver­än­dern.
    3: css – Kürzungen, die immer funk­tio­nie­ren.
    4: harm­lo­se Verschlüsselungsmethoden, ohne eben­falls zu nah ran­zu­ge­hen, aber doch so kom­pli­ziert, daß der nor­ma­le Hacker vor­her zusam­men­bricht
    5: eine ftp – Kontroll
    6: eine mail mit Anhang, nicht aus self – php.

    —————

    7: lan­ge Erfahrungen mit dem lay­out. Methoden, um die Sache brow­se­r­un­ab­hän­gig trotz­dem auf einen recht guten Stand zu brin­gen:

    Hinweiß:

    css: über – all­ge­mein­gül­tig, aber recht domi­nant und rich­tig.
    style: in und unter die html – tags, DANACH.
    Browserweiche php: nicht über­trei­ben, mehr für die Prinzession auf der Erbse, den ie.

    Sonderstyle:

    die tag’s in ein php – echo legen, alles mit quo­tes umrah­men, den Rest Alles in dop­pel­ten Anführungszeichen las­sen.
    ACHTUNG:
    bei send nur readon­ly ver­wen­den, nicht dis­able.

    ie macht nichts:
    dis­play inli­ne. or inli­ne – block.

    ————-
    Tipps zum kom­pli­zier­te­ren Programmieren:

    Wenn Du ein Nachdenk – Problem hast:

    neh­men wir mal an, eine qual­vol­le Methode funk­tio­nier­te:

    » im nächs­ten Block eine ande­re Methode anwen­den, nichts ankle­ben, Alles eigen­stän­dig.

    die her­aus­ge­zo­ge­nen Variablen anders nen­nen und nie mehr da ver­wen­den.

    —————-

    dann wird eine alte schwe­re Methode nicht mehr ver­letzt.

    —————-

    —————

    ok.

    Dank !
    —————

  2. Ich habe auch lan­ge gesucht.
    Eine Alternative wäre noch pdfnow.com (der­zeit in der Betaphase). Hier kann man tem­pla­te­ba­sier­te PDFs aus PHP erstel­len.

    Hierfür kann man ein Beispieltemplate her­un­ter­la­den, anpas­sen, hoch­la­den und den PDF-Generator mit­tels PHP-Funktion oder Webservice ein­fach auf­ru­fen.

  3. Vielen Dank für das Tutorial – hat mir sehr gehol­fen, erst­ma­lig ein PDF auf mei­ner Seite zu erzeu­gen. Bisher habe ich Formulare immer mit html erzeugt, was lei­der auf jedem Browser immer ein klein wenig anders aus­sah. Ich hof­fe, dass die­ses Problem jetzt für immer besei­tigt ist!?

  4. Ich ver­wen­de seit län­ge­rem TCPDF und bin damit voll zu frie­den. Nach kur­zer Eingewöhnung, kann man damit super easy ordent­li­che PDFs erzeu­gen.

  5. Hi,

    ich bekom­me statt des €-Zeichens soet­was ange­zeigt: €

    Wie kann ich die­sen Fehler behe­ben?

    MfG Thilo

  6. Danke für den hilf­rei­chen Artikel!

  7. Wo schreib ich den link zur html rein?

  8. Hallo,

    ich habe eine Komplette Rechnungserstellung für die­ses Script gebas­telt.
    http://sourceforge.net/projects/php-pdf-invoice/
    Im Browser kann man über eine PHP Webseite eine Rechnung für Kunden erstel­len. Das PDF wird aus­ge­ge­ben oder direkt per E-Mail an den Kunden ver­sen­det. Das Programm wur­de ursprüng­lich für Webhoster ent­wi­ckelt. Jede ande­re Art der Rechnung ist aber pro­blem­los, genau so mög­lich!
    Würde mich freu­en irgend wel­che Feedbacks dazu bekom­men. Was kann man noch verbessern/ändern?

    Grüße Alex

  9. Vielen Dank für das Tutorial!
    Imo ist es aller­dings rela­tiv witz­log eine PDF-Rechnung als Beispiel zu zei­gen ohne das Script das sie erstellt hat. Wie eine Rechnung aus­sieht weiß ich auch so.

  10. Ich habe schon sehr erfolg­reich mit FPDF Rechnungen erstellt, funk­tio­niert wun­der­bar und der Einstieg ist sehr ein­fach.
    Mein Problem momen­tan ist ein auto­ma­ti­scher Ausdruck. Mittels JavaScript ist es soweit mög­lich, das der User nur noch OK kli­cken muss damit der Druck abläuft, doch bei 100 auto­ma­tisch gene­rier­ten PDF-Dateien, ist dies kei­ne Lösung.
    Falls jemand einen Trick kenn, wie ich das Problem lösen kann, wäre ich sehr dank­bar!

    Sonst geht es nur mit­tels sys­tem() um Befehle vom Webserver aus­füh­ren zu las­sen!

  11. Hat das schon mal jemand mit einem Gambio Shop zum Laufen gebracht? Der eige­ne PDF-Editor lässt sich ja kaum kon­fi­gu­rie­ren.

  12. Hallo,

    ich habe das Problem, das ich die Texte die ich mit fpdf erzeugt habe in Grafiken (kur­ven) umwan­deln möch­te, gibts da schon eine Lösung?

    Vielen Dank im Voraus

  13. @Sascha Tatomir: Danke für die Blumen ;-)
    Zu wel­chem Thema hab ich kei­ne Lösung gege­ben?
    Welche Seite meinst du mit “indi­reck­ter Selbstdarstellung”?
    Ich weiß wirk­lich nicht was du meinst.
    … Maurer hab ich nicht gelernt.

  14. Gelernter Anwendungsentwickler ???????? Thomas mit Schnurrrrbart, die­se Hochstaplerei kann ich nicht ver­dau­en

    Du hast wohl nicht soviel Ahnung von der Webapplikationsprogrammierung, weil du ers­tens zum Thema kei­ne Lösung gege­ben hast, obwohl die schon seit Lichtjahren bekannt ist und zwei­tens, die­se Site eher eine
    Art indi­reck­ter Selbstdarstellung ist. Soll den Anschein von Professionalität erwe­cken.

    Gelernter Maurer passt eher zu dier, das gibts auch in der
    Realität.

    • Ich fin­de die Bemerkung “gelern­ter Maurer” an Ihn als eine Frechheit.

      Er hat vie­len Leuten eine unkom­mer­zi­el­le und doch mög­li­che Mehtode müh­sam aus­ein­an­der­ge­setzt.

      vor mei­nen wei­te­ren Äusserungen, die noch fol­gen, eine Bemerkung vor­ab:

      Ich möch­te mir nicht die Symphatien ver­der­ben.

      ok.

      —————–

      dann fol­gen mei­ne Infos:

      Vorgeschichte(das soll nur zei­gen, daß Ich auch schon des Öfteren nach­ge­dacht habe),

      Abi/1 Semester Chemie, Uni – Bochum.
      Architektur – Vordiplom Uni – Dortmund.
      Maurelehre ange­fan­gen, nach­dem Alles gecheckt, weg­ge­lau­fen.
      psy­chat­rich­se Behandlung, erholt.

      Angebot auf ein­fa­che Ausbildung:
      Kaufmann bei Rewe, gemacht und bestan­den.
      nach län­ge­rer Zeit kei­ne Arbeit mehr.

      Weiterbildung über Arbeitsamtskosten für html, php, cpp und Linux-Kenntnissse mit Zeugnissen.

      Tätigkeit heu­te:
      eine Art Freundeshausmeister für kom­mer­zi­el­le Vermietung, incl. ein­fa­cher tech­ni­scher und kauf­män­ni­scher Betreuung.
      Selbstständig.

      das Freundschaftsverhältnis blieb nach län­ge­rem Kampf dann sta­bil.

      ok.

      wie am Lebenslauf zu sehen, hat bei mir doch so Einiges nicht geklappt !

      und Ich bin auch gar­nicht ein­ge­bil­det dar­auf.

      bin der Überzeugung, daß man ver­su­chen soll­te, wie­der auf­zu­ste­hen, sobald man der Ansicht ist, daß man es ertra­gen kann.
      ————————-

      nun zu der Äusserung:

      Ich habe auch etwas Erfahrung in der Situation der Clienten.

      Folgendes:
      Wissen Sie über­haupt, wie ein ein­fa­cher Client reagiert, wenn Irgendetwas nicht klappt und das sogar noch mehr­fach pas­siert ???

      Er hat kei­ner­lei Ahnung davon, war­um das so ist////
      er wird nur sau­wü­tend und mel­det sich nie wie­der.

      micro­soft z.B. ver­ur­sacht eine der­ar­ti­ge Situation, genau­er:
      selbst wenn man es sehr gut gemeint hat, kön­nen die dau­ernd die Bedingungen ändern.

      das kann kein armer oder mitt­le­rer Unternehmer ver­tre­ten.

      die ver­ste­hen nicht mal, war­um.

      —————-

      des­halb mei­ne Ich, und auch zurecht, daß der Betreiber Dr. Web durch­aus eine gros­se Hilfestellung gege­ben hat.

      Und das mei­ne Ich nicht nur.

      Ansonsten kann man nur als Vollprofi agie­ren und für ganz gros­se Mächte arbei­ten.

      —————

      Auch mir ist die­ses Problem seit län­ge­rem bekannt und Ich kann auch mehr, als Ich zei­ge.

      wie Ich in mei­nem Beitrag andeu­te­te, liegt die Vorkunst dar­in, alle Routinen im Grundcode zu schrei­ben und ein­zeln zu blo­cken.

      nie­mals allow over­ri­de.

      kein C#.

      die fer­ti­gen Blöcke mit Sinnabschnitten kom­men­tie­ren, damit die frem­de Weiterarbeit ver­ant­wor­tungs­los über­geb­bar ist.

      ————

      mei­ne Hinweise in vor­he­ri­ger mail bezie­hen sich nur auf eine opti­sche html – Form.
      Aber da geht das eben schon los.

      die Info noch­mal ein­fa­cher:

      1 man ist z.B. in der Lage, her­aus­zu­fin­den, wie alle gän­gin­gen Browser eine opti­sche Formatierung all­ge­mein rel. gleich inter­pre­tie­ren. das dau­ert eine gewis­se Zeit, aber dann weiss man es.

      2 das soll­te in die tag’s direkt. dann man­cht man das nor­ma­le css darüber(Priorität2).

      3 Als Drittes erst: die extra – Würste mit if ie usw. in einer aus­ge­la­ger­ten css – Datei oder als Zusatz ver­fas­sen über Browserweiche.

      ————

      Sinngemäß geht es dann beim Programmieren oder auch Netzwerken bis ServerAdministration der­art wei­ter.

      ————–

      die Macht Derer, die danach die Befehle geben, ist viel zu groß.

      ——————–
      man kann natür­lich auch so ver­fah­ren, es ist nur die Frage, wie lan­ge man sowas seel. ertra­gen kann oder anders aus­ge­drückt, bis die einen fal­len las­sen wie von ges­tern.
      —————–

      ———-
      Ich den­ke, es war sogar recht beläs­ti­gend, aber vom Grundinhalt bin Ich ähn­li­cher Meinung:

      kurz:
      man soll­te schon ver­su­chen, dann etwas zu bau­en, was ein wenig hält.

      » die neu­en Dinge hin­ge­gen bedür­fen län­ge­rer Erfahrung und müs­sen auch gar­nicht bes­ser sein !

      Ich habe mich auch in vie­len Foren unter­hal­ten:
      vie­le mei­ner urps­rüng­lich recht schrof­fen Behauptungen wur­den gezofft, stimm­te aber spä­ter doch unge­fähr.

      Es hat danach fast nie­mand mehr dar­über gere­det !!
      —————————

      dann sor­ry und noch­mals Danke an Dr. Web.
      Bin Ich zu unan­ge­nehm ???, kein Problem:
      mail ent­fer­nen, bin auch nicht belei­digt.
      ok.

  15. @Inge, @Tom, @Heinz: Ich werd noch einen Artikel über die PDF-Rechnung schrei­ben. Wenn ihr noch ca 2 Wochen war­ten könnt…?

  16. Ich möch­te nicht auf­dring­lich sein, aber kann ich noch mit einem rich­ti­gen Anwendungsbeispiel rech­nen?
    Das Generieren einer Rechnung wür­de mich sehr inter­es­sie­ren.

  17. Sie schrei­ben, dass hier ein Anwendungsbeispiel fol­gen könn­te… Mich wür­de die PDF-Rechnung inter­es­sie­ren.

  18. Moin Moin Nie Mand,

    >Kenn jemand eine – FREIE – Klasse die das ein­fü­gen von Daten
    >in PDF-Formularfeldern ermög­licht?
    Ich nut­ze sehr ein­fach die FPDF-Erweiterung FPDI für nicht ganz was du suchst.
    Ich habe ein fer­ti­ges “lee­res” PDF und impor­tie­re mit der FPDI die fer­ti­gen PDFs und schrei­be die Formular-Felder ein­fach nur drü­ber.
    Der Nachteil: kei­ne dyna­mi­schen Form-Elemente am Ende.

    Ich ken­ne lei­der auch kein Tool, dass die Formular-Felder erhält.

    Viel Erfolg, Metanormal

  19. Bitte um ein Anwendungsbeispiel / Klasse zum erzeu­gen einer Rechnung wie im letz­ten Abschnitt gezeigt. Wird drin­gend benö­tigt.

  20. Hab am Ende des Artikels noch einen Link ein­ge­fügt, wegen dem Syntaxhighlighting in der Quellcode-Darstellung.

  21. Hallo,

    Habe inzwi­schen die ers­ten Formulare erstellt. Prima!!

  22. Hallo,

    habe gera­de das Testprogramm aus­pro­biert und bin erfreut dass es anstands­los funk­tio­niert hat. Ich hät­te mich noch über das Anwendungsbeispiel zum erzeu­gen einer Rechnung gefreut. Da ich so etwas vor­ha­be.

  23. Vielen Dank für die tol­len Tipps!

  24. Hallo,
    FDPF ist eine fei­ne Sache. Doch immer wie­der eine PDF Datei zu gene­rie­ren für wenig ver­än­der­ten Inhalt ist nicht mein Ansatz. Ich ver­su­che daher seit eini­ger Zeit mir ein­fach PDF-Templates erstel­len, in denen der Inhalt über vor­her ein­ge­füg­te Formularfelder gesetzt wird…

    Kenn jemand eine – FREIE – Klasse die das ein­fü­gen von Daten in PDF-Formularfeldern ermög­licht?

  25. Für unse­re Praktikanten kommt der Artikel drei Wochen zu spät. *hehe*

  26. @Christian: Ich schreib im HTML-Modus.
    Hab das Problem nun auch aus­ge­macht: das Plugin “WP-Syntax” hat die­ses Problem in sei­ner neu­es­ten Version 0.9.2 schon beho­ben, die­se Version is aber lei­der hier nicht lauf­fä­hig…

    Ich hab des­halb erst­mal über die Quellcodebeispiele je einen Link gemacht. Wenn man den anklickt, kann man den rich­ti­gen Quellcode dann dort kopie­ren.

    Ich weiß, das ist viel­leicht erst­mal nicht die ele­gan­tes­te Lösung…

  27. Ein sehr schö­nes Tutorial, das neben­bei auch gleich noch Einblick in Objekt ori­en­tier­te Programmierung unter PHP gibt.
    Ich hof­fe, dass alle LeserInnen, die dei­nen Beispielcode aus­pro­bie­ren möch­ten, so pfif­fig sind, die zer­schos­se­nen Zeichen (>) zu erset­zen.

    Vielen Dank!

    Thomas, ver­fasst du dei­ne Artikel denn im “HTML”- oder “Visual”-Modus? Viele Syntax Highlighting-Skripte haben offen­bar mit Letzterem Probleme. Im “HTML”-Modus könn­te es viel­leicht bes­ser lau­fen, auch wenn der Komfort dann etwas ein­ge­schränkt ist.

  28. @Paul: Danke für den Tipp, ich hat­te das gar nicht bemerkt :(.
    Ich bekomms nur immer noch nicht weg. Der Code-Formatierer (das WP-Plugin WP-Syntax) hat Probleme damit, egal was ich für das “>” auch rein­schrei­be…
    Naja, ich such mal noch wei­ter, viel­leicht kennt sich ja auch jemand mit dem Plugin aus.

  29. Gibt es denn eine Möglichkeit, XML -> XSLT/FO -> pdf zu trans­for­mie­ren über php ohne den apa­che als post-pro­ces­sor? Kennt da jemand was?

  30. PD4ML ist auch eine gute Alternative. Ist zwar nicht kos­ten­los, aber wer eine schnel­le Generierung von von HTML->PDF braucht, wird hier fün­dig. Es ist eine Java-Klasse (ergo braucht man die Möglichkeit Java auf dem Server zu instal­lie­ren), aber es lohnt sich. Man kann der Klasse eine URL geben und die­se Seite wird dann inkl. “aller” (ok nicht aller, aber fast) CSS-Eigenschaften geren­dert. Somit umgeht man das zeit­auf­wen­di­ge Erstellen des PDF-Exports in FPDF. Außerdem ist man wesent­lich fle­xi­bler, wenn etwas geän­dert wer­den muss. Z.B. wenn ein neu­es Design ein­ge­ar­bei­tet wer­den muss. Ich will kei­ne Werbung für das Tool machen, aber es hat mir für “nur” 160 Euro jede Menge Stress auf Arbeit erspart.
    http://pd4ml.com/php.htm

  31. FPDF ist eine klas­se Sache, die ich schon seit län­ge­rem erfolg­reich ein­set­ze. Der ein­zi­ge Nachteil ist, dass der Erstellungsprozess der PDF-Datei durch die begrenz­ten Möglichkeiten mit “Cell” etc. doch sehr lang­wie­rig ist und Funktionen, die ver­spre­chen aus HTML ein PDF zu erzeu­gen, die­se Aufgabe nur sehr bedingt aus­füh­ren. Für Optimierungsvorschläge/Ideen zur schnel­le­ren Erstellung wäre ich per­sön­lich daher sehr dank­bar!

  32. Ich benut­ze FPDF schon seit eini­ger Zeit – bin bis jetzt sehr zufrie­den damit!

  33. Ich möch­te kurz auf die feh­ler­haf­ten Pfeile in den Methodenaufrufen auf­merk­sam machen.

    -> : ->

  34. Für alle, die auf die Textsatzqualitäten von LaTeX schwö­ren, gibt es ein eben­falls frei erhält­li­ches Plugin für das Web-Framework Symfony.

    Hier eine Demo, wie HTML-Tags “zur Laufzeit” von LaTeX anspre­chend in ein PDF-Formular umge­setzt wer­den:
    http://symfony.ibr-oss.de/demo/HtmlInput/

    Das Erklärung dazu (in eng­lisch) hier:
    http://symfony.ibr-oss.de/article/how-to-use-rich-text-editing-with-pdflatex/

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.