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.
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.
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 ;)
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.
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
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‘);
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.