Bear, golggotmánu 6. b. 2006 20.11, Evangelos Vlachogiannis čálii: > also pdf table of contents is fine!! but still text appears "######" >
I had the same problem for the sami characters šŧŋđžč. I got this working by embedding characters into the pdfs. I began by reading http://cocoon.apache.org/2.1/userdocs/pdf-serializer.html. These are the steps I took to make it work (works on Linux and Mac OS X): 1. Make a directory <yourproject>/src/documentation/resources/fonts 2. Download DejaVu truetype fonts. http://dejavu.sourceforge.net/wiki/index.php/Download 2. Unpack the fonts in to the above mentioned fonts directory 3. Create font metrics files. This is done on the command line. cd <yourproject>/src/documentation/resources/fonts for i in *.ttf do; java -cp "$FORREST_HOME/lib/core/fop-0.20.5.jar; $FORREST_HOME/lib/endorsed/xercesImpl-2.8.0.jar; $FORREST_HOME/lib/endorsed/xml-apis-1.3.03.jar" org.apache.fop.fonts.apps.TTFReader $i $i.xml;done There are 21 different font files in the dejavu archive, so the previous line will go through them one by one, and make font metrics files for each and everyone of them. The alternative is to write: java -cp "$FORREST_HOME/lib/core/fop-0.20.5.jar; $FORREST_HOME/lib/endorsed/xercesImpl-2.8.0.jar; $FORREST_HOME/lib/endorsed/xml-apis-1.3.03.jar" org.apache.fop.fonts.apps.TTFReader <fontfile> <fontfile>.xml for each and everyone of the font files ... 4. Create a custom font configuration file. I attach the one I use. Notice that it has absolute paths, so you will have to change them to fit to your directory structure. ( I tried to make this work without absolute paths, but to no avail). 5. Configure the fo2pdf serializer Open the file $FORREST_HOME/plugins/org.apache.forrest.plugin.output.pdf/output.xmap Change the stanza: <map:serializer name="fo2pdf" src="org.apache.cocoon.serialization.FOPSerializer" mime-type="application/pdf"/> To: <map:serializer name="fo2pdf" src="org.apache.cocoon.serialization.FOPSerializer" mime-type="application/pdf"> <user-config><path-to-your-project>/src/documentation/resources/fonts/config.xml</user-config> </map:serializer> After that: cd $FORREST_HOME/plugins/org.apache.forrest.plugin.output.pdf ant local-deploy Then your changes ought to emerge in $FORREST/build/plugins/org.apache.forrest.plugin.output.pdf/output.xmap 6. Make forrest use these changes: a. Copy the directory $FORREST_HOME/main/webapp/skins/common to <yourproject>/src/documentation/skins. That means inside the directory <yourprojectr>/src/documentations/skins you should have a directory called common when you are finished copying ... ;) b. Edit the files in common/xslt/fo/ I attach mine, change to suit your taste. There sure has snuck some errors into this explanation, there are plenty of stepping stones. So please give feedback if this was of any use. -- Børre Gaup, Tromsø
<configuration> <fonts> <!-- + FOP configuration file to use DejaVu to render UTF-8 texts outside | ASCII / 1252correctly in Forrest-generated pdf files. | | Change or expand to suit your own needs. | | NOTE: The paths to the font files are for a standard MacOS X | installation and needs to be adopted to the platform in question. +--> <!-- DejaVu Sans starting here: --> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSans.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSans.ttf"> <font-triplet name="DejaVuSans" style="normal" weight="normal"/> <font-triplet name="DejaVuSans,Book" style="normal" weight="normal"/> </font> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSans-Bold.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSans-Bold.ttf"> <font-triplet name="DejaVuSans" style="normal" weight="bold"/> <font-triplet name="DejaVuSans,Bold" style="normal" weight="bold"/> </font> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSans-BoldOblique.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSans-BoldOblique.ttf"> <font-triplet name="DejaVuSans" style="italic" weight="bold"/> <font-triplet name="DejaVuSans,BoldOblique" style="italic" weight="bold"/> </font> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSans-Oblique.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSans-Oblique.ttf"> <font-triplet name="DejaVuSans" style="italic" weight="normal"/> <font-triplet name="DejaVuSans,Oblique" style="italic" weight="normal"/> </font> <!-- DejaVu Serif starting here: --> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerif.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerif.ttf"> <font-triplet name="DejaVuSerif" style="normal" weight="normal"/> <font-triplet name="DejaVuSerif,Book" style="normal" weight="normal"/> </font> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerif-Bold.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerif-Bold.ttf"> <font-triplet name="DejaVuSerif" style="normal" weight="bold"/> <font-triplet name="DejaVuSerif,Bold" style="normal" weight="bold"/> </font> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerif-BoldOblique.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerif-BoldOblique.ttf"> <font-triplet name="DejaVuSerif" style="italic" weight="bold"/> <font-triplet name="DejaVuSerif,BoldOblique" style="italic" weight="bold"/> </font> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerif-Oblique.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerif-Oblique.ttf"> <font-triplet name="DejaVuSerif" style="italic" weight="normal"/> <font-triplet name="DejaVuSerif,Oblique" style="italic" weight="normal"/> </font> <!-- DejaVu SansMono starting here: --> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSansMono.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSansMono.ttf"> <font-triplet name="DejaVuSansMono" style="normal" weight="normal"/> <font-triplet name="DejaVuSansMono,Book" style="normal" weight="normal"/> </font> <!-- DejaVu Sans Condensed starting here: --> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSansCondensed.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSansCondensed.ttf"> <font-triplet name="DejaVuSansCondensed" style="normal" weight="normal"/> <font-triplet name="DejaVuSansCondensed,Book" style="normal" weight="normal"/> </font> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSansCondensed-Bold.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSansCondensed-Bold.ttf"> <font-triplet name="DejaVuSansCondensed" style="normal" weight="bold"/> <font-triplet name="DejaVuSansCondensed,Bold" style="normal" weight="bold"/> </font> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSansCondensed-BoldOblique.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSansCondensed-BoldOblique.ttf"> <font-triplet name="DejaVuSansCondensed" style="italic" weight="bold"/> <font-triplet name="DejaVuSansCondensed,BoldOblique" style="italic" weight="bold"/> </font> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSansCondensed-Oblique.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSansCondensed-Oblique.ttf"> <font-triplet name="DejaVuSansCondensed" style="italic" weight="normal"/> <font-triplet name="DejaVuSansCondensed,Oblique" style="italic" weight="normal"/> </font> <!-- DejaVu Serif starting here: --> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerifCondensed.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerifCondensed.ttf"> <font-triplet name="DejaVuSerifCondensed" style="normal" weight="normal"/> <font-triplet name="DejaVuSerifCondensed,Book" style="normal" weight="normal"/> </font> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerifCondensed-Bold.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerifCondensed-Bold.ttf"> <font-triplet name="DejaVuSerifCondensed" style="normal" weight="bold"/> <font-triplet name="DejaVuSerifCondensed,Bold" style="normal" weight="bold"/> </font> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerifCondensed-BoldOblique.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerif-BoldOblique.ttf"> <font-triplet name="DejaVuSerif" style="italic" weight="bold"/> <font-triplet name="DejaVuSerif,BoldOblique" style="italic" weight="bold"/> </font> <font metrics-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerif-Oblique.ttf.xml" kerning="yes" embed-file="/Users/boerre/xtdoc/sd/src/documentation/resources/fonts/DejaVuSerif-Oblique.ttf"> <font-triplet name="DejaVuSerif" style="italic" weight="normal"/> <font-triplet name="DejaVuSerif,Oblique" style="italic" weight="normal"/> </font> </fonts> </configuration>
<?xml version="1.0"?> <!-- 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. --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" version="1.0"> <!-- left, justify, right --> <xsl:variable name="text-align" select="string(//skinconfig/pdf/page/@text-align)"/> <!-- print URL of external links --> <xsl:variable name="show-external-urls" select="//skinconfig/pdf/show-external-urls"/> <!-- Get the section depth to use when generating the minitoc (default is 2) --> <xsl:variable name="toc-max-depth" select="number(//skinconfig/toc/@max-depth)"/> <!-- The page size to be used --> <xsl:variable name="pagesize" select="string(//skinconfig/pdf/page/@size)"/> <!-- The page orientation ("portrait" or "landscape") --> <xsl:variable name="pageorientation" select="string(//skinconfig/pdf/page/@orientation)"/> <!-- Double-sided printing toggle --> <xsl:variable name="doublesided" select="string(//skinconfig/pdf/margins/@double-sided)"/> <!-- The top page margin --> <xsl:variable name="topmargin" select="string(//skinconfig/pdf/margins/top)"/> <!-- The bottom page margin --> <xsl:variable name="bottommargin" select="string(//skinconfig/pdf/margins/bottom)"/> <!-- The inner page margin (always the left margin if double-sided printing is off, alternating between left and right if it's on) --> <xsl:variable name="innermargin" select="string(//skinconfig/pdf/margins/inner)"/> <!-- The outer page margin (always the right margin if double-sided printing is off, alternating between right and left if it's on)--> <xsl:variable name="outermargin" select="string(//skinconfig/pdf/margins/outer)"/> <xsl:param name="numbersections" select="'true'"/> <!-- page breaks after TOC and each page if an aggregate document --> <xsl:variable name="page-break-top-sections" select="'true'"/> <!-- page numbering format --> <xsl:variable name="page-numbering-format" select="string(//skinconfig/pdf/page-numbering-format)"/> <!-- Section depth at which we stop numbering and just indent --> <xsl:param name="numbering-max-depth" select="'3'"/> <xsl:param name="imagesdir" select="."/> <xsl:param name="xmlbasedir"/> <xsl:include href="pdfoutline.xsl"/> <xsl:include href="footerinfo.xsl"/> <!-- Determine page height for various page sizes (US Letter portrait is the default) --> <!-- FIXME: JJP:would this be better of a file? --> <xsl:variable name="pageheight"> <xsl:choose> <xsl:when test="$pageorientation = 'landscape'"> <xsl:choose> <xsl:when test="$pagesize = 'a0'">841mm</xsl:when> <xsl:when test="$pagesize = 'a1'">594mm</xsl:when> <xsl:when test="$pagesize = 'a2'">420mm</xsl:when> <xsl:when test="$pagesize = 'a3'">297mm</xsl:when> <xsl:when test="$pagesize = 'a4'">210mm</xsl:when> <xsl:when test="$pagesize = 'a5'">148mm</xsl:when> <xsl:when test="$pagesize = 'executive'">7.25in</xsl:when> <xsl:when test="$pagesize = 'folio'">8.5in</xsl:when> <xsl:when test="$pagesize = 'ledger'">11in</xsl:when> <xsl:when test="$pagesize = 'legal'">8.5in</xsl:when> <xsl:when test="$pagesize = 'letter'">8.5in</xsl:when> <xsl:when test="$pagesize = 'quarto'">8.5in</xsl:when> <xsl:when test="$pagesize = 'tabloid'">11in</xsl:when> <xsl:otherwise>8.5in</xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:choose> <xsl:when test="$pagesize = 'a0'">1189mm</xsl:when> <xsl:when test="$pagesize = 'a1'">841mm</xsl:when> <xsl:when test="$pagesize = 'a2'">594mm</xsl:when> <xsl:when test="$pagesize = 'a3'">420mm</xsl:when> <xsl:when test="$pagesize = 'a4'">297mm</xsl:when> <xsl:when test="$pagesize = 'a5'">210mm</xsl:when> <xsl:when test="$pagesize = 'executive'">10.5in</xsl:when> <xsl:when test="$pagesize = 'folio'">13in</xsl:when> <xsl:when test="$pagesize = 'ledger'">17in</xsl:when> <xsl:when test="$pagesize = 'legal'">14in</xsl:when> <xsl:when test="$pagesize = 'quarto'">10.83in</xsl:when> <xsl:when test="$pagesize = 'tabloid'">17in</xsl:when> <xsl:otherwise>11in</xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- Determine page width for various page sizes (US Letter portrait is the default) --> <xsl:variable name="pagewidth"> <xsl:choose> <xsl:when test="$pageorientation = 'landscape'"> <xsl:choose> <xsl:when test="$pagesize = 'a0'">1189mm</xsl:when> <xsl:when test="$pagesize = 'a1'">841mm</xsl:when> <xsl:when test="$pagesize = 'a2'">594mm</xsl:when> <xsl:when test="$pagesize = 'a3'">420mm</xsl:when> <xsl:when test="$pagesize = 'a4'">297mm</xsl:when> <xsl:when test="$pagesize = 'a5'">210mm</xsl:when> <xsl:when test="$pagesize = 'executive'">10.5in</xsl:when> <xsl:when test="$pagesize = 'folio'">13in</xsl:when> <xsl:when test="$pagesize = 'ledger'">17in</xsl:when> <xsl:when test="$pagesize = 'legal'">14in</xsl:when> <xsl:when test="$pagesize = 'quarto'">10.83in</xsl:when> <xsl:when test="$pagesize = 'tabloid'">17in</xsl:when> <xsl:otherwise>11in</xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:choose> <xsl:when test="$pagesize = 'a0'">841mm</xsl:when> <xsl:when test="$pagesize = 'a1'">594mm</xsl:when> <xsl:when test="$pagesize = 'a2'">420mm</xsl:when> <xsl:when test="$pagesize = 'a3'">297mm</xsl:when> <xsl:when test="$pagesize = 'a4'">210mm</xsl:when> <xsl:when test="$pagesize = 'a5'">148mm</xsl:when> <xsl:when test="$pagesize = 'executive'">7.25in</xsl:when> <xsl:when test="$pagesize = 'folio'">8.5in</xsl:when> <xsl:when test="$pagesize = 'ledger'">11in</xsl:when> <xsl:when test="$pagesize = 'legal'">8.5in</xsl:when> <xsl:when test="$pagesize = 'letter'">8.5in</xsl:when> <xsl:when test="$pagesize = 'quarto'">8.5in</xsl:when> <xsl:when test="$pagesize = 'tabloid'">11in</xsl:when> <xsl:otherwise>8.5in</xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:template match="/"> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="first-page" page-height="{$pageheight}" page-width="{$pagewidth}" margin-top="{$topmargin}" margin-bottom="{$bottommargin}" margin-left="{$innermargin}" margin-right="{$outermargin}"> <fo:region-body margin-top="0.5in" margin-bottom=".5in"/> <fo:region-after region-name="first-footer" extent=".5in" display-align="before"/> </fo:simple-page-master> <fo:simple-page-master master-name="even-page" page-height="{$pageheight}" page-width="{$pagewidth}" margin-top="{$topmargin}" margin-bottom="{$bottommargin}"> <xsl:choose> <xsl:when test="$doublesided = 'true'"> <xsl:attribute name="margin-left"> <xsl:value-of select="$outermargin"/> </xsl:attribute> <xsl:attribute name="margin-right"> <xsl:value-of select="$innermargin"/> </xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:attribute name="margin-left"> <xsl:value-of select="$innermargin"/> </xsl:attribute> <xsl:attribute name="margin-right"> <xsl:value-of select="$outermargin"/> </xsl:attribute> </xsl:otherwise> </xsl:choose> <fo:region-before region-name="even-header" extent="0.5in" border-bottom="0.5pt solid"/> <fo:region-body margin-top="0.5in" margin-bottom=".5in"/> <fo:region-after region-name="even-footer" extent=".5in" display-align="before"/> </fo:simple-page-master> <fo:simple-page-master master-name="odd-page" page-height="{$pageheight}" page-width="{$pagewidth}" margin-top="{$topmargin}" margin-bottom="{$bottommargin}" margin-left="{$innermargin}" margin-right="{$outermargin}"> <fo:region-before region-name="odd-header" extent="0.5in" border-bottom="0.5pt solid"/> <fo:region-body margin-top="0.5in" margin-bottom=".5in"/> <fo:region-after region-name="odd-footer" extent=".5in" display-align="before"/> </fo:simple-page-master> <fo:page-sequence-master master-name="book"> <fo:repeatable-page-master-alternatives> <fo:conditional-page-master-reference page-position="first" master-reference="first-page"/> <fo:conditional-page-master-reference odd-or-even="odd" master-reference="odd-page"/> <fo:conditional-page-master-reference odd-or-even="even" master-reference="even-page"/> </fo:repeatable-page-master-alternatives> </fo:page-sequence-master> </fo:layout-master-set> <xsl:apply-templates select="/site/document" mode="outline"/> <fo:page-sequence master-reference="book"> <xsl:apply-templates select="/site/document"/> </fo:page-sequence> </fo:root> </xsl:template> <xsl:template match="document"> <fo:title><xsl:value-of select="header/title"/></fo:title> <fo:static-content flow-name="first-footer"> <fo:block border-top="0.25pt solid" padding-before="6pt" text-align="center"> <xsl:apply-templates select="footer"/> </fo:block> <!-- don't list page number on first page if it's contents is just the TOC --> <xsl:if test="not($toc-max-depth > 0 and $page-break-top-sections)"> <xsl:call-template name="insertPageNumber"> <xsl:with-param name="text-align">start</xsl:with-param> </xsl:call-template> </xsl:if> <xsl:call-template name="info"/> </fo:static-content> <fo:static-content flow-name="even-header"> <fo:block font-family="DejaVuSans" font-size="70%" text-align="end" font-style="italic"> <xsl:value-of select="header/title"/> </fo:block> </fo:static-content> <fo:static-content flow-name="even-footer"> <fo:block border-top="0.25pt solid" padding-before="6pt" text-align="center"> <xsl:apply-templates select="footer"/> </fo:block> <xsl:call-template name="insertPageNumber"> <xsl:with-param name="text-align">end</xsl:with-param> </xsl:call-template> <xsl:call-template name="info"/> </fo:static-content> <fo:static-content flow-name="odd-header"> <fo:block font-family="DejaVuSans" font-size="70%" text-align="start" font-style="italic"> <xsl:value-of select="header/title"/> </fo:block> </fo:static-content> <fo:static-content flow-name="odd-footer"> <fo:block border-top="0.25pt solid" padding-before="6pt" text-align="center"> <xsl:apply-templates select="footer"/> </fo:block> <xsl:call-template name="insertPageNumber"> <xsl:with-param name="text-align">start</xsl:with-param> </xsl:call-template> <xsl:call-template name="info"/> </fo:static-content> <fo:flow flow-name="xsl-region-body"> <fo:block padding-before="24pt" padding-after="24pt" font-size="24pt" font-weight="bold" font-family="DejaVuSans" id="{generate-id()}"> <xsl:value-of select="header/title"/> </fo:block> <fo:block text-align="{$text-align}" padding-before="18pt" padding-after="18pt"> <xsl:apply-templates/> </fo:block> <!-- Total number of pages calculation... --> <fo:block id="term"/> </fo:flow> </xsl:template> <xsl:template match="abstract"> <fo:block font-size="12pt" text-align="center" space-before="20pt" space-after="25pt" width="7.5in" font-family="DejaVuSerif" font-style="italic"> <xsl:call-template name="insertPageBreaks"/> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="notice"> <fo:block font-size="10pt" text-align="left" space-before="20pt" width="7.5in" font-family="DejaVuSerif" border-top="0.25pt solid" border-bottom="0.25pt solid" padding-before="6pt" padding-after="6pt"> <xsl:call-template name="insertPageBreaks"/> <!-- insert i18n stuff here --> NOTICE: <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="anchor"> <fo:block id="[EMAIL PROTECTED]"/> <xsl:apply-templates/> </xsl:template> <xsl:template match="section"> <xsl:param name="level">0</xsl:param> <xsl:variable name="size"> <!-- 14pt for level 1 12pt for level 2 --> <xsl:value-of select="14-number($level)"/> </xsl:variable> <xsl:variable name="background-color" select="//skinconfig/colors/[EMAIL PROTECTED]'body']/@value"/> <xsl:variable name="heading-color" select="//skinconfig/colors/[EMAIL PROTECTED]'subheading']/@value"/> <xsl:variable name="heading-type" select="//skinconfig/headings/@type"/> <fo:block font-family="DejaVuSans" font-size="{$size}pt" font-weight="bold" space-before="12pt" space-after="4pt"> <xsl:call-template name="insertPageBreaks"/> <xsl:if test="$heading-type = 'boxed'"> <xsl:attribute name="background-color"> <xsl:value-of select="$heading-color"/> </xsl:attribute> </xsl:if> <xsl:attribute name="id"> <xsl:choose> <xsl:when test="normalize-space(@id)!=''"> <xsl:value-of select="@id"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="generate-id()"/> </xsl:otherwise> </xsl:choose> </xsl:attribute> <xsl:if test="$numbersections = 'true' and number($level) < $numbering-max-depth+1"> <xsl:number format="1.1.1.1.1.1.1" count="section" level="multiple"/> <xsl:text>. </xsl:text> </xsl:if> <!-- For sections 4 or more nestings deep, indent instead of number --> <xsl:if test="number($level) > $numbering-max-depth+1"> <xsl:attribute name="start-indent"> <xsl:value-of select="4+number($level)"/><xsl:text>pt</xsl:text> </xsl:attribute> </xsl:if> <xsl:value-of select="title"/> </fo:block> <xsl:if test="$heading-type = 'underlined'"> <!-- The non-breaking space in this block is required, otherwise the block won't be rendered at all. --> <fo:block font-family="DejaVuSans" font-size="{10 div (number($level) +1 )}pt" background-color="{$heading-color}"> </fo:block> </xsl:if> <fo:block background-color="{$background-color}"> <xsl:apply-templates> <xsl:with-param name="level" select="number($level)+1"/> </xsl:apply-templates> </fo:block> </xsl:template> <xsl:template match="title"> <!-- do nothing as titles are handled in their parent templates --> </xsl:template> <xsl:template match="subtitle"> <xsl:param name="level">0</xsl:param> <xsl:variable name="size" select="16-(number($level)*1.5)"/> <fo:block font-family="DejaVuSans" font-weight="bold" font-size="{$size}pt"> <xsl:call-template name="insertPageBreaks"/> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="authors"> <fo:block space-before="20pt" font-family="DejaVuSerifCondensed" font-weight="bold" font-size="9pt"> <xsl:call-template name="insertPageBreaks"/> <!-- insert i18n stuff here --> by <xsl:for-each select="person"> <xsl:value-of select="@name"/> <xsl:if test="not(position() = last())">, </xsl:if> </xsl:for-each> </fo:block> </xsl:template> <xsl:template match="p"> <xsl:choose> <xsl:when test="ancestor::li and not(preceding-sibling::*)"> <fo:block space-after="4pt" font-family="DejaVuSerifCondensed"> <xsl:call-template name="insertPageBreaks"/> <xsl:apply-templates/> </fo:block> </xsl:when> <xsl:otherwise> <fo:block space-before="4pt" space-after="4pt" font-family="DejaVuSerifCondensed"> <xsl:call-template name="insertPageBreaks"/> <xsl:apply-templates/> </fo:block> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="source"> <xsl:variable name="color" select="//skinconfig/colors/[EMAIL PROTECTED]'code']/@value"/> <fo:block font-size="10pt" background-color="{$color}" white-space-collapse="false" linefeed-treatment="preserve" white-space-treatment="preserve" wrap-option="wrap" text-align="start"> <xsl:call-template name="insertPageBreaks"/> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="ol|ul"> <fo:list-block provisional-distance-between-starts="18pt" provisional-label-separation="3pt" text-align="start"> <xsl:apply-templates/> </fo:list-block> </xsl:template> <xsl:template match="ol/li"> <fo:list-item> <xsl:if test="not(following-sibling::li[1])"> <xsl:attribute name="space-after">6pt"</xsl:attribute> </xsl:if> <fo:list-item-label end-indent="label-end()"> <fo:block> <xsl:number format="1."/> </fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block font-family="DejaVuSerifCondensed"> <xsl:apply-templates/> </fo:block> </fo:list-item-body> </fo:list-item> </xsl:template> <!-- Emulate browser handling of these invalid combinations that our DTD unfortunately allows --> <xsl:template match="ul/ul | ul/ol | ol/ul | ol/ol"> <fo:list-item> <fo:list-item-label end-indent="label-end()"> <fo:block></fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block font-family="DejaVuSerifCondensed"> <xsl:apply-templates/> </fo:block> </fo:list-item-body> </fo:list-item> </xsl:template> <xsl:template match="ul/li"> <fo:list-item> <xsl:if test="not(following-sibling::li[1])"> <xsl:attribute name="space-after">6pt</xsl:attribute> </xsl:if> <fo:list-item-label end-indent="label-end()"> <fo:block>•</fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block font-family="DejaVuSerifCondensed"> <xsl:apply-templates/> </fo:block> </fo:list-item-body> </fo:list-item> </xsl:template> <xsl:template match="dl"> <fo:list-block provisional-distance-between-starts="18pt" provisional-label-separation="3pt" text-align="start" > <xsl:apply-templates/> </fo:list-block> </xsl:template> <xsl:template match="dt"> <fo:list-item> <fo:list-item-label end-indent="label-end()"> <fo:block></fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block font-family="DejaVuSans" font-weight="bold"> <xsl:apply-templates/> </fo:block> </fo:list-item-body> </fo:list-item> </xsl:template> <xsl:template match="dd"> <fo:list-item> <fo:list-item-label end-indent="label-end()"> <fo:block></fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block font-family="DejaVuSerifCondensed"> <xsl:apply-templates/> </fo:block> </fo:list-item-body> </fo:list-item> </xsl:template> <xsl:template match="strong"> <fo:inline font-weight="bold" font-family="DejaVuSerifCondensed"> <xsl:apply-templates/> </fo:inline> </xsl:template> <xsl:template match="em"> <fo:inline font-family="DejaVuSerifCondensed" font-style="italic"><xsl:apply-templates/> </fo:inline> </xsl:template> <xsl:template match="code"> <fo:inline font-family="DejaVuSansCondensed"><xsl:apply-templates/></fo:inline> </xsl:template> <xsl:template match="warning"> <xsl:variable name="color" select="//skinconfig/colors/[EMAIL PROTECTED]'warning']/@value"/> <fo:block margin-left="0.25in" margin-right="0.25in" font-weight="bold" font-size="10pt" font-family="DejaVuSansCondensed" space-before="10pt" border-before-style="solid" border-start-style="solid" border-end-style="solid" border-color="{$color}" background-color="{$color}" color="#ffffff"> <xsl:call-template name="insertPageBreaks"/> <xsl:choose> <xsl:when test="@label"><xsl:value-of select="@label"/></xsl:when> <xsl:otherwise>Warning: </xsl:otherwise> </xsl:choose><xsl:value-of select="title"/> </fo:block> <fo:block margin-left="0.25in" margin-right="0.25in" font-family="DejaVuSerifCondensed" font-size="8pt" border-after-style="solid" border-start-style="solid" border-end-style="solid" border-color="{$color}" background-color="#fff0f0" padding-start="3pt" padding-end="3pt" padding-before="3pt" padding-after="3pt" space-after="10pt"> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="note"> <xsl:variable name="color" select="//skinconfig/colors/[EMAIL PROTECTED]'note']/@value"/> <fo:block margin-left="0.25in" margin-right="0.25in" font-weight="bold" font-size="10pt" color="#ffffff" font-family="DejaVuSerifCondensed" space-before="10pt" border-before-style="solid" border-start-style="solid" border-end-style="solid" border-color="{$color}" background-color="{$color}"> <xsl:call-template name="insertPageBreaks"/> <xsl:choose> <xsl:when test="@label"><xsl:value-of select="@label"/></xsl:when> <!-- insert i18n stuff here --> <xsl:otherwise>Note: </xsl:otherwise> </xsl:choose><xsl:value-of select="title"/> </fo:block> <fo:block margin-left="0.25in" margin-right="0.25in" font-family="DejaVuSans" font-size="8pt" space-after="10pt" border-after-style="solid" border-start-style="solid" border-end-style="solid" border-color="{$color}" background-color="#F0F0FF" padding-start="3pt" padding-end="3pt" padding-before="3pt" padding-after="3pt"> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="fixme"> <xsl:variable name="color" select="//skinconfig/colors/[EMAIL PROTECTED]'fixme']/@value"/> <fo:block margin-left="0.25in" margin-right="0.25in" font-weight="bold" font-size="10pt" color="#FFFFFF" font-family="DejaVuSerifCondensed" space-before="10pt" border-before-style="solid" border-start-style="solid" border-end-style="solid" border-color="{$color}" background-color="{$color}"> <xsl:call-template name="insertPageBreaks"/> <!-- insert i18n stuff here --> FIXME (<xsl:value-of select="@author"/>): <xsl:value-of select="title"/> </fo:block> <fo:block margin-left="0.25in" margin-right="0.25in" font-family="DejaVuSans" font-size="8pt" space-after="10pt" border-after-style="solid" border-start-style="solid" border-end-style="solid" border-color="{$color}" background-color="#FFF0F0" padding-start="3pt" padding-end="3pt" padding-before="3pt" padding-after="3pt"> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="link|fork|jump"> <xsl:variable name="color" select="//skinconfig/colors/[EMAIL PROTECTED] = 'body']/@link"/> <xsl:choose> <xsl:when test="starts-with(@href, '#')"> <fo:basic-link color="{$color}" text-decoration="underline" internal-destination="{substring(@href,2)}"> <xsl:apply-templates/> </fo:basic-link> </xsl:when> <xsl:otherwise> <fo:basic-link color="{$color}" text-decoration="underline" external-destination="[EMAIL PROTECTED]"><xsl:apply-templates/></fo:basic-link> <xsl:if test="$show-external-urls = 'true' and @href != string(.)"> (<xsl:value-of select="@href"/>) </xsl:if> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="figure|img"> <fo:block text-align="center"> <xsl:call-template name="insertPageBreaks"/> <xsl:if test="normalize-space(@id)!=''"> <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute> </xsl:if> <!-- Make relative paths absolute --> <xsl:variable name="imgpath"> <xsl:choose> <!-- resources image dir --> <xsl:when test="starts-with(string(@src),'images/')"> <xsl:value-of select="concat($imagesdir,substring-after(@src,'images'))"/> </xsl:when> <!-- already absolute --> <xsl:when test="contains(string(@src),':') or starts-with(string(@src),'/')"> <xsl:value-of select="@src"/> </xsl:when> <!-- relative to document --> <xsl:otherwise><xsl:value-of select="concat($xmlbasedir,@src)"/></xsl:otherwise> </xsl:choose> </xsl:variable> <fo:external-graphic src="{$imgpath}"> <xsl:if test="@height"> <xsl:attribute name="height"><xsl:value-of select="@height"/></xsl:attribute> </xsl:if> <xsl:if test="@width"> <xsl:attribute name="width"><xsl:value-of select="@width"/></xsl:attribute> </xsl:if> </fo:external-graphic> <!-- alt text --> <xsl:if test="//skinconfig/pdf/show-image-alt-text='true'"> <xsl:if test="normalize-space(@alt)!=''"> <fo:block><xsl:value-of select="@alt"/></fo:block> </xsl:if> </xsl:if> </fo:block> </xsl:template> <xsl:template match="table"> <!-- FIXME: Apache FOP must have column widths specified at present, this section can be removed when this limitation is removed from Fop. Unfortunately, this means that each column is a fixed width, but at least the table displays! --> <xsl:variable name="max-number-columns"> <xsl:for-each select="tr"> <xsl:sort select="count(td|th)" data-type="number" order="descending"/> <xsl:if test="position() = 1"> <xsl:value-of select="count(td|th)"/> </xsl:if> </xsl:for-each> </xsl:variable> <xsl:variable name="column-width"> <xsl:value-of select="6.25 div number($max-number-columns)"/>in </xsl:variable> <fo:table> <fo:table-column> <xsl:attribute name="column-width"> <xsl:value-of select="$column-width"/> </xsl:attribute> <xsl:attribute name="number-columns-repeated"> <xsl:value-of select="number($max-number-columns)"/> </xsl:attribute> </fo:table-column> <!-- End of hack for Fop support (if removing this hack, remember you need the <fo:table> element) --> <fo:table-body font-size="10pt" font-family="DejaVuSerifCondensed"> <xsl:apply-templates select="tr"/> </fo:table-body> </fo:table> <!-- FIXME: Apache Fop does not support the caption element yet. This hack will display the table caption accordingly. --> <xsl:if test="caption"> <fo:block text-align="center" font-weight="bold" font-family="DejaVuSansCondensed"> <!-- insert i18n stuff here --> Table <xsl:text> </xsl:text> <xsl:number count="table" level="multiple"/> <xsl:text>: </xsl:text> <xsl:value-of select="caption"/> </fo:block> </xsl:if> </xsl:template> <xsl:template match="tr"> <fo:table-row> <xsl:apply-templates/> </fo:table-row> </xsl:template> <xsl:template match="th"> <xsl:variable name="border-color" select="//skinconfig/colors/[EMAIL PROTECTED] = 'table']/@value"/> <xsl:variable name="background-color" select="$border-color"/> <fo:table-cell padding-before="4pt" padding-after="4pt" padding-start="4pt" padding-end="4pt" color="#FFFFFF" background-color="{$background-color}" border="1pt solid {$border-color}"> <xsl:attribute name="number-columns-spanned"> <xsl:value-of select="@colspan"/> </xsl:attribute> <xsl:attribute name="number-rows-spanned"> <xsl:value-of select="@rowspan"/> </xsl:attribute> <fo:block text-align="center"> <xsl:apply-templates/> </fo:block> </fo:table-cell> </xsl:template> <xsl:template match="td"> <xsl:variable name="border-color" select="//skinconfig/colors/[EMAIL PROTECTED] = 'table']/@value"/> <xsl:variable name="background-color" select="//skinconfig/colors/[EMAIL PROTECTED] = 'table-cell']/@value"/> <fo:table-cell padding-before="4pt" padding-after="4pt" padding-start="4pt" padding-end="4pt" background-color="{$background-color}" border="1pt solid {$border-color}"> <xsl:attribute name="number-columns-spanned"> <xsl:value-of select="@colspan"/> </xsl:attribute> <xsl:attribute name="number-rows-spanned"> <xsl:value-of select="@rowspan"/> </xsl:attribute> <fo:block> <xsl:apply-templates/> </fo:block> </fo:table-cell> </xsl:template> <xsl:template match="br"> <fo:block></fo:block> </xsl:template> <xsl:template match="legal"> <fo:inline font-family="DejaVuSerif" font-size="8pt"> <xsl:apply-templates/> </fo:inline> </xsl:template> <xsl:template match="body[count(//section) != 0]"> <xsl:if test="$toc-max-depth > 0"> <fo:block font-family="DejaVuSerifCondensed" font-size="14pt" font-weight="bold" space-after="5pt" space-before="5pt" text-align="justify" width="7.5in"> <xsl:call-template name="insertPageBreaks"/> <!-- insert i18n stuff here --> <i18n:text>Table of contents</i18n:text> </fo:block> <fo:block font-family="DejaVuSansCondensed" font-size="12pt" space-after="5pt" space-before="0pt" text-align="justify" width="7.5in"> <xsl:if test="$page-break-top-sections"> <xsl:attribute name="break-after">page</xsl:attribute> </xsl:if> <xsl:apply-templates select="section" mode="toc" /> </fo:block> </xsl:if> <xsl:apply-templates /> </xsl:template> <xsl:template match="section" mode="toc"> <!-- FIXME: see bug FOR-640 --> <xsl:param name="depth" select="'1'"/> <fo:block space-before="5pt" text-align-last="justify" start-indent=".5em" text-indent=".5em"> <fo:inline> <xsl:variable name="id"> <xsl:choose> <xsl:when test="normalize-space(@id)!=''"> <xsl:value-of select="@id"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="generate-id()"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <fo:basic-link internal-destination="{$id}"> <xsl:value-of select="substring('          ', 0, 2 * $depth - 1)" /> <fo:inline font-size="10pt"> <xsl:number count="section" format="1.1.1.1.1.1.1" level="multiple" /> </fo:inline> <xsl:text> </xsl:text> <xsl:value-of select="title" /> <fo:leader leader-pattern="dots" /> <fo:page-number-citation ref-id="{$id}" /> </fo:basic-link> </fo:inline> <xsl:if test="$toc-max-depth > $depth"> <xsl:apply-templates select="section" mode="toc"> <xsl:with-param name="depth" select="$depth + 1"/> </xsl:apply-templates> </xsl:if> </fo:block> </xsl:template> <!-- ====================================================================== --> <!-- Local Extensions section --> <!-- ====================================================================== --> <xsl:template match="citation"> <fo:inline> [<xsl:value-of select="@def"/>] </fo:inline> </xsl:template> <xsl:template match="[EMAIL PROTECTED]'quote']"> <fo:block start-indent="1em" space-before="4pt" space-after="4pt" background-color="#f0f0f0" font-family="monospace"> <xsl:call-template name="insertPageBreaks"/> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template name="insertPageBreaks"> <!-- if marked as a 'pageBreakBefore', and we're breaking on pages, and were not the first node --> <xsl:if test="contains(@class, 'pageBreakBefore') and preceding-sibling::node()"> <xsl:attribute name="break-before">page</xsl:attribute> </xsl:if> <!-- if marked as a 'pageBreakAfter', and we're breaking on pages, and were not the last node --> <xsl:if test="contains(@class, 'pageBreakAfter') and following-sibling::node()"> <xsl:attribute name="break-after">page</xsl:attribute> </xsl:if> </xsl:template> <!-- Display the document numerotation --> <xsl:template name="insertPageNumber"> <xsl:param name="text-align" select="'start'"/> <xsl:variable name="prefixe" select="substring-before($page-numbering-format,'1')"/> <xsl:variable name="sep" select="substring-before(substring-after($page-numbering-format,'1'),'1')"/> <xsl:variable name="postfixe"> <xsl:choose> <xsl:when test="contains(substring-after($page-numbering-format,'1'),'1')"> <xsl:value-of select="substring-after(substring-after($page-numbering-format,'1'),'1')"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="substring-after($page-numbering-format,'1')"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- if 'page-numbering-format' contains 1 digits, the page number is displayed in the footer --> <xsl:if test="contains($page-numbering-format,'1')"> <fo:block font-family="DejaVuSans" font-size="70%" text-align="{$text-align}"> <!-- if the separator is not found, the total page number is skipped --> <xsl:value-of select="$prefixe"/><fo:page-number/><xsl:if test="$sep != ''"><xsl:value-of select="$sep"/><fo:page-number-citation ref-id="term"/></xsl:if><xsl:value-of select="$postfixe"/> </fo:block> </xsl:if> </xsl:template> <!-- ====================================================================== --> <!-- Temporary section - subject to change on short notice --> <!-- ====================================================================== --> <xsl:template match="//style"> <!-- HACK: The OpenOffice.org input plugin currently produces intermediate documents that contain a style element, invalid per the Forrest Document DTD. This style element must be ignored here. To find out why this is done this way, read the comments attached to issue FOR-433. --> </xsl:template> </xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?> <!-- 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. --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0"> <!-- Named template to generate a short message in the PDF footer, from text in skinconf.xml. By default, the message is a copyright statement. If a credit with @role='pdf' is present, that is used instead. Eg: <credit role="pdf"> <name>Generated by Apache FOP 1.0-dev</name> <url>http://xml.apache.org/fop/dev/</url> </credit> --> <xsl:template name="info"> <xsl:variable name="disable-copyright-footer" select="//skinconfig/pdf/disable-copyright-footer"/> <xsl:variable name="pdfcredit" select="//skinconfig/credits/[EMAIL PROTECTED] = 'pdf']"/> <xsl:variable name="text"> <xsl:if test="$pdfcredit"> <xsl:value-of select="$pdfcredit/name"/> </xsl:if> <xsl:if test="not($pdfcredit) and not($disable-copyright-footer = 'true')"> <xsl:text>Copyright © </xsl:text><xsl:value-of select="//skinconfig/year"/> <xsl:value-of select="//skinconfig/vendor"/><xsl:text> All rights reserved.</xsl:text> </xsl:if> </xsl:variable> <xsl:variable name="url" select="$pdfcredit/url"/> <fo:block-container font-family="DejaVuSansCondensed" font-style="italic" absolute-position="absolute" left="0pt" top="0pt" right="6.25in" bottom="150pt" font-size="10pt"> <xsl:if test="not($url)"> <fo:block text-align="center" color="lightgrey"> <xsl:value-of select="$text"/> </fo:block> </xsl:if> <xsl:if test="$url"> <fo:block text-align="center"> <fo:basic-link color="lightgrey" external-destination="{$url}"> <xsl:value-of select="$text"/> </fo:basic-link> </fo:block> <fo:block text-align="center"> <fo:basic-link color="lightgrey" external-destination="{$url}"> <xsl:value-of select="$url"/> </fo:basic-link> </fo:block> </xsl:if> </fo:block-container> </xsl:template> </xsl:stylesheet>