PDFs dynamisch generieren: viele Möglichkeiten
Oft hat man eine Webseite in die man auch eine Export-Möglichkeit einbauen möchte, scheut aber den großen Aufwand, PDFs etc. zu generieren. Doch es gibt auch einfache schnelle Lösungen, die meistens ausreichen. Hier möchte ich einige im Überblick aufzählen.
- Einfach HTML nehmen und daraus ein PDF basteln. Viele Daten, die wir bereits auf der Webseite darstellen, sollen so oder ähnlich in das PDF fließen. Mit geeigneter Strukturierung verhindert man somit doppelten Code. Meine aktuellen Lieblinge für diese Aufgabe sind dompdf und WkhtmlToPDF (siehe Blogartikel). Es gibt aber noch einige mehr, beispielsweise mPDF, das intern FPDF und HTML2FPDF nutzt. Ein älterer Vertreter dieser Spezies ist HTML_ToPDF. Doch diese Lösungen haben einige Probleme, beispielsweise hängt die Ausgabe häufig stark von den Daten ab: HTML ist nicht seitenorientiert, sodass es sehr schwer sein kann ein mehrseitiges PDF zu erzeugen (wo der Seitenumbruch an der korrekten Stelle ist). Auch lässt die Unterstützung von CSS oder nicht-W3C-konformen HTML häufig zu wünschen übrig. Für einfache Einseiter jedoch gut geeignet.
<?php require_once("dompdf_config.inc.php"); $html = '<html><body>'. '<p>Put your html here, or generate it with your favourite '. 'templating system.</p>'. '</body></html>'; $dompdf = new DOMPDF(); $dompdf->load_html($html); $dompdf->render(); $dompdf->stream("sample.pdf");
- Der programmatische Ansatz ist aufwändiger, jedoch hat man mehr Kontrolle über das Layout und die speziellen Eigenschaften von PDFs. Bekannte Vertreter sind FPDF oder TCPDF. Nachteil ist dass evtl. doppelter Code entsteht, und man wirklich für jede Zelle bzw. Zeile einen Aufruf machen muss, das kann für mehrseitige Dokumente schnell in viel Arbeit ausarten. Die Nutzung sieht dann ungefähr so aus:
<?php require('fpdf.php'); $pdf = new FPDF(); $pdf->AddPage(); $pdf->SetFont('Arial','B',16); $pdf->Cell(40,10,'Hello World!'); $pdf->Output();
- Wenn man viele PDFs generieren möchte die alle gleich aussehen, nur unterschiedliche Daten enthalten, kann man die template-basierte Lösung LiveDocx nutzen. Man erstellt ein Word-Template mit Platzhaltern und kann dieses dann mit Daten füllen und damit leicht gut aussehende große Anzahlen an Dokumenten generieren. Dieses Template lädt man dann entweder einmalig zu LiveDocx hoch, oder man lädt es mit jedem Aufruf neu hoch. Dann nutzt dann den SOAP-Service, um die eigentlichen PDFs (oder auch html, docx, doc, rtf bzw. Bilder gif, jpg, png etc.) zu generieren. Die Nutzung ist kostenlos, man kann aber auch gegen Geld einen eigenen Server dort bekommen (mit garantierter Verfügbarkeit, Ressourcen, Bandbreite), oder gar einen eigenen LiveDocx Server ins lokale Netz stellen falls man einem Online-Service nicht traut. Ein einfaches Beispiel unter Nutzung der Zend_Service_LiveDocx Klassen (seit V1.10 im Zend Framework enthalten) sieht so aus:
$mailMerge = new Zend_Service_LiveDocx_MailMerge(); $mailMerge->setUsername('myUsername') ->setPassword('myPassword'); $mailMerge->setLocalTemplate('template.docx'); $mailMerge->assign('software', 'Magic Graphical Compression Suite v1.9') ->assign('licensee', 'Henry Döner-Meyer') ->assign('company', 'Co-Operation') ->assign('date', 'January 11, 2010') ->assign('time', 'January 11, 2010') ->assign('city', 'Berlin') ->assign('country', 'Germany'); $mailMerge->createDocument(); $document = $mailMerge->retrieveDocument('pdf'); file_put_contents('document.pdf', $document);
- Man installiert sich einen Open-Office (oder Libre-Office) Server und nutzt die Möglichkeit der API, Dokument-Konvertierungen durchführen zu lassen. Ein fertiges Produkt auf dieser Methode aufsetzend hat Thorsten Hodes hier bereits im Blog vorgestellt. 84 Formate vor- und zurück sind damit möglich, also viel mehr als nur die Generierung eines PDFs.
- Eine sehr professionelle Lösung ist Prince. Für den nicht-kommerziellen Einsatz ist es kostenlos, hinterlässt aber auf der ersten Seite ein kleines Wasserzeichen. Mit Prince ist es möglich, aus XML PDFs zu generieren, also auch HTML, wobei Prince sehr viele Features unterstützt wie beispielsweise CSS, SVG, WOFF (WebFonts), PDF Kompression und Verschlüsselung usw. Prince ist voll ACID2 kompatibel, eine kommerzielle Einzel-PC Lizenz startet bei 450€, die Servervariante liegt bei 3500€. Eine andere Möglichkeit ist die Nutzung von DocRaptor, einem Online-Dienst hinter dem Prince steckt. Ab 15€ pro Monat geht es los. Also normalerweise nichts für den privaten Einsatz, wollte es aber erwähnt haben.
Ich glaube das waren die Möglichkeiten die man so hat, man ergänze mich falls ich etwas vergessen habe, entweder durch Kommentare oder gar durch einen Gastartikel zum jeweiligen Thema.