PDF aus XML und XSL:FO

08.03.2002 von Mike Hartmann
XML trennt Inhalt und Form. Mit XSL:FO lassen sich die XML-Daten in ein ansprechendes Layout bringen. Wir zeigen, wie Sie aus Ihren Daten automatisch PDFs erzeugen.

Mit der eXtensible Markup Language (XML) will man Inhalt, Struktur und Darstellung der Daten voneinander trennen. Die Struktur der Daten wird durch eine DTD oder ein Schema bestimmt, die Daten selbst finden sich in der XML-Datei.

Bisher benutzte man primär XSLT, um die Daten mittels HTML darzustellen. Für die Ausgabe auf einen Drucker eignet sich HTML jedoch nur bedingt. Zwar lässt sich beispielsweise ein ganzer Artikel in einem einzigen HTML-Dokument unterbringen. Dieses wird aber beispielsweise beim Ausdrucken unvorhersagbar auf mehrere A4-Seiten verteilt. Einen Einfluss auf die Aufteilung haben weder der Autor noch der Benutzer. Features wie Inhaltsverzeichnis oder Fußnoten sind ebenfalls nur über Umwege zu realisieren.

Mit den Formatting Objects der aktuellen XSL-Recommendation ist das kein Problem mehr. Die richtigen Tools erlauben sogar eine direkte Ausgabe des formatierten Dokuments in PDF oder RTF.

Hinweis: Dies ist ein "interaktiver" Artikel. Wir stellen Ihnen hier zunächst die wichtigsten Grundzüge von XSL:FO und einige Tools zum Starten vor. Wenn Sie im Verlauf Ihrer Experimente auf Fragen stoßen oder selbst interessante Formatierungslösungen entwickelt haben, senden Sie eine E-Mail an uns und wir nehmen sie in die nächsten Updates mit auf. Bitte hängen Sie an die E-Mail auch die notwendigen Sourcefiles (*.xml, *.xsl und *.fo) an, damit wir Ihre Überlegungen nachvollziehen können.

XSL, XSLT, XPath und FO

Die XSL-Spezifikation besteht aus drei logischen Blöcken:

Über XPath (XML Path Language) werden bestimmte Teile des XML-Dokuments angesprochen. Damit lässt sich beispielsweise aus Kapitelüberschriften zunächst ein Inhaltsverzeichnis erzeugen, bevor die einzelnen Kapitel dargestellt werden.

XSLT (XML Style Language Transformation) beschreibt, wie ein XML-Dokumentenbaum in einen anderen Dokumentenbaum zu konvertieren ist. Beispielsweise von XML in einen anderen XML-Dialekt oder in HTML.

XSL (eXtensible Stylesheet Language) enthält neben XSLT auch die Formatierungsobjekte (FO) und Eigenschaften. Obwohl man durchaus auch eigenständige FO-Dokumente erzeugen kann, ist der eigentliche Sinn dennoch die Verwendung von XSLT, um XML in ein FO-Dokument zu konvertieren.

Einen besonderen Anteil an XSL nehmen die so genannten Formatting Objects (FO) ein, über die sich inhaltsgesteuerte Formatierungen erzeugen lassen. In der derzeitigen Version eignen sich die FO nicht für komplexe Layouts, wie sie beispielsweise in Print-Publikationen benötigt werden. Der Traum vom "einmal schreiben - überall veröffentlichen" bleibt also noch für eine Weile ein Traum.

Grundaufbau eines XSL-FO

Die XSL-FO-Sprache wird durch ein wohlgeformtes XML-Dokument dargestellt, das den fo-Namensraum (www.w3.org/1999/XSL/Format) benutzt. Das Wurzelelement ist fo:root.

<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3c.org/1999/XSL/Format">
...
</fo:root>

Innerhalb dieses Tags werden zunächst die möglichen Seitenlayouts beschrieben und in welcher Reihenfolge diese Seiten auftreten können. Danach folgen die eigentlichen Seiten und ihr Inhalt.

