FOP - was ist das? Der Apache Formatting Objects Processor ist ein Java-Programm, welches mit Hilfe einer XSL-FO-Layout-Beschreibung aus XML-Daten verschiedene Ausgabe formate erzeugt. Für die Erstellung der Beispiele in diesem Artikel wurde FOP in der Version 0.95 verwendet. Mögliche Ausgabeformate von FOP sind unter anderem PDF, PS, PNG und RTF. Das Layout der Ausgabedatei wird in einer XSL-Transformationsdatei festgelegt. Diese beschreibt alle Regeln für die Umwandlung der XML-Daten in das Ausgabeformat. Neben der Beschreibung des Layouts kann in der XSL-Transformationsdatei auch Programmlogik hinterlegt werden. Werden dem FOP-Programm eine entsprechende Eingabedatei im XML-Format und die dazugehörige Layout-Datei übergeben, erzeugt das Programm hieraus die gewünschte Ausgabedatei. Als Grundlage für die Ver wendung von FOP werden eine Datenquelle und eine XSL-FO-Layout-Beschreibung (XSL-Transformationsdatei) benötigt. Dies wird für beide Arten der Implementierung benötigt. FOP kann Standalone oder in einem Java-Programm verwendet werden. Über Bibliotheken kann FOP in eine Java- Anwendung integriert werden und zur Laufzeit zum Beispiel eine PDF-Datei erzeugen. Der Apache Formatting Objects Processor ist Teil des Apache xmlgraphics-Projekts [1]. Mögliche Anwendungsgebiete Grundsätzlich gibt es zwei Möglichkeiten Apache FOP einzusetzen. Zum einen durch direktes Aufrufen des FOP-Programms, zum anderen durch die Implementierung in einem Java-Programm. In der XSL-FO-Layout- Beschreibung können komplexe Logiken und Layouts für das Erstellen einer PDF-Ausgabedatei hinterlegt werden. Es kann auf programmiertechnische Mittel, wie Schleifen und Abfragen bei der Erstellung des Layouts zurückgegriffen werden. Dies erweitert die Anwendungsmöglichkeiten von Apache FOP um ein Vielfaches. So ist es möglich, über Bedingungen, auf einzelne Werte in den Quelldaten zu reagieren und in Abhängigkeit zu dem Wert zum Beispiel unterschiedliche Texte in der Zieldatei (PDF) auszugeben. In einer Layout-Beschreibung können Layouts für unterschiedliche Quelldaten hinterlegen werden, was wiederum ermöglicht, dass mit einer XSL-Transformationsdatei unterschiedliche XML-Strukturen verarbeitet werden können. Mögliche Anwendungen für FOP sind unter anderem: • Erzeugung von Serienbriefen im PDF-Format • Erstellen von Online-Rechnungen über ein Java Servlet • Zusammenstellung von personalisierten Broschüren auf einer Internetseite • Erstellen einer XML-Struktur aus einer Datenbank Das Erzeugen einer XML-Datei aus einer Datenbank ist durch die Verwendung von Java einfach zu realisieren. Im ersten Schritt muss eine Verbindung zu einer Datenbank hergestellt werden. Dies kann über einen JDBC-Connect erfolgen. Ist die Verbindung zur Datenbank hergestellt, kann ein Select ausgeführt werden. Die Ergebnisse werden in einem Resultset bereitgestellt. Der Verbindungsaufbau und die Selektion von XMLDaten sind in Abbildung 1 dargestellt. Als Rückgabewert wird hier ein CLOB (Character Large Object) zurückgegeben. Dies wird durch die Angabe von to_clob im Select- Statement festgelegt. Der Rückgabewert kann in einen String konvertiert werden und als Datei ab- bzw. zwischengespeichert werden. Abbildung 2 zeigt, wie der Rückgabewert als String in einer Datei gespeichert werden kann. Die erzeugte Datei kann als Quelle für die Verarbeitung mit dem FOP-Programm genutzt werden. Ebenso kann die String-Variable bei der FOPImplementierung in Java als Quelle verwendet werden. FOP Standalone einsetzen In dem hier gezeigten Beispiel wird als Datenquelle eine XML-Datei verwendet. In dieser Datei sind Beispieladressen hinterlegt. Der Aufbau der XML-Datei ist in Abbildung 3 dargestellt. Um die Datei verarbeiten zu können, muss eine XSL-FO-Layout-Beschreibung für die XML-Struktur erzeugt werden. Die in unserem Beispiel verwendete Layout-Beschreibung ist in Abbildung 4 zu sehen. Beim Aufruf des FOP-Programms werden dem Programm die Quell- und Zieldateien übergeben. Der verwendete Programmaufruf hat den folgenden Aufbau: C:\>fop –xsl beispiel.xsl –xml daten.xml –pdf MyPDF.pdf Das Ergebnis der Verarbeitung ist eine PDFDatei. Der Inhalt dieser Datei ist schematisch in Abbildung 5 dargestellt. Eine detaillierte Betrachtung der einzelnen Tags der Layout- Beschreibung würde an dieser Stelle zu weit führen. Hier sei auf die weiterführenden Links verwiesen [2]. Implementierung von FOP in Java Neben der Verarbeitung direkt über das FOPProgramm ist es möglich, FOP in eine Java- Anwendung zu integrieren. Hierzu müssen die mitgelieferten Java-Bibliotheken importiert werden. Die Abbildung 6 zeigt Auszüge vom Quellcode eines Servlet zur Erstellung einer PDF-Datei. Die Bibliotheken für das Java-Programm werden mit dem FOP mitgeliefert. Analog zu der Verarbeitung mit FOP werden in dem dargestellten Java- Quellcode die Quell- und Zieldaten aus dem vorherigen Beispiel verwendet. Im ersten Teil des Quellcodes wird eine XMLDatei erzeugt, die als Basis für die Erstellung der PDF-Datei genutzt wird. Es ist aber auch möglich, die Quellinformationen über Variablen den FOP-Funktionen zu übergeben. In der Zeile 91 des Quellcode werden das Ausgabeformat und die Ergebnisvariable fest gelegt. In diesem Beispiel ist als Ausgabe format PDF angegeben und als Ziel der Transformation eine PDF-Datei. Anschließend muss die XSL-FO-Layout-Beschreibung übergeben werden. Dies geschieht mittels des in Zeile 95 gezeigten Aufrufs im Quellcode. Die XML-Quelldaten werden über den Aufruf in Zeile 99 in das Java-Programm eingelesen. Die eigentliche Transformation wird durch den Aufruf in Zeile 100 gestartet. Das hier gezeigte Beispiel liefert das gleiche Ergebnis, wie bei der Verwendung des FOP-Programms (siehe Abbildung 5). Die Implementierung von FOP in Java kann beispielsweise in Java Servlets eingesetzt werden. Hierzu kann der Quellcode zur PDF-Erstellung in die Request-Verarbeitung des Servlet integriert werden. Diese Variante stellt eine sehr einfache Möglichkeit dar, PDF-Dateien online zu erzeugen. Massendatenverarbeitung Für die Verarbeitung sehr großer Datenmengen, wie z.B. die Erstellung von PDF-Dateien mit 100.000 Seiten und mehr, ist die Verwendung von FOP problematisch. Die Laufzeit für die Erstellung einer derart großen Datei kann schnell mehrere Stunden bis Tage betragen. Ein weiterer Aspekt ist die Konfiguration der Java-Umgebung und des FOP-Programms. Wird die Konfiguration nicht angepasst, kommt es leicht zu Performance- Problemen und der Speicher der Java- Umgebung reicht für die Verarbeitung nicht mehr aus. Auch an dieser Stelle sei auf die weiterführenden Links verwiesen [3]. Fazit Mit Apache FOP können Daten in eine entsprechende Formatierung konvertiert und anschließend in einem entsprechenden Format ausgegeben werden. In der Beschreibung des Layouts mittels XSL-FO können auch komplexe Ausgaben und Layouts erzeugt werden. Die Möglichkeit der Verwendung von Logik bei der Layout-Gestaltung bietet eine große Palette von Einsatzmöglichkeiten für Apache FOP. Bei der Verarbeitung von Massendaten kommt FOP aber schnell an seine Grenzen.