Start - Publikationen - Wissen - TOGAF - Impressum -

PDF und XSL-FO


PDF ist ein plattformunabhängiges Dateiformat der Firma Adobe mit dem seitenbasiertes Drucklayout definiert werden kann. Seitenbasiertes Layout ist eine echte Herausforderung. Denn die beim Layouting anfallenden Informationen (zum Beispiel auf welcher Seite sich eine Information befindet) sind einerseits das Ergebnis des Layoutings, müssen aber andererseits im fertigen Layout eingebunden werden.

Es ist deshalb eine gute Idee, aus den Informationen nicht direkt seitenbasiertes Layout zu erzeugen, sondern ein Zwischenformat. In diesem Zwischenformat sind dann Angaben darüber enthalten, WIE die die Informationen im Layouting behandelt werden sollen ohne das Layouting konkret durchzuführen. Aus diesem Zwischenformat, es enthält also sämtliche Informationen und die Angaben darüber, wie diese Informationen präsentiert werden sollen, kann dann das gewünschte Ausgabeformat generiert werden.

Ein offener Standard für ein solches Zwischenformat ist XSL-FO. Das Apache Projekt "FOP" hat uns die schwierige Aufgabe, aus XSL-FO fertiges PDF zu erzeugen, abgenommen. Die eigentliche Transformation kann dann ein Servlet übernehmen. Die XSL-FO Inhalte sollen dabei als Bytestrom von einer URL geladen werden.

Eine FOP Transformerinstanz kann (und soll) zwar wiederverwendet werden, ist aber leider nicht nebenläufig nutzbar. Deshalb muss im Servlet mit synchronisierten Code gearbeitet werden. Das Laden der Inhalte übernimmt eine StreamSource, diese lädt auch die Ressourcen in der XSL-FO nach (zum Beispiel SVG-Grafiken).

Request +-----------+   lade XSL-FO   
------->|           |<---------------- 
FO URL  | FOP Trans-| lade Ressourcen (SVG etc.)
        | formation |<---------------- 
Response|           |<---------------- 
<-------|           |<---------------- 
  PDF   +-----------+                 
Leider lassen sich die Ressourcen nicht relativ adressieren, da im Kontext einer Webanwendung eine relative URL die eigene Anwendung adressiert. FOP cached alle SVG Grafiken nach ihrer URL für unbestimmte Zeit. Für dynamische Grafiken ist das von FOP empfohlene Vorgehen die Verwendung eines Dummy-URL Zufallsparameters.

XSL-FO und DocBook


XSL-FO ist ein technisches Zwischenformat und für eine Bearbeitung durch Menschen ungeeignet. Am besten wäre es, wenn XSL-FO aus einem menschenlesbaren Format generiert werden könnte. Ist das menschenlesbare Format selber XML kann XSL-FO mit einer XSL-Transformation erzeugt werden. Nun muss man das menschenlesbare Format definieren und eine geeignete XSL-Transformation dazu schreiben. Oder man nutzt das offene DocBook Format, hier ist beides schon erledigt.

Wieder erledigt ein Servlet diese Arbeit. Es erzeugt bei seiner Initialisierung den XSL-Transformer der die Konvertierung von DocBook nach XSL-FO vornimmt. Die Erstellung des Transformers ist ein aufwändigen Prozess, der Transformer wird deshalb wiederverwendet. Er kann nicht nebenläufig benutzt werden, somit ist synchronisierter Code unvermeidlich. Auch hier werden die DocBook-Inhalte nicht direkt vorgegeben, sondern als URL adressiert.

Eine Modularisierung der Quellen wird mit XML-XInclude erreicht und mit

factory.setXIncludeAware(true);
aktiviert. Wieder gilt: die Ressourcen können nicht mit relativen URLs adressiert werden.
Request +-----------+ lade DocBook XML   
------->|           |<---------------- 
XML URL | XSL Trans-| lade XInclude-Ressourcen
        | formation |<---------------- 
Response|           |<---------------- 
<-------|           |<---------------- 
XSL-FO  +-----------+                 

DocBook und JSP


Das XML im DocBook Format soll nun dynamisch aus einer Webanwendung generiert werden. Jede Technologie, die XML generieren kann, kommt in Frage. So können die DocBook-Fragmente beispielsweise durch JSPs repräsentiert werden und alle Werkzeuge des Servlet-Containers stehen dann zur Verfügung.

Request +-----------+   lade Daten
------->|           |<----------------  
        | JSP       |  Backend, FileIO etc.
Response| Engine    | 
<-------|           | 
DocBook +-----------+
 XML                      
Nun kann alles zusammengesteckt werden. Die drei Teilschritte
  1. Erzeugung von DocBook XML im Servlet-Container,
  2. Transformation von DocBook XML nach XSL-FO und
  3. Transformation von XSL-FO nach PDF
können auf unterschiedlichen Instanzen deployed werden, die Funktionalität von 2 und 3 ist dabei auch von anderen Anwendungen verwendbar.
FO URL  +-----------+  lade  +-----------+ lade Doc- +-----------+   
------->| FOP Trans-|<-------| XSL Trans-|<----------| XSL Trans-|  
<-------| formation | XSL-FO | formation | Book XML  | formation | 
   PDF  +-----------+        +-----------+           +-----------+
copyright © 2002-2018 | Dr. Christian Dürr | prozesse-und-systeme.de | all rights reserved