Das Formatierungsmodell von FO basiert auf rechteckigen Bereichen, die Text, Bilder oder wiederum andere Formatierungsobjekte enthalten können. Auf einer Seite können verschiedene Arten von Bereichen auftauchen:

EineSeiteist in bis zu fünf Region-Areas unterteilt (oft auch als Flow bezeichnet): Body für den eigentlichen Seiteninhalt und Before, After, Start und End für Kopfzeilen, Fußzeilen oder Randbemerkungen.

Eine Block-Area ist dadurch gekennzeichnet, dass davor und danach ein Zeilenumbruch platziert wird. Sie entspricht etwa einem Absatz, einer Zwischenüberschrift oder einer Bildunterschrift. Alle Blöcke eines Dokuments werden sequenziell vom Formatter aneinander gereiht.

Eine Line-Area repäsentiert eine Textzeile innerhalbs eines Blocks. Es gibt kein Formatting Object, um eine Line dediziert auszuweisen. Der Formatter erzeugt die Zeilen, indem er den Inhalt eines Blocks umbricht.

Eine Inline-Area ist Bestandteil einer Zeile und dient beispielsweise dazu, Formeln, Grafiken oder Referenzen in den Text einzublenden.

Vier neue Richtungen

Da XSL-FO international verwendbar sein soll, hat das W3C vier neue Richtungsanweisungen eingeführt. Der Grund ist, dass wir beispielsweise in Europa innerhalb einer Zeile von links nach rechts und schreiben und die Zeilen von oben nach unten anordnen (lr-tb). Im arabischen Sprachraum dagegen läuft eine Zeile von rechts nach links (rl-tb). Und in der japanischen Schriftsprache dagegen schreibt man innerhalb der Zeile von oben nach unten und ordnet die Zeilen von rechts nach links an (tb-rl).

Um nun zu vermeiden, dass es mit links, rechts, oben und unten zu Verwirrungen kommt, verwendet man die Bezeichnungen before, after, start und end.

Schlüsselwort

Beschreibung

lr-tb

rl-tb

tb-rl

Before

Vor einem Absatz

oben

oben

rechts

After

Nach einem Absatz

unten

unten

links

Start

Vor einer Zeile

links

rechts

oben

End

Nach einer Zeile

rechts

links

unten

Die Bezeichnungen Top, Bottom, Left und Right können verwendet werden, wenn ein Element wie ein Rahmen unabhängig von der Schreibrichtung gesetzt werden soll.

Grundaufbau einer Seite

Das Tag layout-master-set umschließt die Definitionen für den Aufbau einzelner Seiten und ihrer Abfolge innerhalb des Dokuments. Eine einzelne Seite wird mit dem Tag simple-page-master definiert. Das Attribut master-name legt den Namen der Seitendefinition fest, über das sie später referenziert wird. Deshalb darf der Name auch nur ein Mal vergeben werden.

<fo:layout-master-set>
<fo:simple-page-master master-name="simple"
page-height="29.7cm" page-width="21cm"
margin-top="1cm"
margin-bottom="2cm"
margin-left="2.5cm"
margin-right="2.5cm">
</fo:simple-page-master>
</fo:layout-master-set>

Wichtige Attribute für simple-page-master

Attribut

Bedeutung

Die einzelnen Werte für margin lassen sich auch zusammenfassen. Mittels margin="1cm" setzt man beispielsweise den Rand für alle vier Seiten.

margin-top

Oberer Rand

margin-bottom

Unterer Rand

margin-left

Linker Rand

margin-right

Rechter Rand

page-height

Seitenhöhe

page-width

Seitenbreite

writing-mode

Schreibrichtung (lr-tb, rl-tb, tb-rl)

Regionen einer Seite

Das Inhalts-Rechteck des Referenzbereichs einer Seite kann in bis zu fünf Regionen unterteilt werden. Standardmäßig ist immer region-body im Zentrum des Bereichs vorhanden. An den äußeren Rändern finden sich die Bereiche für Kopfzeile, Fußzeile sowie rechter und linker Randbereich. Die Dimension dieser Bereiche wird lediglich durch das Attribut extent festgelegt:

