XML mit Java OpenSource. (c) Mark Egloff 2004 FOP. << Apache s FOP >>

Größe: px
Ab Seite anzeigen:

Download "XML mit Java OpenSource. (c) Mark Egloff 2004 FOP. << Apache s FOP >>"

Transkript

1 FOP << Apache s FOP >> 1

2 Was ist FOP? FOP FOP = Formatting Object Processor Ein FOP Prozessor setzt die XML FO Dateien gemäss den Anweisungen in das jeweilige binäre Format um Apache besitzt eine Opensource Implementation eines solchen FO Prozessors Er lässt sich via Command Line sowie direkt im Java Code verwenden. 2

3 Installation von Apache s FOP FOP Apache s FOP benötigt zusätzlich andere Java Libraries. Die notwendigsten sind jedoch in der Distribution enthalten 3 Diese externen Libraries müssen im CLASSPATH vorhanden sein. Falls Java 1.3 muss Xalan eingebunden werden Bei Java 1.4 endorsed Mechanism beachten

4 FOP FOP ausführen per Commandline Apache s FOP bietet zur Ausführung eine main Applikation an: org.apache.fop.apps.fop z.b.: C:\> java -Djava.endorsed.dirs=lib\endorsed cp lib\fop.jar;lib\batik.jar;... org.apache.fop.apps.fop -fo hello.fo -pdf hello.pdf wichtigste Parameter -XML file.xml -XSL file.xsl -fo file.fo -pdf -pcl -awt -ps -svg -at Beschreibung input XML u. XSL falls zuerst eine XSLT durchgeführt werden soll um ein XML FO zu erstellen input XML FO, falls keine XSLT durchgeführt soll output filename für das jeweilige Format. Nur eine Ausgabe gleichzeitig möglich. 4 -c config.xml optionales Config File um z.b. Fonts einzubetten

5 FOP ausführen per Commandline FOP z.b.: PDF anhand einer XML-FO Datei erzeugen <xml> <xml> FO FO FOP PDF PDF C:\> java cp lib\fop.jar;lib\batik.jar;... org.apache.fop.apps.fop -fo hello.fo -pdf hello.pdf Parameter Beschreibung -fo file.fo input XML FO, fertiges XML mit FO Elementen -pdf file.pdf Ausgabe File als PDF 5

6 FOP FOP ausführen per Commandline z.b.: zuerst XSL Transformation, dann PDF Generierung <xml> <xml> hello hello XSLT Processor FOP PDF PDF <xsl> <xsl> FO FO C:\> java cp lib\fop.jar;lib\batik.jar;... org.apache.fop.apps.fop -xml hello.xml xsl hello.fo.xsl -pdf hello.pdf 6 Parameter -XML file.xml -XSL file.xsl Beschreibung -pdf file.pdf Ausgabe File als PDF input XML u. XSL falls zuerst eine XSLT durchgeführt werden soll um ein XML FO zu erstellen

