Der heutige Artikel ist auf Wunsch von Michael entstanden. Es ging um das Thema, wie man aus einer HTML-Datei eine PDF Datei erstellen kann und ich habe den Umweg über xsl-fo vorgeschlagen.
XSL-FO steht für Extensible Stylesheet Language – Formatting Objects. Dabei handelt es sich um ein Format, um eine Seite zu beschreiben. Im Gegensatz zu HTML und CSS wurde besonderen Wert auf die Seiten gelegt und somit gibt es viele Möglichkeiten das Seitenlayout, wie man es aus Büchern, Artikeln und ähnlichem kennt zu beschreiben. Man kann hier durchaus in Richtung LaTeX schauen.
Das Format selbst gehört zur xml-Familie. Das hat den Vorteil, dass eine bestehende XML-Datei nach xsl-fo konvertiert werden kann, indem man entsprechende XSL-Transformationen nutzt. Glücklicherweise ist, um die Kurve zum html zu bekommen xhtml genau das Format, was man hier betrachten sollte.
Es handelt sich ebenfalls um ein Format der XML-Familie und ist somit prädestiniert nach xsl-fo transformiert zu werden. Antennahouse bspw. bietet solche xsl-Dateien an. Diese erzeugen mit Hilfe eines XSLT-Prozessors die zugehörigen FO-Dateien.
Alternativ kann man auch css2xslfo benutzen, wenn man noch eine css-Datei zur Verfügung hat und deren Formatierung in das Ergebnis einfließen soll. Es wird bisher nur css2 unterstützt.
Die fertig FO-Datei wird nun durch einen FOP – einen XSL-FO Prozessor – umgewandelt. Um eine PDF-Datei zu erhalten gibt es eigentlich 4 FOPs, die man kennen sollte. XEP von RenderX (den es für die private Nutzung kostenlos gibt), XSLFormatter von Antennahouse, Xinc von Lunasil (nicht zu verwechseln mit dem PHP CI-System) und Apache FOP.
Empfohlen wird zumeist XEP, da Apache FOP nicht die gesamte Referenz abdeckt. Xinc wird seit 2005 nicht mehr weiterentwickelt. Die Generierung der PDF Datei ist zumeist ein kurzer Aufruf, der den Prozessor und Eingabe und Ausgabe Datei umfasst. Wie das im speziellen aussieht hängt natürlich von dem Prozessor ab.
Spannend an der FO-Datei ist nun, dass man nicht auf PDF angewiesen ist. Nutzt man einen anderen Prozessor, kann man auch andere Formate erzeugen. Zum Beispiel gibt es von XMLmind eine FO-Converter, der WordML, ODT und RTF-Dateien erzeugen kann. Somit kann man aus dem Zwischenformat verschiedene Exportformate bedienen.
Anmerkung:
Man sollte nicht unbedingt erwarten, dass in der PDF Datei das zu finden ist, was man in seinem Browser sieht. Dafür ist das Verfahren auch nicht wirklich gedacht. Nutzt man HTML wie es ehemals angedacht war, so kann man aber sehr gute Ergebnisse erzielen. Ich kenne das Verfahren so, dass man für die Konvertierung HTML-Code nutzt, der entsprechend angepasst wurde. Damit kann man sehr gute Ergebnisse erzielen und das bei relativ überschaubarem Aufwand.
Ich kenne xsl-fo vor allem aus der Java-Ecke, weswegen die Prozessoren auch aus diesem Bereich stammen. Wer hier Alternativen kennt, kann die gerne in den Kommentaren ergänzen.