<fo:region-before extent="3cm"/>

Die Größe von region-body wird durch die margin-Attribute indirekt festgelegt. Hierbei ist zu beachten, dass sich beispielsweise region-body und region-before durchaus überlappen können. Nämlich dann, wenn das Attribut margin-top von region-body kleiner ist als das Attribut extent von region-before:

<fo:region-body margin-top="1cm"/>

Beispielseite mit Regionen

Das Code-Segment

<fo:layout-master-set>
<fo:simple-page-master master-name="simple"
page-height="29.7cm" page-width="21cm"
margin-top="1cm" margin-bottom="2cm"
margin-left="2.5cm" margin-right="2.5cm">
<fo:region-body margin="3cm" />
<fo:region-before extent="3cm" />
<fo:region-after extent="1.5cm" />
<fo:region-start extent="2cm" />
<fo:region-end extent="2cm" />
</fo:simple-page-master>
</fo:layout-master-set>

erzeugt folgendes Seitenlayout. Zur besseren Übersichtlichkeit haben wir Rahmen und Texte hinzugefügt, die im Code nicht auftauchen.

Wie auch das Tag simple-page-master benötigen Regionen einen eindeutigen Namen, der durch das Attribut region-name definiert wird. Ist region-name nicht angegeben, wird per default "xsl-&lt;Bereichsname&gt;" verwendet, also beispielsweise xsl-region-body für den Bereich region-body.

Wichtige Attribute für Regionen

Die wichtigsten Attribute für den Inhaltsbereich sind:

region-body

Attribut

Bedeutung

xxx steht für eine Vielzahl von Unteroptionen zum jeweiligen Attribut. Die wichtigsten Hauptattribute werden später beschrieben.

border-xxx

Rahmenfarbe, -stärke, -stil

padding-xxx

Füllbereich zwischen Rahmen und Inhalt

background-xxx

Hintergrundfarbe, -bild

margin-xxx

Abstand zum Referenzbereich

column-count

Anzahl der Spalten, default: 1

column-gap

Abstand zwischen zwei Spalten, default 12pt

region-name

Eindeutiger Name, default: xsl-region-body

writing-mode

Schreibrichtung (lr-tb, rl-tb, tb-rl), default: wie im simple-page-master eingestellt.

Die Bereiche region-before, region-after, region-start und region-end haben etwas andere Attribute:

region-xxx

Attribut

Bedeutung

xxx steht für eine Vielzahl von Unteroptionen zum jeweiligen Attribut. Die wichtigsten Hauptattribute werden später beschrieben.

border-xxx

Rahmenfarbe, -stärke, -stil

padding-xxx

Füllbereich zwischen Rahmen und Inhalt

background-xxx

Hintergrundfarbe, -bild

extent

Größe des Bereichs

region-name

Eindeutiger Name, default: xsl-region-body

writing-mode

Schreibrichtung (lr-tb, rl-tb, tb-rl), default: wie im simple-page-master eingestellt.

Inhalt für die Regionen

Da die einzelnen Bereiche der Seite definiert sind, können wir sie nun auch mit Inhalt füllen. Dazu dient das Tag page-sequence. Es enthält die Inhalte und Formatierungen für eine Seite oder eine Serie von Seiten. Über das Attribut master-reference wird ein Seitenlayout ausgewählt, das per simple-page-master definiert wurde.

<fo:page-sequence master-reference="simple">
...
</fo:page-sequence>

Sonstige relevante Attribute für page-sequence:

page-sequence

Attribut

Werte

Beschreibung

initial-page-number

Beginn der Seitenzählung. Default: auto

auto

1, wenn dies die erste page-sequence ist, sonst die nächste Seitenzahl.

auto-odd

Wie bei auto, wenn die neue Seitenzahl gerade ist, wird eins addiert, um eine ungerade Seitenzahl zu erreichen.