7 FOP in Java Programm einbetten (1/2) FOP FOP bietet ein einfaches Java API um direkt PDF aus dem Programm zu erzeugen 7 import org.apache.fop.apps.*; <xml> <xml> import java.io.*; FO FO public class ExampleFOPRun { public static void main(string[] args) { try { // create new FOP Driver driver = new Driver();... FOP PDF PDF //Setup logging here if needed: driver.setlogger(... //read fop config file if needed static pattern inside new Options(new File("myFOPconfig.xml"));

8 FOP in Java Programm einbetten (2/2) FOP } } //set Outputformat driver.setrenderer(driver.render_pdf); // set Input for reading XML FO data driver.setinputsource("hello.fo"); // set Output File driver.setoutputstream("hello.pdf"); // Execute FOP driver.run(); } catch( Exception ex) {... } 8

9 9 FOP FOP in Java Programm einbetten mit XSLT (1/2) import java.io.*; import javax.xml.transform.*; import javax.xml.transform.stream.*; import javax.xml.transform.sax.*; import org.apache.fop.apps.*; public class ExampleXML2PDFRun { public static void main(string[] args) { try { // create new FOP Driver driver = new Driver();... <xml> <xml> FOP <xsl> <xsl> FO FO //Setup logging here if needed: driver.setlogger(... PDF PDF //read fop config file if needed static pattern inside new Options(new File("myFOPconfig.xml"));

10 10 FOP FOP in Java Programm einbetten mit XSLT (2/2) }} //Set Outputformat and Output File driver.setrenderer(driver.render_pdf); driver.setoutputstream(new FileOutputStream("hello.pdf")); //Setup XSLT TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newtransformer( new StreamSource(new File("hello.xsl"))); //Setup input for XSLT transformation Source src = new StreamSource(new File("hello.xml")); //Resulting SAX events must be piped through to FOP Result res = new SAXResult(driver.getContentHandler()); //Start XSLT transformation and FOP processing transformer.transform(src, res); } catch( Exception ex){... }

11 XSL- FO Links W3C XSL-FO: W3C CSS 2 XSL FO Reference Apache FOP: 11

12 XSL-FO << Einführung in XSL-FO >> 1

13 Übersicht / Lernziele: XSL-FO Was ist XSL-FO? Was ist ein Format Prozessor? Anwendungen mit XSL-FO realisieren Syntax und Funktionsweise von XSL-FO XSL-FO Transformation mit FOP und Xalan Apache FOP API kennen Aus XSL-FO PDF erstellen 2

14 Was ist XSL-FO? XSL-FO FO = Formatting Objects Mittels XSL-FO ist eine Sprache um XML Daten für Präsentationsmedien zu formatieren. XSL-FO ist ein Standard, es wurde in die XSL W3C Spezifikation aufgenommen. Die Formatierungen sind nach dem CSS 2 W3C Standard spezifiziert 3 XSL-FO wird verwendet um die Präsentation von Daten mittels XML zu beschreiben. Diese können später mittels einem Prozessor in binäre Präsentations Formate wie PDF, Postscript etc. überführt werden.

15 Prinzip von XSL-FO XSL-FO App <xml> <xml> XSLT Processor <xml> <xml> FO FO FOP Serializer <xsl> <xsl> FO FO SVG SVG TXT TXT XML XML RTF RTF PDF PDF PCL PCL Post Post Script Script MTF MTF Ein XSLT Prozessor transformiert eingehende XML Daten in das XML FO Textformat. 4 Ein Formatting Prozessor (FOP) erstellt daraus eine binäre Datei z.b. PDF, RTF, SVG, PS etc.

16 Was ist XSL-FO? XSL-FO Mittels XSL-FO können wir bekannte Formatierungen anwenden Listen Tabellen Hyperlinks Kopf- u- Fusszeilen Fussnoten Seitenformate Seitennummerierungen unterschiedliche Schreibrichtungen 5

17 6 Beispiel XML-FO und FOP: XSL-FO <fo:root xmlns:fo=" <fo:layout-master-set> <fo:simple-page-master master-name="only" page-width="5.5cm" margin-left="1cm"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="only"> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="18pt"> A small <fo:external-graphic src="file:fo.jpg"/> example </fo:block> </fo:flow> </fo:page-sequence> </fo:root>

18 Beispiel XML-FO und FOP: XSL-FO <xml> <xml> FO FO FOP Serializer PDF PDF 7

19 Übersicht XSL-FO Syntax Der XSL-FO Synatx ist eine sehr umfangreich. Besitzt viele Formatierungs-Möglichkeiten Der Syntax besteht aus 56 vordefinierten XML Elementen Die Detailformatierungen werden mit Attributen vorgenommen. Es gibt hierbei 246 vordefinierte Eigenschaften, wobei jedes XML FO Element seine spezifischen Attribute besitzen kann 8 z.b.: <fo:block font-size="24pt" text-align="center"> Ein erster Text </fo:block>

20 9 XSL-FO Elemente fo:basic-link, fo:bidi-override, fo:block, fo:block-container, fo:character, fo:color-profile, fo:conditional-page-master-reference, fo:declarations, fo:external-graphic, fo:float, fo:flow, fo:footnote, fo:footnote-body, fo:initial-property-set, fo:inline, fo:inline-container, fo:instream-foreign-object, fo:layout-master-set, fo:leader, fo:listblock, fo:list-item, fo:list-item-body, fo:list-item-label, fo:marker, fo:multi-case, fo:multi-properties, fo:multi-property-set, fo:multiswitch, fo:multi-toggle, fo:page-number, fo:page-number-citation, fo:page-sequence, fo:page-sequence-master, fo:region-after, fo:region-before, fo:region-body, fo:region-end, fo:region-start, fo:repeatable-page-master-alternatives, fo:repeatable-page-masterreference, fo:retrieve-marker, fo:root, fo:simple-page-master, fo:single-page-master-reference, fo:static-content, fo:table,

21 XSL-FO - Aufbau Übersicht, Aufbau einer XSL-FO Datei: XSL-FO Root Layouts Layout A Layout B PageSequence A Content <fo:root> <fo:layout-master-set> <fo:simple-page-master/> <fo:simple-page-master/> </fo:layout-master-set> <fo:page-sequence> <fo:flow/> 10 Page Sequence B </fo:page-sequence <fo:page-sequence/> </fo:root>

22 XSL-FO - Aufbau Übersicht, Aufbau einer XSL-FO Datei: fo:root fo:layout-master-set fo:declarations fo:page-sequence fo:simple-page-master fo:color-profile fo:title fo:flow fo:region-body fo:region-before fo:page-sequence-master fo:static-content fo:region-start fo:region-end fo:single-pagemaster-reference fo:repeatablepage-masterreference fo:repeatablepage-masteralternatives 11 fo:region-after fo:conditional-pagemaster-reference

23 <fo:root> : XSL-FO Root Element Jedes XSL-FO Dokument beginnt mit dem <fo:root> Element Der Namespace fo ist fest vorgegeben. <?xmlversion="1.0"?> <fo:root xmlns:fo=" </fo:root> 12

24 <fo:layout-master-set> : Einleitung Layout Definitionen Mittels <fo:layout-master-set > leiten wir die Layout Definitionen für Seiten ein. Dieses Element beinhalte alle einzelnen Layout Definitionen die mittels separaten Elementen beschrieben werden. <?xmlversion="1.0"?> <fo:root xmlns:fo=" <fo:layout-master-set>... </fo:layout-master-set> 13 </fo:root>

25 <fo:simple-page-master> : Seitenaufteilung und Layout Mittels dem Element <fo:simple-page-master> legen wir die Seitengrösse, Seitenränder sowie spätere Unterregionen fest. <fo:root xmlns:fo=" <fo:layout-master-set> <fo:simple-page-master master-name="first" page-height="297mm" page-width="210mm" margin-top="15mm" margin-bottom="15mm" margin-left="20mm" margin-right="15mm"/> </fo:layout-master-set> </fo:root> 14 Jedes <fo:simple-page-master> Element besitzt einen eindeutigen Namen um es später einer Page-Sequence zuzuordnen

26 <fo:region-xxxx> : Seitenaufteilung Eine Seite ist aufgeteilt in fünf Regionen: region-before, region-after, region-start, region-end region-body 15

27 <fo:region-xxxx> : Beispiel Bereiche definieren Region-Before Region-Body Region-After 16

28 <fo:region-xxxx> : Beispiel Bereiche definieren <fo:root xmlns:fo=" <fo:layout-master-set> <fo:simple-page-master master-name="first" page-height="100mm" page-width="90mm" margin-top="15mm" margin-bottom="15mm" margin-left="10mm" margin-right="10mm"> <fo:region-before extent="10mm"/> <fo:region-body margin-top="20mm" margin-bottom="15mm" /> <fo:region-after extent="10mm"/> </fo:simple-page-master> </fo:layout-master-set>... </fo:root> 17

29 <fo:page-sequence>: Seiten-Instanzen Mittels dem Element <fo:page-sequence> beginnen wir den Dokumentinhalt und verweisen auf ein zuvor definiertes Layout. <fo:root xmlns:fo=" <fo:layout-master-set> <fo:simple-page-master master-name="first".../> </fo:layout-master-set> <fo:page-sequence master-reference="first">... </fo:page-sequence> </fo:root> 18 <fo:page-sequence> muss immer nach <fo:layout-master-set> aufgelistet werden

30 <fo:page-sequence>: Seiten-Instanzen Es besteht die Möglichkeit mehrere Seitenlayout zu definieren und für unterschiedliche Seiten zu verwenden 19 <fo:root xmlns:fo=" <fo:layout-master-set> <fo:simple-page-master master-name="front".../> <fo:simple-page-master master-name="rest".../> </fo:layout-master-set> <fo:page-sequence master-reference="front">... </fo:page-sequence> <fo:page-sequence master-reference="rest">... </fo:page-sequence> </fo:root>

31 <fo:static-content>, <fo:flow>: Regionen festlegen Mittels den Elementen <fo:static-content> und <fo:flow> werden Inhaltsbereiche festgelegt um Content aufzunehmen Diese Inhaltsbereiche verweisen auf ein zuvor definierte Regionen im Layout-Set <fo:static-content> muss für die zuvor definierten Regionen before after start oder end verwendet werden. Der Name ist dabei auf xsl-region-xxxx vorgegeben 20 <fo:flow> kann nur auf die Region body verweisen. Der Name ist dabei auf xsl-regionbody vorgegeben

32 <fo:region-xxxx> :Beispiel Bereiche anwenden 21 <fo:root xmlns:fo=" <fo:page-sequence master-reference="first"> <fo:static-content flow-name="xsl-region-before"> <fo:block>region-before</fo:block> </fo:static-content> <fo:static-content flow-name="xsl-region-after"> <fo:block>region-after</fo:block> </fo:static-content> <fo:flow flow-name="xsl-region-body"> <fo:block> region-body </fo:block> </fo:flow> </fo:page-sequence> </fo:root>

33 <fo:static-content>, <fo:flow>: Regionen festlegen Unterschied static dynamic <fo:static-content> ist nur für statischen Inhalt gedacht. Das heisst er ist für alle Seiten der Page-sequence immer gleich. Verwendung wäre für Header und Footer. <fo:flow> ist nur für dynamische Inhalte gedacht. Passt der Inhalt nicht auf eine Seite so wird es auf der nächsten Seite fortgesetzt. Hier wird also der eigentliche Content eingebettet. 22

34 <fo:block>: Textbereich festlegen Mittels dem Element <fo:block> legen wir einen Textbereich fest. Text kann nur mit diesem Element platziert werden. 23 z.b.: <fo:root xmlns:fo=" <fo:page-sequence master-reference="first"> <fo:flow flow-name="xsl-region-body"> <fo:block>hello World!</fo:block> </fo:flow> </fo:page-sequence> </fo:root>

35 <fo:block>: Textbereich festlegen Innerhalb <fo:block> passieren die Zeilenumbrüche automatisch Fliesstext Um einen Zeilenumbruch zu erzwingen muss ein neues Element <fo:block> verwendet werden z.b.: <fo:block> Ende einer Zeile... </fo:block> <fo:block> neue Zeile... </fo:block> <fo:block> Ende einer Zeile... <fo:block> neue Zeile... </fo:block> </fo:block> 24

36 25 <fo:block> : Textformatierungen festlegen Textformatierungen werden mittels Attributen festgelegt: font-family font-style font-weight text-decoration font-size line-height color background-color text-align z.b.: <fo:block > Hello World! </fo:block> serif, sans-serif, cursive, fantasy, monospace normal, italic, oblique, backslant, inherit normal, bold, bolder, lighter, inherit underline, overline, line-through <length, absolute-size, relative-size, percentage> <length, absolute-size, relative-size, percentage> red, blue, green,, rgb(255,0,55), transparent red, blue, green,, rgb(255,0,55), transparent start, center, end, justify font-family="sans-serif" font-size="10pt"

37 <fo:block> : Ränder und Abstände festlegen Ränder: border-color border-style border-width red, blue, green,, rgb(255,0,55), transparent none, hidden, dotted, dashed, solid, double, <length>, thin, medium, thick Abstände: margin-top / margin-left / margin-right / margin-bottom <length>, <percentage>, auto 26 z.b.: <fo:block <fo:block border-width="2pt" border-style="solid" border-color="black">...</fo:block> border="2pt solid black">...</fo:block>

38 27 <fo:inline>: Textabschnitt festlegen z.b.: Das Element <fo:inline> wird innerhalb eines <fo:block> benutzt um einen Textabschnitt zu definieren <fo:inline> wird oft verwendet um eine Formatierung vorzunehmen ohne einen Zeilenumbruch zu verursachen <fo:block font-family="timesroman"> Hier ist <fo:inline font-style="italic"> ein </fo:inline> Abschnitt <fo:inline font-weight="bold"> mit </fo:inline> verschiedenen <fo:inline color="blue"> Formaten.</fo:inline> </fo:block>

39 <fo:block-container>: Textbox festlegen Ein <fo:block-container> Element kann an beliebiger Stelle auf des Seite (absolut) positioniert werden: z.b.: <fo:block-container border-color="black" border-style="solid" border-width="3pt" height="1cm" width="4cm" padding="5pt" top="9.5cm" left="12cm" position="absolute" > <fo:block font-family="sans-serif" font-size="10pt"> Hier ist ein Text </fo:block> </fo:block-container> Hier ist ein Text 28

40 <fo:external-graphic>: Bild einbinden Mittels <fo:external-graphic> wird ein Bild eingefügt Mögliche Bildformate sind GIF und JPG, es ist aber am Hersteller des FO Prozessors überlassen Apache FOP: BMP,EPS,GIF,JPG,PNG,SVG,TIFF <fo:external-graphic> muss in ein <fo:block> oder <fo:inline> eingebettet werden. 29 z.b.: <fo:block> Look at this! <fo:external-graphic src="cup.jpg"/> </fo:block>

41 <fo:leader>: Horizontale Linien Mittels <fo:leader> können horizontale Linien erreicht werden 30 z.b.: Mittels den Attributen wird die Formatierung der Linie bestimmt: leader-pattern space, use-content, rule, dots leader-length <length> rule-style none, dotted, dashed, solid, double, rule-thickness <length> <fo:block> <fo:leader leader-pattern="dots" leaderlength="6cm"/> </fo:block>

42 <fo:list-block>: Auzählungslisten Mittels <fo:list-block> können Aufzählungslisten realisiert werden. Um Listen zu beschreiben benötigt es noch weitere Sub-Elemente <fo:list-item>, <fo:list-item-label>, <fo:list-item-body> fo:list-block fo:list-item fo:list-item-label 31 fo:list-item-body

43 <fo:list-block>: Aufzählungslisten realisieren z.b. <fo:list-block provisional-distance-between-starts="0.5cm"> <fo:list-item> <fo:list-item-label> <fo:block>a)</fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block> Dies ist das erste Listenelement. </fo:block> </fo:list-item-body> </fo:list-item>... </fo:list-block> 32

44 <fo:footnote>: Fussnote Mittels <fo:footnote> kann eine Fussnote angegeben werden Eine Fussnote besteht aus dem Signet und dem Body. Der Body wird mittels einem Sub-Element <fo:footnote-body> beschrieben. fo:footnote fo:footnote-body 33

45 34 <fo:footnote>: Fussnote anwenden z.b.: <fo:block> Die Fussnote <fo:footnote> <fo:inline font-size="6pt" vertical-align="super">1</fo:inline> <fo:footnote-body> <fo:block font-size="10pt"> <fo:leader leader-pattern="rule" leader-length="6cm"/> 1. Hier ist die Fussnote </fo:block> </fo:footnote-body> </fo:footnote> befindet sich typischerweise... </fo:block>

46 <fo:table>: Tabellen definieren Mit dem Element <fo:table> leiten wir eine Tabelle ein. Wie bei HTML besteht auch bei XSL-FO eine Tabelle aus weiteren Subelementen: <fo:table-body>, <fo:table-column>, <fo:table-row>, <fo:table-cell>, <fo:table-header>, <fo:table-footer> fo:table fo:table-column fo:table-header fo:table-body fo:table-footer fo:table-row fo:table-row fo:table-row 35 fo:table-cell fo:table-cell fo:table-cell

47 36 <fo:table>: Tabellen definieren z.b.: <fo:table border="1pt solid black" background-color="#eeeeee"> <fo:table-column column-width="20mm"/> <fo:table-column column-width="30mm"/> <fo:table-header font-weight="bold" background-color="#cccccc"> <fo:table-row> <fo:table-cell border="1pt solid black"> <fo:block>html</fo:block> </fo:table-cell>... </fo:table-row> </fo:table-header> <fo:table-body>... </fo:table-body> </fo:table>

48 37 <fo:table>: Zellen verbinden Tabellenzellen <fo:table-cell> können mit den Attributen number-columns-spanned und number-rows-spanned gruppiert werden <fo:table border="1pt solid black"> <fo:table-column column-width="10mm"/> <fo:table-column column-width="10mm"/> <fo:table-body> <fo:table-row> <fo:table-cell number-columns-spanned="2" border="1pt solid black"> <fo:block>fo</fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table>

49 XSL- FO Links W3C XSL-FO: W3C CSS 2 XSL FO Reference Apache FOP: 38