-
-
-
- FOP: An Open-Source XSL Formatter and Renderer
-
-
-
-
-
-1) What is FOP?
-2) Compiling FOP
-3) Running FOP
-4) What's Implemented?
-5) Bugs
-6) FOP Relevant Specifications
-
-
- 1) What is FOP?
- FOP is the world's first print formatter driven by XSL formatting
- objects. It is a Java 1.1 application that reads a formatting object
- tree and then turns it into a PDF document. The formatting object
- tree, can be in the form of an XML document (output by an XSLT engine
- like XT or Xalan) or can be passed in memory as a DOM Document or (in
- the case of XT) SAX events.
-
-
- FOP is part of Apache's XML project. The homepage of FOP is
- http:/xml.apache.org/fop (http:/xml.apache.org/fop)
-.
-
-
-
-
-
-
- 2) Compiling FOP
-
- 1. Prerequisites
-
- a) Java 1.1.x or later
-
-
+FOP readme
+
+ Content
+ 1. What is FOP?
+ 2. Downloading FOP
+ 3. Running FOP
+ 4. Features
+ 5. Limitations
+ 6. Compiling FOP
+ 7. Embedding FOP
+ 8. Getting involved
+ 9. FOP Relevant Specifications
+ 10. License
+
+1. What is FOP?
+ FOP is the world's first print formatter driven by XSL formatting
+ objects. It is a Java 1.1 application that reads a formatting object
+ tree and then turns it into a PDF document. The formatting object
+ tree, can be in the form of an XML document (output by an XSLT engine
+ like XT or Xalan) or can be passed in memory as a DOM Document or (in
+ the case of XT) SAX events.
- b) An XML parser
- An XML parser which supports DOM like
- Xerces-J (http://xml.apache.org/xerces-j/index.html)
-.
-
-
- c) XT from James Clark
- Some of the Java source code in FOP is generated from XML using
- XSLT. XT must be used to generate this code.
- XT is an XSL stylesheet processor written in java. At the moment you
- can't use any other processor, because the make file makes use of some
- proprietary features of Clark's xt which allow to write output in more
- then one document. You can find XT at
- James Clark's website (http://www.jclark.com/xml/xt.html)
-. You have to use XT version 19991105 or later.
- (Under windows you shouldn't use the prepackaged xt.exe but also the
- generic jar file, otherwise make won't work)
-
- XT relies on an sax parser like XP (also J. Clark), which can be
- downloaded at James
- Clark's Website (http://www.jclark.com/xml/xp/index.html)
+ FOP is part of Apache's XML project. The homepage of FOP is
+ http:/xml.apache.org/fop (http:/xml.apache.org/fop).
-
-
-
- d) make
- Under windows it has been reported that the use of the cygnus solutions port
- of the GNU utilities works. You can find it at
- Cygnus Solutions (http://sourceware.cygnus.com/cygwin/)
-
-
-
+2. Downloading FOP
+ 2.1. Downloading binaries
+ You can download the latest release version FOP 0.12.0
+ (http://xml.apache.org/dist/fop_bin_0_12_0.jar).
+ NOTE: you do not have to unjar or unzip this jar file.
+ To run FOP from the command line, see Running FOP. If you are
+ interested in embedding FOP in a Java application of your own, see
+ Embedding FOP.
+ 2.2. Downloading source code
+ You can also download the source code v. 0.12.0
+ (http://xml.apache.org/dist/fop_src_0_12_0.jar) as a jar file
+3. Running FOP
- 3) Running FOP
-
- 1) Prerequisites
+ 3.1. Prerequisites
Following software must be installed:
a) Java 1.1.x or later
b) An XML parser which supports SAX and DOM like
- Xerces-J (http://xml.apache.org/xerces-j/index.html)
-.
+ Xerces-J (http://xml.apache.org/xerces-j/index.html).
c) If you have to produce the flow objects files, which are the input for FOP,
you need a transformation utility to create this files from your xml files.
Normally this is an XSLT stylesheet processor like
XT (http://www.jclark.com/xml/xt.html)
-
- or XALAN (http://xml.apache.org/xalan/index.html)
-.
-
-
-
- 2) Starting FOP as an standalone application
- There are three ways of running FOP from the command line.
- a) Batch processing formatting object files:
- java org.apache.fop.apps.CommandLine fo-file pdf-file
+ or XALAN (http://xml.apache.org/xalan/index.html).
+
+ 3.2. Starting FOP as an standalone application
+ There are three ways to run FOP from the command line.
+ a) Batch processing formatting objects (fo) files:
+ java org.apache.fop.apps.CommandLine fo-file pdf-file
b) Batch processing xml files (includes production of the fo-files):
- java org.apache.fop.apps.CommandLine xml-file xsl-file pdf-file
+ java org.apache.fop.apps.CommandLine xml-file xsl-file pdf-file
c) Previewing the fo-file:
- java org.apache.fop.apps.AWTCommandLine fo-file
+ java org.apache.fop.apps.AWTCommandLine fo-file
Each method uses next to the fop classes other packages. The following describes
each method in detail.
-
- a) Method One
+
+ 3.2.1. Method One
One is to first use an XSLT engine to produce the formatting object tree as an
- XML document and then running the class org.apache.fop.apps.CommandLine with the
- formatting object file name and PDF filename as arguments. You will need to include
- FOP, SAX and your SAX Parser in your classpath and so you might invoke
+ XML document and then running the class org.apache.fop.apps.CommandLine with the
+ formatting object file name and PDF filename as arguments. You need to set classpath
+ and set the used sax parser according to your enviroment
- java -cp fop_x_xx_x.jar;sax.jar;xp.jar
- org.apache.fop.apps.CommandLine formatting-tree-file pdf-file
- If your SAX Parser is other than XP, you will need to set the property
- org.xml.sax.parser to the SAX Parser class to use. The following example shows
- the command line, if you use Xerces, the xml parser from xml.apache.org:
+ Classpath settings: You will need to include FOP and your XML Parser
+ in your classpath and so you might invoke FOP, if XP is your sax parser
+ and Xerces-J your DOM parser:
- java -Dorg.xml.sax.parser=org.apache.xerces.parsers.SAXParser
- -cp fop_x_xx_x.jar;xerces.jar
- org.apache.fop.apps.AWTCommandLine formatting-tree-file pdf-file
-
+ java -cp fop_bin_0_12_0.jar;xp.jar;xerces.jar
+ org.apache.fop.apps.CommandLine fo-file pdf-file
+
+ For historical reasons the standard sax parser for FOP is XP from James Clark.
+ This will change in the future to Xerces-J, but at the moment you will need to
+ set the property org.xml.sax.parser to any other SAX Parser class to use.
+ The following example shows the command line, if you use Xerces-J:
+
+ java -Dorg.xml.sax.parser=org.apache.xerces.parsers.SAXParser
+ -cp fop_bin_0_12_0.jar;xerces.jar
+ org.apache.fop.apps.CommandLine fo-file pdf-file
- b) Method Two
+ 3.2.2. Method Two
Rather than performing transformation with an XSLT before invoking FOP, it is
- possible, if you use XT as your XSLT engine, to just call FOP and have it call
- XT for you. To do this, run the class org.apache.fop.apps.CommandLine with the
- source XML file name, XSL file name and PDF file name as arguments. You will
- need to include FOP, SAX, your SAX Parser and XT in your classpath and so you might
- invoke
+ possible, if you use XT as your XSLT engine, to just call FOP and have it call
+ XT for you. To do this, run the class org.apache.fop.apps.CommandLine with the
+ source XML file name, XSL file name and PDF file name as arguments. You will
+ need to include FOP, SAX, your SAX Parser and XT in your classpath and so you might
+ invoke
- java -cp fop_x_xx_x.jar;sax.jar;xp.jar;xt.jar
- org.apache.fop.apps.CommandLine xml-file xsl-file pdf-file
+ java -cp fop_bin_0_12_0.jar;xt.jar;xp.jar;xerces.jar
+ org.apache.fop.apps.CommandLine xml-file xsl-file pdf-file
+
Again, if your SAX Parser is other than XP, you will need to set the property
- org.xml.sax.parser to the SAX Parser class to use.
+ org.xml.sax.parser to the SAX Parser class to use.
-
- c) Method Three
+ 3.2.3. Method Three
If you already produced the FO file, you can preview the results of your
- transformation without using any pdf viewer by invoking FOP with the viewer
- application. You will need to include FOP, SAX and your SAX Parser in your classpath
+ transformation without using any pdf viewer by invoking FOP with the viewer
+ application. You will need to include FOP and your XML Parser in your classpath
- java org.apache.fop.apps.AWTCommandLine formatting-tree-file
+ java -cp fop_bin_0_12_0.jar;xp.jar;xerces.jar
+ org.apache.fop.apps.AWTCommandLine fo-file
+
+ The viewer uses the swing classes.
+
Note: If you are using java 2 or later (i.e. jdk 1.2. or later) you can put all
- needed jar files into the subdirectory jdk1.2.x\jre\lib\ext (windows example). Then
- FOP can be started without classpath:
+ needed jar files into the subdirectory jdk1.2.x\jre\lib\ext (windows example). Then
+ FOP can be started without classpath:
- java org.apache.fop.apps.CommandLine fo-file pdf-file
+ java org.apache.fop.apps.CommandLine fo-file pdf-file
+ 3.3. Running FOP on MacOS
+ Ensure that you have a recent MRJ, and that you have downloaded and
+ unpacked the XP and SAX distributions. The xp.jar and sax.jar files work
+ as is on MacOS.
+
+ Drag the FOP jarfile onto the JBindery icon. When the first dialog
+ appears, type "org.apache.fop.apps.CommandLine" in the "Class name" field.
+ Using UNIX syntax, type the names of the input formatting-object file and
+ the output PDF in the "Optional parameters" field.
+
+ Click on the Classpath icon. To add the xp.jar and sax.jar files, click
+ the "Add .zip file" button, navigate to the file in question, and click
+ Open.
+
+ Once both are added (the FOP jarfile will already be in the list), click
+ Run. A "stdout" window will appear and display FOP runtime messages.
+
+
+ 3.4. Problems
+ If you have problems running FOP, please have a look at the
+ FOP FAQ (faq-running.html). If you don't find a solution there,
+ you can ask for help on the list fop-dev@xml.apache.org. Maybe it is a bug and
+ maybe somebody is already working on it.
+4. Features
+ 4.1. What's Implemented?
+ The following formatting objects and properties of the xsl-fo
+ working draft are implemented. Please have also a look at the
+ section on limitations (limitations.html)
-
- 4) What's Implemented?
- Also see STATUS for what is being worked on.
-
- a) Formatting Objects
-
- root
+ 1) Formatting Objects
+ root
layout-master-set
simple-page-master
region-body
table-row (minimal support)
table-cell (minimal support)
-
-
-
- b) Properties
-
+ 2) Properties
end-indent
page-master-name
page-master-first
padding-left (only in conjunction with background color)
padding-bottom (only in conjunction with background color)
padding-right (only in conjunction with background color)
-
-
-
-
-
- 5) Bugs
- see STATUS file
-
-
-
-
-
- 6) FOP Relevant Specifications
+5. Limitations
+ Although FOP implements the above listed fo objects and properties, sometimes it does so
+ only in a limited way.
+
+ 5.1. list-block
+ The fo working draft allows describes two ways to markup lists.The list-block must
+ have as children either: 1) pairs of fo:list-item-label and fo:list-item-body
+ formatting objects, or 2) fo:list-item formatting objects.
+ At the moment FOP only implements the second way. Therefore a list has a basic
+ structure like this:
+ <fo:list-block>
+ <fo:list-item>
+ <fo:list-item-label><fo:block></fo:block></fo:list-item-label>
+ <fo:list-item-body><fo:block></fo:block></fo:list-item-body>
+ </fo:list-item>
+ </fo:list-block>
+
+ 5.2. Padding
+ Padding works in conjunction with indents and spaces. It is only implemented
+ for blocks. At the moment padding can't be used to make extra space (indents+spaces
+ must be used), but only to control how much the background-color extends beyond
+ the content rectangle.
+
+ 5.3. Tables
+ There two limitations for tables: 1) FOP needs you to explicitly specify column widths
+ 2) Cells have to contain block-level FOs. They can't contain straight character data.
+
+ A working basic example of a table looks like this:
+ <fo:table>
+ <fo:table-column column-width="150pt"/>
+ <fo:table-column column-width="150pt"/>
+ <fo:table-body font-size="10pt" font-family="sans-serif">
+ <fo:table-row>
+ <fo:table-cell>
+ <fo:block>text</fo:block>
+ </fo:table-cell>
+ <fo:table-cell>
+ <fo:block>text</fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ <fo:table-row>
+ <fo:table-cell>
+ <fo:block>text</fo:block>
+ </fo:table-cell>
+ <fo:table-cell>
+ <fo:block>text</fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ <fo:table-row>
+ <fo:table-cell>
+ <fo:block>text</fo:block>
+ </fo:table-cell>
+ <fo:table-cell>
+ <fo:block>text</fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+
+6. Compiling FOP
+
+ 6.1. Prerequisites
+ 6.1.1. Java 1.1.x or later
+ If you use Java 1.1.x you must also seperately include the swing classes, which can
+ be found at the Sun website (http://java.sun.com/products/jfc/#download-swing). From
+ Java 1.2 on (aka Java 2) they are part of the standard distribution.
+
+ 6.1.2. An XML parser
+ An XML parser which supports DOM like Xerces-J
+ (http://xml.apache.org/xerces-j/index.html).
+
+ 6.1.3. XT from James Clark
+ Some of the Java source code in FOP is generated from XML using
+ XSLT. XT must be used to generate this code.
+ XT is an XSL stylesheet processor written in java. At the moment you
+ can't use any other processor, because the make file makes use of some
+ proprietary features of Clark's xt which allow to write output in more
+ then one document. You can find XT at James Clark's website
+ (http://www.jclark.com/xml/xt.html). You have to use XT version 19991105
+ or later. (Under windows you shouldn't use the prepackaged xt.exe but also the
+ generic jar file, otherwise make won't work)
+
+ XT relies on an sax parser like XP (also J. Clark), which can be
+ downloaded at James Clark's Website (http://www.jclark.com/xml/xp/index.html)
+
+ 6.1.4. make
+ Under windows it has been reported that the use of the cygnus solutions port
+ of the GNU utilities works. You can find it at
+ Cygnus Solutions (http://sourceware.cygnus.com/cygwin/)
+
+ 6.2. Compiling FOP on MacOS
+ We strongly recommend the use of Codewarrior Java. You will find
+ a link to more information in the near future.
+
+
+7. Embedding FOP
+
+ Instantiate org.apache.fop.apps.Driver. Once this class is
+ instantiated, methods are called to set the
+ Renderer to use, the (possibly multiple) ElementMapping(s) to
+ use and the PrintWriter to use to output the results of the
+ rendering (where applicable). In the case of the Renderer and
+ ElementMapping(s), the Driver may be supplied either with the
+ object itself, or the name of the class, in which case Driver will
+ instantiate the class itself. The advantage of the latter is it
+ enables runtime determination of Renderer and ElementMapping(s).
+
+ Once the Driver is set up, the buildFOTree method
+ is called. Depending on whether DOM or SAX is being used, the
+ invocation of the method is either buildFOTree(Document) or
+ buildFOTree(Parser, InputSource) respectively.
+
+ A third possibility may be used to build the FO Tree, namely
+ calling getDocumentHandler() and firing the SAX events yourself.
+
+ Once the FO Tree is built, the format() and render() methods may be
+ called in that order.
+
+ Here is an example use of Driver from CommandLine.java:
+
+ Driver driver = new Driver();
+ driver.setRenderer("org.apache.fop.render.pdf.PDFRenderer", version);
+ driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
+ driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
+ driver.setWriter(new PrintWriter(new FileWriter(args[1])));
+ driver.buildFOTree(parser, fileInputSource(args[0]));
+ driver.format();
+ driver.render();
+
+8. Getting involved
+ 8.1. First steps
+ 1. Subscribe to fop-dev@xml.apache.org by sending an email
+ to fop-dev-subscribe@xml.apache.org
+ 2. Read the archives to fop-dev to get an idea of the issues being
+ discussed.
+ 3. Subscribe to fop-cvs@xml.apache.org by sending an email to
+ fop-cvs-subscribe@xml.apache.org (it is important
+ that you follow changes being made).
+ 4. Try :-) to wrap your head around the XSL working draft.
+ 5. Get CVS working on your system.
+ 6. Ask, on fop-dev, any questions you have at all about the code, design, etc.
+ 7. When you feel comfortable modifying the code, send diffs to
+ fop-dev with your contributions.
+ 8. Have fun!
+
+ 8.2. The Ways of FOP
+ The following shows an example use of FOP from org.apache.fop.apps.CommandLine.java:
+
+ 1) Driver driver = new Driver();
+ 2) driver.setRenderer ("org.apache.fop.render.pdf.PDFRenderer", version);
+ 3) driver.addElementMapping ("org.apache.fop.fo.StandardElementMapping");
+ 3) driver.addElementMapping ("org.apache.fop.svg.SVGElementMapping");
+ 4) driver.setWriter (new PrintWriter(new FileWriter(args[1])));
+ 5) driver.buildFOTree(parser, fileInputSource(args[0]));
+ 6) driver.format();
+ 7) driver.render();
+
+ 1. step: Initiate class Driver
+ Driver is the primary class that drives overall FOP process.
+
+ 2. step: Set Renderer
+ You set the renderer for the output format of your choice. At the moment 3 formats are
+ supported: a) pdf (org.apache.fop.render.pdf.PDFRenderer)
+ b) awt (org.apache.fop.render.awt.AWTRenderer)
+ c) xml (org.apache.fop.render.xml.XMLRenderer)
+
+ All renderers implement the interface Renderer which defines the methods an area
+ needs to be laid out.
+
+ The xml renderer is meant for debugging purposes.
+
+ The interface Renderer takes a string as a version argument indicating the application
+ that is producing the output. Many output formats like PDF allow the inclusion
+ of a "Producer" string.
+
+
+ 3. step: Set Element Mapping
+ By setting the element mapping you choose the dictionaries of elements which
+ FOP can handle. At the moment two dictionaries are available:
+ a) Standard xsl elements (org.apache.fop.fo.StandardElementMapping)
+ b) Graphic elements described by SVG (org.apache.fop.svg.SVGElementMapping)
+
+ All element mappings implement the interface ElementMapping.
+
+ 4. step: Set output destination
+ Normally this will be a Printwriter of some sort. If you are just displaying the
+ output on screen you can skip this step.
+
+ 5. step: Build FO Tree
+ Builds the tree of formatting objects contained in the input source. Either walks
+ the tree of the input document (DOM) or uses SAX events to build up the tree
+ by looking up the definitions of the fo in the element mappings. Depending on
+ whether DOM or SAX is being used, the invocation of the method is either
+ buildFOTree(Document) or buildFOTree(Parser, InputSource) respectively.
+
+ 6. step: Build Area Tree from FO Tree
+ By calling format() of the driver class the fo tree is written/formatted into
+ a area tree. Every formatting object knows how to layout itself, that is every
+ formatting object has a an layout method which is now called to produce an area.
+ The setup of the font info for the renderer is also done in this step.
+
+ 7. step: Renderer renders Areas
+ The renderer, which has been set in step 2, is given the area tree. It uses the
+ layout information to output it in its specific format. Example: For the PDF
+ renderer there is a set of methods to create a pdf file containing the FOP
+ supported kind of layout features.
+
+ --------------------------------------------------------------------------
+ If you want to extend the functionality of FOP by adding new formatting objects,
+ you should do the following:
+
+ 1. FO Object: Write a class which contains the description of your formatting
+ object and put it into the package fop.fo.flow, fop.fo.pagination (if it
+ is a property it goes to fop.fo.properties. The classes in this package are
+ generated via an xslt stylesheet located in codegen/properties.xml)
+ 2. Element Mapping: Add it to the list in fop.fo.StandardElementMapping (if it
+ is a property you need to add it to fop.fo.PropertyListBuilder)
+ 3. Area: Either your need can be fulfilled within one of the existing classes
+ in fop.layout, then just add the code to handle the new fo/property or you
+ must write a new one.
+ 4. Renderer: Choose the renderer you are interested in. If you worked on an
+ existing layout class you must add code to handle the new features to the
+ already existing area specific method in the renderer class. Otherwise you
+ have to add a new method.
+
+
+9. FOP Relevant Specifications
XML Recommendation (http://www.w3.org/TR/REC-xml)
-
XSL-FO Working Draft (http://www.w3.org/TR/WD-xsl/)
-
- XSLT Recommandation (http://www.w3.org/TR/xslt)
-
+ XSLT Recommendation (http://www.w3.org/TR/xslt)
PDF Documentation (http://partners.adobe.com/asn/developer/acrosdk/DOCS/pdfspec.pdf)
-
Simple API for XML (SAX) (http://www.megginson.com/SAX/)
-
Document Object Model (DOM) (http://www.w3.org/TR/REC-DOM-Level-1)
-
Namespaces in XML Recommendation (http://www.w3.org/TR/REC-xml-names/)
-
Java JDK 1.1 Documentation (http://java.sun.com/products/jdk/1.1/docs/index.html)
-
-
-
-
-
-
-
-Version: 1.4 1999/11/29 19:45 -
-Contact: James Tauber (jtauber@jtauber.com)
+10. License
+
+ The Apache Software License, Version 1.1
+ Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ 3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment: "This product includes software
+ developed by the Apache Software Foundation (http://www.apache.org/)."
+ Alternately, this acknowledgment may appear in the software itself, if
+ and wherever such third-party acknowledgments normally appear.
+ 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ endorse or promote products derived from this software without prior
+ written permission. For written permission, please contact
+ apache@apache.org.
+ 5. Products derived from this software may not be called "Apache", nor may
+ "Apache" appear in their name, without prior written permission of the
+ Apache Software Foundation.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This software consists of voluntary contributions made by many individuals
+ on behalf of the Apache Software Foundation and was originally created by
+ James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ Software Foundation, please see http://www.apache.org/ (http://www.apache.org/).