{"id":634,"date":"2012-09-08T18:13:26","date_gmt":"2012-09-08T16:13:26","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=634"},"modified":"2012-09-08T18:13:26","modified_gmt":"2012-09-08T16:13:26","slug":"empfehlung-dompdf","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/empfehlung-dompdf\/","title":{"rendered":"Empfehlung: dompdf"},"content":{"rendered":"<p>Neulich stand das Thema &#8222;Rechnungsgenerierung per PDF&#8220; auf der Agenda. Da ich im PDF-Business noch ein unbeschriebenes Blatt war, stand erstmal etwas Recherche an. Zuerst habe ich mir <a href=\"http:\/\/www.fpdf.org\/\">FPDF<\/a> angeschaut. Ganz ordentliche Dokumentation und soweit auch sehr flexibel, die <a href=\"http:\/\/www.fpdf.org\/en\/tutorial\/index.php\">Tutorials<\/a> sind ein guter Einstieg. Allerdings ist die aktuellste Version vom Juni 2011, FPDF wird nicht mehr weiterentwickelt.<\/p>\n<p>Danach war der Platzhirsch dran: <a href=\"http:\/\/www.tcpdf.org\/\">TCPDF<\/a>. Aktive Weiterentwicklung und extrem m\u00e4chtig. Die <a href=\"http:\/\/www.tcpdf.org\/examples.php\">Beispiele<\/a> zeigen schon, dass mit TCPDF wohl alles m\u00f6glich ist. Und dennoch, ich hab&#8216; recht schnell schlechte Laune dabei bekommen:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$pdf-&gt;MultiCell(0, 0, $text, 1, &#039;L&#039;, 0, 0, &#039;&#039;, &#039;&#039;, true);\r\n<\/pre>\n<p>Ehm, ja. Hat sicher alles seine Daseinsberechtigung und ist bestimmt sehr durchdacht &#8211; mir war es aber f\u00fcr ein kleineres Projekt zu viel des Guten. Generell schleppen alle PDF-Funktionen einen riesigen Berg an Parametern mit sich rum, TCPDF wirkt als w\u00e4re es unkontrolliert gewachsen. Nichtsdestotrotz, eine ganz ordentliche Unterst\u00fctzung von HTML ist mit dabei &#8211; siehe <a href=\"http:\/\/www.tcpdf.org\/examples\/example_048.pdf\">dieses Beispiel<\/a> mit <a href=\"http:\/\/www.tcpdf.org\/examples\/example_048.phps\">Code dazu<\/a>.<\/p>\n<h2>Enter dompdf<\/h2>\n<p>N\u00e4chster Kandidat auf der Agenda war das ebenfalls aktiv weiterentwickelte <a href=\"http:\/\/code.google.com\/p\/dompdf\/\">dompdf<\/a>, welches komplett auf die Verwendung von HTML und CSS f\u00fcr die PDF-Generierung setzt. Naturgem\u00e4\u00df ist die Verwendung von HTML im Print-Bereich schwierig: korrekt platzierte Seitenumbr\u00fcche seien etwa genannt. Trotz dessen: dompdf hat mich vom Fleck weg \u00fcberzeugt. Quasi vollst\u00e4ndige CSS 2 Unterst\u00fczung sorgt f\u00fcr sauberen Code &#8211; die gr\u00e4sslichen <i>cellpadding = &#8230; width = &#8230;<\/i> &#8211; Tabellen wie man sie unter TCPDF gewohnt ist sind obsolet. Zu den <a href=\"http:\/\/pxd.me\/dompdf\/www\/examples.php\">Beispielen<\/a> gehts hier lang.<\/p>\n<p>Ein paar Sahnest\u00fcckchen noch: Absolute Positionierung klappt wunderbar. Das ist f\u00fcr Header und Footer-Elemente von besonderer Bedeutung. Auch die Verwendung von padding und margin f\u00fchlt sich an wie im Browser, insgesamt macht die Library einen sexy Eindruck. Abschlie\u00dfend noch ein kleines Beispiel:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\nrequire_once(&quot;dompdf\/dompdf_config.inc.php&quot;);\r\n               \r\n$html =\r\n&#039;&lt;!doctype html&gt;&lt;html&gt;&lt;head&gt;\r\n&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text\/html; charset=UTF-8&quot; \/&gt;\r\n&lt;style&gt;\r\n    #title { font-size: 35px; }\r\n    #footer { position: absolute; bottom: -10px; font-size: 10px; }\r\n&lt;\/style&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n&lt;h2 id=&quot;title&quot;&gt;Rechnung \/ Lieferschein Nr. 12\/330 vom 28.06.2012&lt;\/h2&gt;\r\n\r\n&lt;table id=&quot;order&quot;&gt;\r\n   ...\r\n&lt;\/table&gt;\r\n\r\n&lt;div id=&quot;footer&quot;&gt;\r\n    XYZ GmbH, Gesch\u00e4ftsf\u00fchrer: Manfred Mustermann. Handelsregistergericht HRB Nr. 1234 \u00b7 Ust-IdNr. DE 1234567 \u00b7 St-Nr. 7654321&lt;br \/&gt;\r\n&lt;\/div&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;&#039;;\r\n \r\n$dompdf = new DOMPDF();\r\n$dompdf-&gt;load_html($html);\r\n$dompdf-&gt;set_paper(&quot;a4&quot;, &#039;portrait&#039;); \r\n$dompdf-&gt;render();\r\n$dompdf-&gt;stream(&quot;rechnung.pdf&quot;, array(&quot;Attachment&quot; =&gt; 0));\r\n<\/pre>\n<p>So hab ich mir das vorgestellt ;). Seitenumbr\u00fcche? Auch kein Problem:<\/p>\n<pre data-enlighter-language=\"html\" class=\"EnlighterJSRAW\">\r\n&lt;p style=&quot;page-break-before: always&quot;&gt;&nbsp;&lt;\/p&gt; \r\n<\/pre>\n<p>Abschlie\u00dfend sei noch das <a href=\"http:\/\/html2pdf.fr\/de\/example\">html2pdf<\/a> Projekt aus Frankreich erw\u00e4hnt, das einen \u00e4hnlichen Ansatz wie dompdf verfolgt. Ausprobiert hab&#8216; ichs allerdings nicht.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neulich stand das Thema &#8222;Rechnungsgenerierung per PDF&#8220; 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 &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/empfehlung-dompdf\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-634","post","type-post","status-publish","format-standard","hentry","category-php"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/634","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=634"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/634\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}