auto-even

Wie bei auto, wenn die neue Seitenzahl ungerade ist, wird eins addiert, um eine gerade Seitenzahl zu erreichen.

&lt;integer&gt;

Setzt die Seitenzahl auf den angegebenen Integer-Wert.

force-page-count

Dient zur Beschränkung der Seitenzahl in dieser page-sequence. Default: auto

end-on-even

Sorgt dafür, dass die letzte Seite eine gerade Nummer hat, indem ggf. eine leere Seite angefügt wird.

end-on-odd

Sorgt dafür, dass die letzte Seite eine ungerade Nummer hat.

even

Sorgt dafür, dass die Sequenz eine gerade Anzahl von Seiten hat.

odd

Sorgt dafür, dass die Sequenz eine ungerade Anzahl von Seiten hat.

no-force

Keine Restriktion für die Seitenzahl.

auto

Wenn die initial-page-number der nächsten page-sequence gerade ist, wie bei end-on-odd. Ist sie ungerade, wie bei end-on-even.

Flow und Static-Content

Innerhalb des Tags page-sequence lassen sich die einzelnen Bereiche mittels fo:flow und fo:static-content füllen. Das flow-Tag enthält eine Serie von Formatting Objects, die sequenziell im region-body dargestellt werden. Bei Bedarf werden mehrere Seiten mit diesem Layout erzeugt. Mittels static-content füllen Sie die Bereiche region-before, -after, -start und -end. Diese Bereiche werden auf allen erzeugten Seiten wiederholt. Beide Tags haben nur ein Attribut: flow-name gibt den Namen der Region an, der per region-name festgelegt wurde.

<fo:page-sequence master-reference="simple">
<fo:static-content flow-name="xsl-region-before">
...Inhalt der Kopfzeile...
</fo:static-content>
<fo:static-content flow-name="xsl-region-after" >
...Inhalt der Fußzeile...
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
...Inhalt des Content-Bereichs...
</fo:flow>
</fo:page-sequence>

Innerhalb dieser Bereiche enthalten so genannte "Block-Areas" den eigentlichen darzustellenden Inhalt. Block-Areas werden beispielsweise durch die Tags fo:block, fo:table-and-caption oder fo:list-block erzeugt.

fo:block

Das Tag fo:block ist das Herzstück der Formatting Objects und wird primär für Absätze, Zwischenüberschriften oder Bildunterschriften benutzt. Größe, Aussehen und Abstand zu vorhergehenden sowie nachfolgenden Block-Areas wird durch eine Reihe von Attributen bestimmt. Weitere Attribute bestimmten den verwendeten Font, das Verhalten bei Seitenumbrüchen sowie den Zusammenhalt mit vorhergehenden und nachfolgenden Block-Areas.

<fo:block>
Hier könnte ein Absatz stehen, der im Dokument dargestellt wird.
</fo:block>

Ein fo:block kann Text, Inline-Objekte und weitere Block-Areas enthalten. Die wichtigsten Attribute finden Sie auf der nächsten Seite.

Attribute von fo:block

block

Attribut

Bedeutung

xxx steht für eine Vielzahl von Unteroptionen zum jeweiligen Attribut. Die wichtigsten Hauptattribute werden später beschrieben.

border-xxx

Rahmenfarbe, -stärke, -stil

padding-xxx

Füllbereich zwischen Rahmen und Inhalt

background-xxx

Hintergrundfarbe, -bild

margin-xxx

Abstand zum Referenzbereich

font-xxx

Definition der zu verwendenden Schriftart

color

Bestimmt die Schriftfarbe des Blocks

keep-together

Gibt an, ob der Block innerhalb einer Zeile, Spalte oder Seite zusammengehalten werden soll. Bei always darf der Block nicht getrennt werden, auto erlaubt eine Trennung des Blocks und ein Zahlwert legt die Priorität fest, mit der der Block zusammengehalten wird.

line-height

