123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528 |
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
- <!-- $Id$ -->
- <!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" "http://forrest.apache.org/dtd/document-v20.dtd">
- <document>
- <header>
- <title>Apache™ FOP: XSL-FO Input</title>
- <subtitle>Basic Help for Using XML, XSLT, and XSL-FO</subtitle>
- <version>$Revision$</version>
- </header>
- <body>
- <section id="overview">
- <title>Overview</title>
- <p>
- Apache™ FOP uses XSL-FO as input.
- It is the responsibility of the user to make sure that the XSL-FO submitted to FOP is correct.
- The tutorial items presented here are not comprehensive, but are of the FAQ variety. Another
- good FAQ is <fork href="http://www.dpawson.co.uk/xsl/">Dave Pawson's XSL FAQ</fork>.
- </p>
- </section>
- <section id="xml">
- <title>XML Issues</title>
- <section id="xml-special-chars">
- <title>Special Characters</title>
- <p>
- When entering special (non-ASCII) characters in XML, the general rule is to use the applicable Unicode character instead of trying to use a character entity as you would with HTML.
- Remember that HTML is an SGML document type.
- SGML has a limited character set, which requires it to use character entities to represent special characters.
- One of the improvements of XML over SGML (and thus HTML) is native support for Unicode.
- Basic XML has only a handful of character entities, primarily because it doesn't really need more.
- </p>
- <p>
- Entities such as <code>&uuml;</code> (u with an umlaut), which work in HTML, will be flagged as undefined entities unless you define them yourself in your DTD.
- Use the corresponding Unicode character instead.
- A list of predefined HTML entities and their Unicode codepoints can be found at <link href="http://www.w3.org/TR/html4/sgml/entities.html">Character entity references in HTML 4</link>.
- </p>
- <p>
- One common example is <code>&nbsp;</code>, used to obtain a non-breaking space in HTML.
- In XML, use &#160; instead.
- </p>
- <p>
- For other non-ASCII characters, such as the Euro symbol, checkbox, etc., see the <link href="http://www.unicode.org/charts/charindex.html">Unicode Reference By Name</link> document that is found at the <link href="http://www.unicode.org">Unicode Consortium</link> site.
- </p>
- <p>
- After finding the correct Unicode codepoint to represent the character, use <link href="http://www.w3.org/TR/2000/REC-xml-20001006#sec-references">XML Character References</link> to put the character into your source XML, XSLT or FO.
- See the non-breaking-space comments above for an example of the syntax using decimal notation.
- The following hexadecimal example will result in a Euro sign:
- </p>
- <source><![CDATA[€]]></source>
- <p>
- Getting your XML correctly encoded is only part of the job.
- If you want the character to display or print correctly (and you probably do), then the selected font must contain the necessary glyph.
- Because of differences between font encoding methods, and limitations in some font technologies, this can be a troublesome issue, especially for symbol characters.
- The FOP example file <link href="fo/fonts.fo.pdf">Base-14 Font Character Mapping</link> is a very useful resource in sorting these issues out for the Base-14 fonts.
- For other fonts, use font editing sofware or operating system utilities (such as the Character Map in most Windows platforms) to determine what characters the font supports.
- </p>
- <p>
- An alternative to encoding the character and making it available through a font is to use an embedded graphic to represent the character: GIF, PNG, SVG, etc.
- </p>
- </section>
- <section id="xml-entity-chars">
- <title>Entity Characters</title>
- <p>
- The handful of basic XML character entities that do exist are the ampersand, apostrophe, less-than, greater-than, and single-quote characters.
- These are needed to distinguish markup tags from content, and to distinguish character entities from content.
- To avoid parser complaints about illegal characters and entities in your input, ensure that ampersands in text and attributes are written as &amp;, "<" is written as &lt;, and ">" as &gt;.
- It is not necessary everywhere, but it is wise to do so anyway, just to be sure.
- </p>
- <p>
- Most XML parsers will provide a line number and sometimes a column number for offending characters.
- </p>
- <p>
- Review the <link href="http://www.w3.org/XML/">XML Specification</link> or a good tutorial for details of the XML file format.
- </p>
- </section>
- <section id="xml-encoding">
- <title>Encoding Issues</title>
- <p>
- If the parser complains about illegal bytes or characters in the input, or there are unexpected characters in the output, this is usually the result of a character encoding problem.
- See the <link href="http://www.dpawson.co.uk/xsl">XSL FAQ</link> for additional information.
- Many software packages that produce XML, including XSLT processors, use UTF-8 encoding as a default.
- If you view their output with something not aware of the encoding, like Notepad for Win95/98/ME/NT, funny characters are displayed. A � is a giveaway.
- </p>
- </section>
- </section>
- <section id="xslt">
- <title>XSLT Issues</title>
- <section id="xslt-date">
- <title>Current Date and Time</title>
- <p>XSL-FO does not currently have a function for retrieving the current date and time.
- However, in some cases, XSLT can be used to place the current date and time into the XSL-FO document as it is generated.</p>
- <p>One possibility is to use the <jump href="http://exslt.org/date/index.html">exslt date and time extension</jump>.</p>
- <p>Another possibility is to use java or javascript (or perhaps some other language).
- Here is an example, using java, that works with Xalan. First, create the appropriate namespace:</p>
- <source><![CDATA[<xsl:stylesheet version="1.0"
- ...
- xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java"
- ...]]></source>
- <p>Next, use the java language to retrieve and format the current date and time.
- Here is an example template:</p>
- <source><![CDATA[<xsl:template match="TodaysDate">
- <xsl:value-of select="java:format(java:java.text.SimpleDateFormat.new
- ('MMMM d, yyyy, h:mm:ss a (zz)'), java:java.util.Date.new())"/>
- </xsl:template>]]></source>
- </section>
- </section>
- <section id="xsl-fo">
- <title>XSL-FO Issues</title>
- <section id="fo-center-vertical">
- <title>Vertical Centering</title>
- <p>
- To vertically center an image, table, or other item, use display-align="center".
- See <link href="compliance.html#fo-property-display-align">display-align Compliance</link> for implementation status.
- Here is a small, self-contained document centering an image on a page:
- </p>
- <source><![CDATA[<?xml version="1.0"?>
- <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
- <fo:layout-master-set>
- <fo:simple-page-master master-name="content"
- page-width="210mm" page-height="297mm">
- <fo:region-body/>
- </fo:simple-page-master>
- </fo:layout-master-set>
- <fo:page-sequence master-reference="content">
- <fo:flow flow-name="xsl-region-body">
- <fo:table table-layout="fixed" width="100%">
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-body>
- <fo:table-row height="297mm">
- <fo:table-cell display-align="center">
- <fo:block text-align="center">
- <fo:external-graphic src="fop.jpg"/>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- </fo:table-body>
- </fo:table>
- </fo:flow>
- </fo:page-sequence>
- </fo:root>]]></source>
- </section>
- <section id="fo-center-table-horizon">
- <title>Horizontal Centering (Tables)</title>
- <p>
- To center a table horizontally, one possibility is to add one column on the left and one on the right which pad the table so that the visible part is centered:
- </p>
- <source><![CDATA[<?xml version="1.0"?>
- <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
- <fo:layout-master-set>
- <fo:simple-page-master master-name="content"
- page-width="210mm" page-height="297mm">
- <fo:region-body/>
- </fo:simple-page-master>
- </fo:layout-master-set>
- <fo:page-sequence master-reference="content">
- <fo:flow flow-name="xsl-region-body">
- <fo:table table-layout="fixed" width="100%">
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="100mm"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-body>
- <fo:table-row>
- <fo:table-cell column-number="2">
- <fo:block>foo</fo:block>
- </fo:table-cell>
- </fo:table-row>
- </fo:table-body>
- </fo:table>
- </fo:flow>
- </fo:page-sequence>
- </fo:root>]]></source>
- <p>
- If your table is more complicated, or if defining borders on individual cells becomes too much work, use the code above and nest your table within the middle cell.
- </p>
- </section>
- <section id="fo-right-align-table-horizon">
- <title>Right-Aligning (Tables)</title>
- <p>
- To right-align a table, you can use the same approach as above for centering tables.
- Just remove the last table-column element which causes all the left-over space not
- used by the columns with a fixed column-width to be assigned to the first column which
- effectively right-aligns the table.
- </p>
- </section>
- <section id="fo-oddeven">
- <title>Recto/Verso Static Content Differences</title>
- <p>
- One frequent request is that static content be different between recto pages (right-side or odd-numbered pages typically) and verso pages(left-side or even-numbered pages typically).
- For example, you may wish to place the page number on the "outer" side of each page.
- There are examples in the FO distribution and in the <link href="http://www.dpawson.co.uk/xsl/sect3/index.html">XSL FAQ FO section</link>.
- </p>
- <p>
- First, define a page master with alternating pages masters for odd and even pages.
- Then specify appropriate regions in these page masters, giving them different names.
- Use these names to put different static content in these regions. Here is a self-contained demonstration:
- </p>
- <source><![CDATA[<?xml version="1.0"?>
- <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
- <fo:layout-master-set>
- <fo:simple-page-master master-name="even"
- page-height="297mm" page-width="210mm"
- margin-top="20mm" margin-bottom="20mm"
- margin-left="25mm" margin-right="25mm">
- <fo:region-body margin-bottom="20mm"/>
- <fo:region-after region-name="footer-even" extent="20mm"/>
- </fo:simple-page-master>
- <fo:simple-page-master master-name="odd"
- page-height="297mm" page-width="210mm"
- margin-top="20mm" margin-bottom="20mm"
- margin-left="25mm" margin-right="25mm">
- <fo:region-body margin-bottom="20mm"/>
- <fo:region-after region-name="footer-odd" extent="20mm"/>
- </fo:simple-page-master>
- <fo:page-sequence-master master-name="document">
- <fo:repeatable-page-master-alternatives>
- <fo:conditional-page-master-reference odd-or-even="even"
- master-reference="even"/>
- <fo:conditional-page-master-reference odd-or-even="odd"
- master-reference="odd"/>
- </fo:repeatable-page-master-alternatives>
- </fo:page-sequence-master>
- </fo:layout-master-set>
- <fo:page-sequence master-reference="document">
- <fo:static-content flow-name="footer-even">
- <fo:block text-align="start"><fo:page-number/></fo:block>
- </fo:static-content>
- <fo:static-content flow-name="footer-odd">
- <fo:block text-align-last="end"><fo:page-number/></fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <fo:block/>
- <fo:block break-before="page"/>
- </fo:flow>
- </fo:page-sequence>
- </fo:root>]]></source>
- </section>
- <section id="fo-first-page">
- <title>Making the First Page Special</title>
- <p>
- To get a special header on the first page, one possibility is to insert it into the flow instead of the static content. Alternatively, use a page master referring to different page masters for the first page and the rest. Here is a code sample:
- </p>
- <source><![CDATA[<?xml version="1.0"?>
- <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
- <fo:layout-master-set>
- <fo:simple-page-master master-name="first"
- page-height="297mm" page-width="210mm"
- margin-top="20mm" margin-bottom="20mm"
- margin-left="25mm" margin-right="25mm">
- <fo:region-body margin-bottom="20mm"/>
- <fo:region-after region-name="footer-first" extent="20mm"/>
- </fo:simple-page-master>
- <fo:simple-page-master master-name="rest"
- page-height="297mm" page-width="210mm"
- margin-top="20mm" margin-bottom="20mm"
- margin-left="25mm" margin-right="25mm">
- <fo:region-body margin-bottom="20mm"/>
- <fo:region-after region-name="footer-rest" extent="20mm"/>
- </fo:simple-page-master>
- <fo:page-sequence-master master-name="document">
- <fo:repeatable-page-master-alternatives>
- <fo:conditional-page-master-reference page-position="first"
- master-reference="first"/>
- <fo:conditional-page-master-reference page-position="rest"
- master-reference="rest"/>
- </fo:repeatable-page-master-alternatives>
- </fo:page-sequence-master>
- </fo:layout-master-set>
- <fo:page-sequence master-reference="document">
- <fo:static-content flow-name="footer-first">
- <fo:block text-align="center">First page.</fo:block>
- </fo:static-content>
- <fo:static-content flow-name="footer-rest">
- <fo:block text-align-last="center">Other page.</fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <fo:block/>
- <fo:block break-before="page"/>
- <fo:block break-before="page"/>
- </fo:flow>
- </fo:page-sequence>
- </fo:root>]]></source>
- </section>
- <section id="fo-blank-pages">
- <title>Blank Pages</title>
- <p>
- Sometimes it is desirable to insert blank pages within your output, starting, for example, a new chapter on an odd page or an even page.
- A blank page can be forced by using <code>break-before="page-even"</code> or similar properties, or by a force-page-count="end-on-odd" on a page sequence.
- </p>
- <p>
- To write "This page is intentionally left blank" (or something similar) on an intentionally blank page, first define a conditional page master with a page master specific for blank pages.
- This allows you to specify static content for blank pages (by definition, a page is blank if no content from a flow is rendered on the page).
- Omit your normal headers and footers, and use (for example) an extended header to print the "..left blank" statement:
- </p>
- <source><![CDATA[<?xml version="1.0"?>
- <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
- <fo:layout-master-set>
- <fo:simple-page-master master-name="normal"
- page-height="297mm" page-width="210mm"
- margin-top="20mm" margin-bottom="20mm"
- margin-left="25mm" margin-right="25mm">
- <fo:region-body margin-bottom="20mm"/>
- <fo:region-after region-name="footer-normal" extent="20mm"/>
- </fo:simple-page-master>
- <fo:simple-page-master master-name="blank"
- page-height="297mm" page-width="210mm"
- margin-top="20mm" margin-bottom="20mm"
- margin-left="25mm" margin-right="25mm">
- <fo:region-body/>
- <fo:region-before region-name="header-blank" extent="297mm"/>
- </fo:simple-page-master>
- <fo:page-sequence-master master-name="document">
- <fo:repeatable-page-master-alternatives>
- <fo:conditional-page-master-reference blank-or-not-blank="not-blank"
- master-reference="normal"/>
- <fo:conditional-page-master-reference blank-or-not-blank="blank"
- master-reference="blank"/>
- </fo:repeatable-page-master-alternatives>
- </fo:page-sequence-master>
- </fo:layout-master-set>
- <fo:page-sequence master-reference="document" force-page-count="end-on-even">
- <fo:static-content flow-name="footer-normal">
- <fo:block text-align="center">Normal footer</fo:block>
- </fo:static-content>
- <fo:static-content flow-name="header-blank">
- <fo:block space-before="100mm" text-align-last="center">
- Intentionally left blank.</fo:block>
- </fo:static-content>
- <fo:flow flow-name="xsl-region-body">
- <fo:block/>
- </fo:flow>
- </fo:page-sequence>
- </fo:root>]]></source>
- </section>
- <section id="fo-preformat">
- <title>Preformatting Content</title>
- <p>
- Sometimes it is desirable to retain linebreaks and hard spaces, and to get
- preformatted text to pass through without being changed. The XSL-FO
- specification provides some properties for this: <link
- href="http://www.w3.org/TR/xsl11/#white-space-collapse">white-space-collapse</link>
- and <link
- href="http://www.w3.org/TR/2001/REC-xsl-20011015/slice7.html#white-space-collapse">linefeed-treatment</link>.
- In FOP, use white-space-collapse="false" on an enclosing block.
- </p>
- </section>
- <section id="fo-total-pages">
- <title>Total Document Pages</title>
- <p>
- It is frequently desirable to know the total number of pages in a
- document and to use that number within the document. For example, you
- might wish to show the page number on the first page as being
- "page 1 of 12".
- </p>
- <p>
- To accomplish this in <strong>XSL 1.0</strong>, place an empty block
- with an id at the end of the flow:
- </p>
- <source><![CDATA[<fo:flow ...>
- ...
- <fo:block id="last-page"/>
- </fo:flow>]]></source>
- <p>
- Get the number of the last page as follows:
- </p>
- <source><![CDATA[<fo:page-number-citation ref-id="last-page"/>]]></source>
- <p>
- This does not work in certain situations: multiple page sequences, an initial page number other than 1, or forcing a certain page count, thereby producing blank pages at the end.
- </p>
- <p>
- In <strong>XSL 1.1</strong>, you get another option to do this: make
- sure an "id" is set on the page-sequence and reference it using
- fo:page-number-citation-last. First, the page-sequence:
- </p>
- <source><![CDATA[<fo:page-sequence id="seq1" ...]]></source>
- <p>
- After that, reference the last page the page-sequence generates:
- </p>
- <source><![CDATA[<fo:page-number-citation-last ref-id="seq1"/>]]></source>
- <warning>
- There is no reliable way to get the real total page count with FO mechanisms. You can only get <em>page numbers</em>.
- </warning>
- <p>
- The FOP library provides a method to get the total page count after an FO document has been rendered.
- One possibility is to implement your own wrapper to do a dummy rendering, inquire the total page count and then perform the real rendering, passing the total page count to the XSLT processor to splice it into the generated FO.
- For example:
- </p>
- <source><![CDATA[import org.apache.fop.apps.*;
- import org.xml.sax.*;
- import java.io.*;
- import javax.xml.transform.*;
- import javax.xml.transform.sax.*;
- import javax.xml.transform.stream.*;
-
- class rendtest {
-
- private static FopFactory fopFactory = FopFactory.newInstance();
- private static TransformerFactory tFactory = TransformerFactory.newInstance();
-
- public static void main(String args[]) {
- OutputStream out;
- try {
- //Load the stylesheet
- Templates templates = tFactory.newTemplates(
- new StreamSource(new File(args[1])));
-
- //First run (to /dev/null)
- out = new org.apache.commons.io.output.NullOutputStream();
- FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
- Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
- Transformer transformer = templates.newTransformer();
- transformer.setParameter("page-count", "#");
- transformer.transform(new StreamSource(new File(args[0])),
- new SAXResult(fop.getDefaultHandler()));
-
- //Get total page count
- String pageCount = Integer.toString(driver.getResults().getPageCount());
-
- //Second run (the real thing)
- out = new java.io.FileOutputStream(args[2]);
- out = new java.io.BufferedOutputStream(out);
- try {
- foUserAgent = fopFactory.newFOUserAgent();
- fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
- transformer = templates.newTransformer();
- transformer.setParameter("page-count", pageCount);
- transformer.transform(new StreamSource(new File(args[0])),
- new SAXResult(fop.getDefaultHandler()));
- } finally {
- out.close();
- }
- } catch( Exception e) {
- e.printStackTrace();
- }
- }
- }]]></source>
- <p>
- Declare and use the parameter "page-count" in your XSLT.
- </p>
- <warning>
- It is possible to run into a convergence problem with this solution. Replacing the "#" placeholder in the first run with the actual page count in the second run, may change the total number of pages in the document.
- </warning>
- </section>
- <section id="fo-region-align">
- <title>Aligning Regions</title>
- <p>
- Although it may seem counterintuitive, the regions on a page may overlap.
- Defining a certain body region does not automatically constrain other regions.
- Instead, this has to be done explicitly.
- Sometimes for creative reasons it may be desirable to have the regions overlap.
- Otherwise, you will want to set them up so that the header does not overlap body content or the body extend into the footer.
- </p>
- <p>
- Assuming you wish to keep the regions separate, if you have a header region with an extent of 20mm, you should define a margin for the body region of at least 20mm too.
- Otherwise the header content may overwrite some stuff in the body region.
- This applies similarly to the extent of the after region and the bottom margin of the body region.
- </p>
- </section>
- <section id="fo-lines">
- <title>Drawing Lines</title>
- <p>
- It is frequently desirable to draw lines in a document, as separators, side bars or folding marks. There are several possibilities:
- </p>
- <ul>
- <li>
- Horizontal lines can be drawn using <link href="http://www.w3.org/TR/xsl11/#fo_leader">fo:leader</link>.
- </li>
- <li>
- Use a solid border on a suitable fo:block. This will work for horizontal and vertical lines only.
- </li>
- <li>
- Insert a graphic. GIF, PNG SVG, whatever.
- </li>
- </ul>
- </section>
- <section id="fo-validate">
- <title>Validating XSL-FO</title>
- <p>
- <link href="http://www.renderx.com">RenderX</link> has provided an <link href="http://www.renderx.com/Tests/validator/fo.dtd.html">Unofficial DTD for FO Documents</link>, which may be helpful in validating general FO issues.
- </p>
- <p>
- FOP also maintains an <link
- href="http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/foschema/fop.xsd?view=co">Unofficial
- FOP Schema</link> in the FOP Subversion Repository. This document can be used
- either to validate against the FO standard, or against the actual FOP
- implementation. See the notes near the beginning of the document for
- instructions on how to use it.
- </p>
- </section>
- <section id="landscape">
- <title>Producing landscape pages</title>
- <p>
- Pages in landscape format can easily be produced by exchanging the page-height and page-width values of a simple-page-master element.
- </p>
- <source><![CDATA[<fo:layout-master-set>
- <fo:simple-page-master master-name="A4-portrait" page-height="29.7cm" page-width="21cm" [..]>
- <fo:region-body/>
- </fo:simple-page-master>
- <fo:simple-page-master master-name="A4-landscape" page-height="21cm" page-width="29.7cm" [..]>
- <fo:region-body/>
- </fo:simple-page-master>
- </fo:layout-master-set>]]></source>
- </section>
- <section id="external-resources">
- <title>External Resources</title>
- <p>Resources needed by an XSL-FO file that are external to it (graphics, for example), are defined in the XSL-FO standard as being of type "uri-specification". This is defined in the standard at <jump href="http://www.w3.org/TR/xsl11/#datatype">Section 5.11 Property Datatypes</jump>, which includes a link to the URI standard itself. Refer to the XSL-FO and URI standards themselves for more detailed instructions.</p>
- <p>URIs may be either absolute or relative to a base URI. (See <link href="1.1/configuration.html">FOP: Configuration</link> for information on setting the base URI for a FOP session). Here is an example referencing an external-graphic that is relative to the base URI:</p>
- <source><![CDATA[<fo:external-graphic src="url('images/logo.jpg')"/>]]></source>
- <p>Here is an example referencing an external-graphic that is an absolute URI on a local filesystem:</p>
- <source><![CDATA[fo:external-graphic src="url('file:///d:/images/logo.jpg')"/>]]></source>
- </section>
- </section>
- </body>
- </document>
|