Formatting Objects (FO) / FOP mit ANT

FOP mit ANT

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 / 13. April 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/FO1_4.html