Gibt die Höhe einer Zeile an. Der Wert normal zeigt an, dass die Zeilenhöhe vom Font abhängt. Ein Zahlwert gibt eine festgelegte Höhe an.

orphans

Gibt die minimale Anzahl an Zeilen an, die am Ende einer Seite stehen müssen.

widows

Gibt die minimale Anzahl an Zeilen an, die am Anfang einer Seite stehen müssen.

span

Ist die region-body in Spalten unterteilt, lässt sich mit span ein Block erzeugen, der mehrere Spalten umfasst. Derzeit ist es lediglich möglich eine oder alle Spalten zu umfassen.

text-align

Ausrichtung des Textes. Möglich sind u.a. center, start, end und justify (Blocksatz).

text-align-last

Damit lässt sich die Ausrichtung für die letzte Zeile in einem Block gesondert festlegen, etwa um zu verhindern, dass eine kurze Zeile bei Blocksatz auseinander gezerrt wird.

text-indent

Einrückung der ersten Zeile im Block.

Inline-Areas

Um innerhalb eines Absatzes einzelne Worte kursiv zu schreiben oder zu fetten, benutzt man ds Object fo:inline. Dabei werden keine Zeilenumbrüche erzeugt, sondern der Text läuft ganz normal weiter.

<fo:block>
Ein Test mit <fo:inline font-weight="bold">gefetteter</fo:inline> Schrift.
</fo:block>

Inline-Areas unterstützen in weiten Teilen dieselben Attribute wie Block-Areas:

fo:inline

Attribut

Bedeutung

xxx steht für eine Vielzahl von Unteroptionen zum jeweiligen Attribut. Die wichtigsten Hauptattribute werden später beschrieben.

border-xxx

Rahmenfarbe, -stärke, -stil

padding-xxx

Füllbereich zwischen Rahmen und Inhalt

background-xxx

Hintergrundfarbe, -bild

margin-xxx

Abstand zum Referenzbereich

font-xxx

Definition der zu verwendenden Schriftart.

color

Bestimmt die Schriftfarbe des Blocks

line-height

Gibt die Höhe einer Zeile an. Der Wert normal zeigt an, dass die Zeilenhöhe vom Font abhängt. Ein Zahlwert gibt eine festgelegte Höhe an.

text-decoration

Sorgt für Unterstreichung (underline), Streichung (line-through) etc.

Externe Bilder

Um ein Bild zu verwenden, benutzen Sie das Tag fo:external-graphic und geben über das Attribut src den Dateinamen des zu ladenden Bildes an. Das Tag kann keine weiteren Child-Elemente haben.

Wie das Bild tatsächlich dargestellt wird, hängt von den Größen- und Scaling-Attributen des Tags ab. Ist nur eines der beiden Attribute content-width oder content-height angegeben, wird das Bild so skaliert, dass es in der Breite oder Höhe in den Bereich passt und das Seitenverhältnis beibehalten wird.

Welche Bildformate die einzelnen Formatter unterstützen, ist ganz den Herstellern überlassen. PNG und TIF sind aber meistens dabei.

<fo:block>
<fo:external-graphic src="bild.png"/>
</fo:block>

Die wichtigsten Attribute von fo:external-graphic sind:

fo:external-graphic

Attribut

Bedeutung

xxx steht für eine Vielzahl von Unteroptionen zum jeweiligen Attribut. Die wichtigsten Hauptattribute werden später beschrieben.

border-xxx

Rahmenfarbe, -stärke, -stil

padding-xxx

Füllbereich zwischen Rahmen und Inhalt

background-xxx

Hintergrundfarbe, -bild

margin-xxx

Abstand zum Referenzbereich

line-height

Gibt die Höhe einer Zeile an. Der Wert normal zeigt an, dass die Zeilenhöhe vom Bild abhängt. Ein Zahlwert gibt eine festgelegte Höhe an.

content-height

Gibt die Höhe an, mit der das Bild darzustellen ist.

content-width

