XSL-FO / FOP mit ANT
![]() |
![]() |
➪ Die beschriebenen XML-XSL-FO-PDF-Konvertierungsaufrufe können auch mit ANT durchgeführt werden.
Zwar ist es möglich, die XSL-FO-Transformation über die Eingabeaufforderung durchzuführen, ebenso über die Unterstützung durch einen Hochleistungs-XML-Editor.
cd C:\wg\fop-2.2
fop -fo FOtest.fo -pdf FOtest.pdf
Für eine größere Anzahl von Einzelkonvertierungen ist das jedoch zu umständlich. Hier bietet ANT gute Unterstützung. Freilich steht kein Standard-ANT-Task zur Verfügung; dieser muss erst angelegt werden. Eine gute Beschreibung dafür finden Sie in
https://xmlgraphics.apache.org/fop/2.2/anttask.html
Zur Umsetzung müssen die erforderlichen jar-Dateien eingebunden und eine taskdef für fop erstellt werden. Nicht zwingend erforderlich, aber ungemein hilfreich ist die Deklaration von Properties (z.B. fop_path), die später an geeigneten Stellen wieder aufgerufen werden können.
<property name="fop_path" value="C:/wg/fop-2.2"/>
<path id="run-classpath">
<fileset dir="${fop_path}/lib">
<include name="*.jar" />
</fileset>
<pathelement location="${fop_path}/build/fop.jar" />
</path>
<taskdef name="fop"
classname="org.apache.fop.tools.anttasks.Fop"
classpathref="run-classpath" />
Damit ist der Anttask für fop definiert, Sie können es also verwenden. Dafür gibt es verschiedene Möglichkeiten. Im einfachsten Fall sieht der Aufruf so aus:
<target name="fopdemoeinzeln">
<fop format="application/pdf"
fofile="C:/wg/fop-2.2/FOtest.fo"
outfile="C:/wg/fop-2.2/FOtest.pdf"
messagelevel="warn"
force="true"
throwexceptions="false" />
</target>
Durch force='true' wird eine eventuell schon vorhandene PDF-Datei überschrieben. Binden Sie dieses Target in ein ANT-Buildfile ein und rufen es auf, so erhalten Sie vom System die Erfolgsmeldung:
fopdemoeinzeln:
[fop] Feb 04, 2018 5:00:00 PM
org.apache.fop.events.LoggingEventListener processEvent
[fop] INFORMATION: Rendered page #1.
[fop] C:\wg\fop-2.2\FOtest.fo -> C:\wg\fop-2.2\FOtest.pdf
Etwas abstrakter können Sie sich ein Target für die FO-PDF-Transformation schreiben, dem Sie nur noch die Input- und Outputnamen übergeben müssen. Das Target runSingleFOP transformiert eine einzelne FO-Datei in eine einzelne PDF-Datei.
<target name="runSingleFOP">
<fop format="application/pdf"
fofile="${fodatei}"
outfile="${out}"
messagelevel="warn"
force="true"
throwexceptions="false" />
</target>
Aufgerufen wird runSingleFOP dann in einem anderen Target, das die definierten Parameter übernimmt und bei der Gelegenheit auch auf das eingangs erwähnte Property mit ${fop_path} zugreift.
<antcall target="runSingleFOP">
<param name="fodatei"
value="${fop_path}/FOtest.fo" />
<param name="out"
value="${fop_path}/FOtest.pdf" />
</antcall>
Nochmals etwas komplexer arbeitet das Target runAllFOP, das alle FO-Dateien (z.B. "ABC.fo") in einem Verzeichnis in PDF-Dateien mit entsprechenden Namen ("ABC.pdf") in dasselbe Verzeichnis transformiert. Hier geben Sie nur noch das Verzeichnis als Parameter an.
<target name="runAllFOP">
<fop format="application/pdf"
outdir="${verzeichnis}"
messagelevel="warn"
relativebase="true"
throwexceptions="false"
force="true">
<fileset dir="${verzeichnis}">
<include name="**/*.fo"/>
</fileset>
</fop>
</target>
Aufgerufen wird runAllFOP dann in einem anderen Target, z.B. mit:
<antcall target="runAllFOP">
<param name="verzeichnis"
value="${fop_path}/examples/fo/graphics" />
</antcall>
wg / 16. Juni 2020
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de