Empfehlung: dompdf

Neulich stand das Thema „Rechnungsgenerierung per PDF“ auf der Agenda. Da ich im PDF-Business noch ein unbeschriebenes Blatt war, stand erstmal etwas Recherche an. Zuerst habe ich mir FPDF angeschaut. Ganz ordentliche Dokumentation und soweit auch sehr flexibel, die Tutorials sind ein guter Einstieg. Allerdings ist die aktuellste Version vom Juni 2011, FPDF wird nicht mehr weiterentwickelt.

Danach war der Platzhirsch dran: TCPDF. Aktive Weiterentwicklung und extrem mächtig. Die Beispiele zeigen schon, dass mit TCPDF wohl alles möglich ist. Und dennoch, ich hab‘ recht schnell schlechte Laune dabei bekommen:

$pdf->MultiCell(0, 0, $text, 1, 'L', 0, 0, '', '', true);

Ehm, ja. Hat sicher alles seine Daseinsberechtigung und ist bestimmt sehr durchdacht – mir war es aber für ein kleineres Projekt zu viel des Guten. Generell schleppen alle PDF-Funktionen einen riesigen Berg an Parametern mit sich rum, TCPDF wirkt als wäre es unkontrolliert gewachsen. Nichtsdestotrotz, eine ganz ordentliche Unterstützung von HTML ist mit dabei – siehe dieses Beispiel mit Code dazu.

Enter dompdf

Nächster Kandidat auf der Agenda war das ebenfalls aktiv weiterentwickelte dompdf, welches komplett auf die Verwendung von HTML und CSS für die PDF-Generierung setzt. Naturgemäß ist die Verwendung von HTML im Print-Bereich schwierig: korrekt platzierte Seitenumbrüche seien etwa genannt. Trotz dessen: dompdf hat mich vom Fleck weg überzeugt. Quasi vollständige CSS 2 Unterstüzung sorgt für sauberen Code – die grässlichen cellpadding = … width = … – Tabellen wie man sie unter TCPDF gewohnt ist sind obsolet. Zu den Beispielen gehts hier lang.

Ein paar Sahnestückchen noch: Absolute Positionierung klappt wunderbar. Das ist für Header und Footer-Elemente von besonderer Bedeutung. Auch die Verwendung von padding und margin fühlt sich an wie im Browser, insgesamt macht die Library einen sexy Eindruck. Abschließend noch ein kleines Beispiel:

require_once("dompdf/dompdf_config.inc.php");
               
$html =
'<!doctype html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style>
    #title { font-size: 35px; }
    #footer { position: absolute; bottom: -10px; font-size: 10px; }
</style>
</head>
<body>
<h2 id="title">Rechnung / Lieferschein Nr. 12/330 vom 28.06.2012</h2>

<table id="order">
   ...
</table>

<div id="footer">
    XYZ GmbH, Geschäftsführer: Manfred Mustermann. Handelsregistergericht HRB Nr. 1234 · Ust-IdNr. DE 1234567 · St-Nr. 7654321<br />
</div>
</body>
</html>';
 
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->set_paper("a4", 'portrait'); 
$dompdf->render();
$dompdf->stream("rechnung.pdf", array("Attachment" => 0));

So hab ich mir das vorgestellt ;). Seitenumbrüche? Auch kein Problem:

<p style="page-break-before: always"> </p> 

Abschließend sei noch das html2pdf Projekt aus Frankreich erwähnt, das einen ähnlichen Ansatz wie dompdf verfolgt. Ausprobiert hab‘ ichs allerdings nicht.

Weitere Posts:

Dieser Beitrag wurde unter php veröffentlicht. Setze ein Lesezeichen auf den Permalink.

6 Antworten auf Empfehlung: dompdf

  1. Oliver sagt:

    html2pdf rockt genau so. Ich bin irgendwann mal von Dompdf weg, weil ich die Linkfarbe nicht ändern konnte. Ist mittlerweile bestimmt behoben, aber ich bin trotzdem bei html2pdf geblieben.


    $pdf = new HTML2PDF();
    $pdf->WriteHTML($html);
    $pdf->Output('output.pdf', 'D');

    Mit html, css, Bildern, 300 dpi, absolutem Positionieren, eigene Schriften, Signieren usw. hab ich bisher keine Probleme gehabt.

  2. Alex sagt:

    Hat man einen eigenen Server und möchte man frei in der Gestaltung sein, kann ich jedem nur empfehlen sich mit dem Thema XSL/T, FO und FOP zu beschäftigen.

    Nur damit könnt ihr wirklich ziemlich coole Sachen machen ;)

    1. zapmuc sagt:

      diejenigen, die XSL-FO nutzen wollen, aber keine Zeit, Lust oder Möglichkeiten haben, einen eigenen Server aufzusetzen, können PDFNow nutzen:

      http://www.pdfnow.com

      Dort gibt es auch Beispiel-Vorlagen für Geschäftsbriefe und Rechnungen zum Herunterladen und Anpassen.

      Damit hat man dann auch Features wie Kopf-/Fußzeilen, Seitenumbrüche, Seitenzahlen, verschiedene Layouts für Erste- und Folgeseite, etc.

  3. Achim sagt:

    Hallo
    ich habe das obige Script von Zeile 1 bis 28 eins zu ein Kopiert , aber ich bekomme folgende Fehlermeldung:
    Unable to stream pdf: headers already sent
    Keine Ahnung wo rann das liegen könnte vielleicht hat jemand von Euch eine Idee.

    Vielen Dank

  4. sagichnicht sagt:

    Hallo Achim

    die Lösung ist recht einfach.
    Entferne alle Leerzeichen in deinem Quellcode und fertig.

    Richtig :
    require_once ‚dompdf/autoload.inc.php‘;
    use Dompdf\Dompdf;
    $dompdf = new Dompdf();
    $dompdf->loadHtml(file_get_contents(‚ma_zwischenspeicher.php‘));
    $dompdf->setPaper(‚A4′,’portrait‘);

    Falsch:
    require_once ‚dompdf/autoload.inc.php‘;
    use Dompdf\Dompdf;

    $dompdf = new Dompdf();

    $dompdf->loadHtml(file_get_contents(‚ma_zwischenspeicher.php‘));

    $dompdf->setPaper(‚A4′,’portrait‘);

  5. Reinhard sagt:

    Hallo Allerseits,
    Wir hier verwenden z.Z. TCPDF. Welches leider nur sehr eingeschränkt ist. Ich würde z.B. das Positionieren von Text, Tabellen, usw. mittels style oder CSS Angaben brauchen.

    Beispiel: eine Tabelle 20% der Breite nur nur auf der rechten Seite. 2 Tabellen nebeneinander (float: left). Absolutes Position, usw.

Schreibe einen Kommentar

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