Gibt die Breite an, mit der das Bild darzustellen ist.

scaling

Legt fest, ob das Seitenverhältnis des Bildes beibehalten werden soll (uniform) oder nicht (non-uniform).

src

Verweist auf die anzuzeigende Bilddatei.

Attribute: border

Mit Attribut border und seinen Unterattributen lassen sich Rahmen um Bereiche definieren. Rahmen werden durch Farbe (color), Stil (style) und Breite (width) gekennzeichnet und lassen sich bei Bedarf dediziert für die einzelnen Ränder (top, bottom, left, right) einstellen. Mittels der Schlüsselworte start, end, before und after berücksichtigen Sie die Schreibrichtung.

<fo:block border-color="grey" border-width="1pt" border-style="dotted">
Umrahmter Block
</fo:block>

Um nur eine Seite mit einem Rahmen zu versehen, geben Sie einfach zusätzlich die Seite an, etwa border-top-style, um den Stil der oberen Rahmenkante zu setzen.

Für color können Sie entweder eine Systemfarbe wie beispielsweise "black" angeben oder einen RGB-Wert in der Form "#FF0000".

Die Breite des Rahmens legen Sie mit width fest. Dazu können Sie den expliziten Wert angeben oder eines der Schlüsselwörter "thin", "medium" oder "thick".

Der Stil wird durch eines der folgenden Schlüsselwörter definiert:

Optional lässt sich die Definition des Rahmens auch verkürzt darstellen, indem alle Parameter in einem String festgelegt werden:

<fo:block border="grey 1pt dotted">
Umrahmter Block
</fo:block>

Attribute: font

Ein wichtiges Gestaltungsmerkmal bei Dokumenten ist die verwendete Schriftart. Mittels font-family legen Sie den in einem Block zu nutzenden Font fest. Geben Sie dabei eine Klasse von Fonts an, hängt der tatsächlich verwendete Font von der eingesetzten Software ab. Als Klassen kommen in Frage:

<fo:block font-family="serif" >Schrift mit Serifen</fo:block>
<fo:block font-family="sans-serif" >Schrift ohne Serifen</fo:block>
<fo:block font-family="cursive" >Schräggestellte Schrift</fo:block>
<fo:block font-family="monospace" >Schrift mit fester Laufweite</fo:block>

Statt einer Klasse können Sie auch Schriftarten und gleich mögliche Alternativen direkt angeben. Im folgenden Beispiel verwendet der Formatter wenn möglich die Schrift Garamond, andernfalls eine Schrift mit Serifen.

<fo:block font-family="'Garamond' serif">
Text in Garamond
</fo:block>

Über das Attribut font-size legen Sie die Schriftgröße fest. Dabei können Sie neben der Größenangabe in Punkten auch relative Größenangaben machen. Beispielsweise sorgt "larger" dafür, dass die Schrift größer ist als die im Parent-Element. Die Spezifikation schlägt einen Skalierungsfaktor von 1,2 vor.

font: weitere Möglichkeiten

Neben Schriftart und -größe lassen sich weitere Font-Variationen erzeugen.

Mittels font-stretch lässt sich die Laufweite der Schriftart in neun Schritten zwischen "ultra-condensed" und "ultra-expanded" verändern. Allerdings kann derzeit keiner der drei in diesem Artikel vorgestellten Formatter dieses Tag auswerten.

Mit dem Attribut font-style wählen Sie beispielsweise eine kursive Schrift ("italic"). Die anderen möglichen Werte "backslant" und "oblique" werden von den drei Tools nicht unterstützt.

Das Attribut font-weight bestimmt, wie stark gefettet der Text dargestellt wird. Dabei stehen die Werte normal und bold sowie 100, 200, 300, 400 (wie normal), 500, 600, 700 (wie bold), 800 und 900 zur Verfügung.

Über font-variant wählen Sie bei Bedarf eine Schriftart mit Kapitälchen aus:

<fo:block font-family="serif" font-variant="small-caps">
Kapitälchen
</fo:block>

Verfügbare Tools zur XSL-Formatierung

Derzeit gibt es nur wenige Tools, mit denen sich Formatting Objects rendern lassen. Die drei hier vorgestellten sind schon relativ ausgereift und unterstützen einen Großtei der aktuellen W3C-Recommendation. Mit allen dreien lassen sich PDFs erzeugen. In Sourceforge finden sich weitere Projekte, mit denen sich auch RTFs oder andere Dateiformate erstellen lassen.

Apache: FOP 0.20.3rc2

Aus den Projekten rund um Apache stammt das in Java programmierte Open-Source-Tool FOP. Die aktuelle Version 0.20.3 unterstützt den W3C-Vorschlag vom 15. Otober 2001 zum großen Teil. Lediglich bei Tabellen gibt es eine größere Einschränkung: Hier müssen die Spaltenbreiten explizit angegeben werden. Als Ausgabeformate kommen neben PDF auch Postscript und PCL in Frage. Derzeit wird an einem kompletten Re-Design gearbeitet.

Die voll funktionsfähige Version kann in einem 5,9 MByte großen Archiv vom Apache-Server geladen werden und ist sowohl unter Linux als auch unter Windows einsatzfähig.

Antennahouse: XSLFormatter 2.0

Eine Sonderstellung nimmt der XSLFormatter von Antennahouse ein. Er ist nicht in Java programmiert, sondern als ActiveX-Object, so dass er sich sehr einfach in Windows-Applikationen einbinden lässt. Zudem erzeugt die Applikation zunächst eine Vorschau, die man drucken oder - mit einem Zusatzmodul - als PDF speichern kann. Laut Hersteller implementiert der XSLFormatter einen Großteil der Spezifikation vom 15. Oktober. Lediglich bei Farbprofilen und dem Object float muss das Tool passen.

Bei einem Preis von 4480 Dollar für eine Server-Lizenz inklusive PDF-Ausgabe eignet sich das Tool nur für Firmen mit hohem Bedarf an PDFs. In der downloadbaren Demoversion blendet das Programm auf jeder Seite unten links einen Verweis auf den Hersteller ein.

Der Download des Basispakets ist 4,2 MByte groß. Dazu kommen 4,48 MByte für die PDF-Option.

RenderX: XEP 2.72

Von der kleinen Firma RenderX stammt das schon sehr lange am Markt befindliche Java-Tool XEP. Es läuft unter Windows und Linux und unterstützt ebenfalls den W3C-Vorschlag vom letzten Oktober. Schwierigkeiten hat XEP vor allem mit der dynamischen Größenanpassung von Tabellen.

Mit einem Preis von 5000 Dollar pro Server-CPU ist RenderX das teuerste Tool im Feld. Die Ausgabe als Postscript-Datei kostet zusätzlich 500 Dollar pro CPU. Die Demoversion schreibt auf jede erzeugte Seite einen Verweis auf RenderX. Zusätzlich bleiben ab der elften Seite alle geraden Seiten leer.

Die 5,0 MByte große Datei ist als Installer für Windows verfügbar oder als normales Class-Paket für Linux.

Fazit

Die Kombination aus XML, XSL:FO und einem FO-Renderer bietet interessante Möglichkeiten bei der Verarbeitung von Inhalten. Aus einem XML-Dokument lassen sich nicht nur HTML-Seiten generieren, sondern auch professionell aussehende PDF-Dateien. Beispielsweise könnte man so aus Eingaben von Webformularen gleich einen fertig ausgefüllten Vertrag als PDF an den Benutzer zurückschicken. Auch längere Texte wie etwa Dokumentationen lassen sich für verschiedene Medien aufbereiten, ohne an den Quellen etwas zu ändern.

Da die meisten Tools in diesem Bereich recht teuer sind, bleibt meistens nur FOP aus dem Apache-Projekt als Mittel der Wahl, doch der muss sich vor den teuren Lösungen nicht verstecken. (mha)