Révision du 7 mars 2012
Print
) d'un tel
document !).layout-master-set
) page-sequence
).<root>
contient donc essentiellement :<layout-master-set>
<head>
de
HTML).<simple-page-master>
<page-sequence-master>
<simple-page-master>
.<simple-page-master>
:master-name
)
pour mise en œuvre ultérieure <region-before>
= l'en-tête
(facultative)extent
<region-after>
= le pied de
page (id.) <region-body>
= le corps de
la page (obligatoire) margin-top
et margin-bottom
doivent être supérieurs aux extent
des régions correspondantes !<page-sequence>
.<page-sequence-master>
, voir plus
loin.<page-sequence>
<page-sequence>
de FO du <body>
de
HTML, <simple-page-master>,
qui est connu par son nom (master-name
)
valeur de l'attribut master-reference
.master-reference
désigne l'un des<page-sequence-master>
, qui décrit la
manière dont les pages de différents formats sont agencées dans la
séquence.<page-sequence>
,
chacun gérant la numérotation de ses pages.<page-sequence>
contient un seul fils <flow>
<block>
s,
de <table>
s, de listes etc. flow-name
désigne la zone de la page
où son contenu va se déverser"xsl-region-body"
).<flow>
va se répartir en autant de pages qu'il sera
nécessaire...<page-sequence>
.<page
sequence>
peut contenir deux fils <static-content>
flow-name="xsl-region-before
"), flow-name="xsl-region-before
").<block>
.<block>
et de l'<inline>
<flow>
dans la <page
sequence>
est le <block>
. text-indent
)
; text-align
; font-weight="bold"
et font-style="italic"
):keep-together="always"
)keep-together="always"
, par exemple, sa
présence a pour effet d'inhiber le processus<block>
peut
contenir d'autres <block>
s, <block>
s'oppose à celle d'<inline>
, qui
est homologue du <span>
en HTML<inline>
ne provoque pas de saut de ligne ! font-weight="bold"
,
font-style="italic"
, font-size="8pt"
,
etctext-align
ni du space-after
,
qui sont le privilège du <block>
.<inline>
:
<fo:block
font-size="10pt" keep-together="always">
<fo:block space-after="7pt">Marguerite et
Marcel AMBRONIOT</fo:block>
<fo:block space-after="5pt">Saint
André</fo:block>
<fo:block space-after="37pt">38 256 <fo:inline
font-weight="bold">Vianney</fo:inline>
</fo:block>
</fo:block>
qui
donnera quelquechose
comme
org.apache.fop.apps.Fop
qui permet de produire un fichier pdf à partir d'un fichier XML-FO.fop
qui
permet d'effectuer diverses opérations en ligne de commande.fop
:sh fop-1.0/fop foo.fo foo.pdf
ou bien : sh fop-1.0/fop -fo foo.fo -pdf
foo.pdf
foo.xsl
qui
engendre du fo, voir plus loin)sh fop-1.0/fop -xml foo.xml -xsl foo.xsl -pdf
foo.pdf
Fop
org.apache.fop.apps.FopFactory
,
OutputStream
String fichOut = le nom du fichier pdf de
sortie
out = new BufferedOutputStream(new FileOutputStream(new File(fichOut)));
Fop fop = FopFactory.newInstance().newFop(MimeConstants.MIME_PDF, out);
fop
sous la forme d'une instance de javax.xml.transform.sax.SAXResult
.javax.xml.transform.Result
.
org.xml.sax.ContentHandler
,
SAXResult
.fop
lui-même,fop.getDefaultHandler()
.Result res = new
SAXResult(fop.getDefaultHandler());
javax.xml.transform.
res
à partir du
document XML-FO, et ce faisant active le processeur fop
.res
à partir d'un document XML String fichIn = le nom du fichier XML-FO
Source src = new StreamSource(new File(fichIn));
Transformer tf = TransformerFactory.newInstance().newTransformer();
transformer.transform(src, res);
out.close();
simple-page-master
, nommés couverture
et adhérents
,page-sequence
qui le mettent en œuvre.page-sequence
"adhérents
" contient
donc deux static-content
,region-before
et region-after
qui ont été dûment spécifiées dans le simple-page-master
,flow
, qui se déverse dans region-body
,<?xml
version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master
master-name="couverture"
page-height="29.7cm"
page-width="21cm"
margin-top="1cm"
margin-bottom="1cm"
margin-left="1.5cm"
margin-right="0.5cm">
<fo:region-body margin-top="12cm" margin-bottom="10cm"/>
<!--
obligatoire !!! -->
</fo:simple-page-master>
<fo:simple-page-master
master-name="adhérents"
page-height="29.7cm"
page-width="21cm"
margin-top="1cm"
margin-bottom="1cm"
margin-left="1.5cm"
margin-right="0.5cm">
<fo:region-body margin-top="2cm" margin-bottom="2cm"/>
<!-- doivent
être supérieures aux "extent" des régions correspondantes -->
<fo:region-before extent="2cm"/>
<fo:region-after extent="1.5cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence
master-reference="couverture">
<fo:flow
flow-name="xsl-region-body">
<fo:block text-align="center" font-size="14pt"
font-style="italic"
space-after="16pt">
Association des ocarinistes de Bagnolet
</fo:block>
<fo:block text-align="center" font-size="18pt"
font-weight="bold">
Liste des adhérents
</fo:block>
</fo:flow>
</fo:page-sequence>
<fo:page-sequence
master-reference="
adhérents
">
<fo:static-content
flow-name="xsl-region-before"> <!-- attention ! pas
"flow" -->
<fo:block
text-align="center" font-size="8pt" font-style="italic">
Ocarinistes de
Bagnolet
</fo:block>
</fo:static-content>
<fo:static-content
flow-name="xsl-region-after"> <!-- idem -->
<fo:block
text-align="center">
p.
<fo:page-number />
</fo:block>
</fo:static-content>
<fo:flow
flow-name="xsl-region-body"> <!-- un seul "flow"
!!! -->
<fo:block
font-size="10pt" keep-together="always">
<fo:block space-after="7pt">Marguerite et Marcel
AMBRONIOT</fo:block>
<fo:block space-after="5pt">Saint
André</fo:block>
<fo:block space-after="37pt">38 256 <fo:inline
font-weight="bold">Vianney</fo:inline>
</fo:block>
</fo:block>
<fo:block
font-size="10pt" keep-together="always">
<fo:block space-after="7pt">Monique
ALGEBRE</fo:block>
<fo:block space-after="5pt">4 Allée de la
Termite</fo:block>
<fo:block space-after="37pt">26 537 <fo:inline
font-weight="bold">Bourg sous Valence</fo:inline>
</fo:block>
</fo:block>
<fo:block
font-size="10pt" keep-together="always">
<fo:block space-after="7pt">Mireille et Olivier
BINÔME</fo:block>
<fo:block space-after="37pt">26 356 <fo:inline
font-weight="bold">St Pierret en Diois</fo:inline>
</fo:block>
</fo:block>
....... et ainsi de suite .....................................
<fo:block
font-size="10pt" keep-together="always">
<fo:block space-after="7pt">Bruno et Martine
WEYBER</fo:block>
<fo:block
space-after="5pt">Montmartel</fo:block>
<fo:block space-after="37pt">27 340 <fo:inline
font-weight="bold">Soissons</fo:inline>
</fo:block>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
Voici ce
que donne le titre sur la couverture
fop
est conçue de manière à intégrer la transformation qui engendre le
document XML-FO.trsf.xsl
.String fichOut = le nom du fichier pdf de
sortie
out = new BufferedOutputStream(new FileOutputStream(new File(fichOut)));
Fop fop = FopFactory.newInstance().newFop(MimeConstants.MIME_PDF, out);
Result res = new
SAXResult(fop.getDefaultHandler());
String fichIn = le nom du fichier XML-source
Source src = new StreamSource(new File(fichIn));
String fichFst = "trsf.xsl";
Source src_tr = new StreamSource(new File(fichFst));
Transformer tf = TransformerFactory.newInstance().newTransformer(src_tr);
transformer.transform(src, res);
out.close();
Transformer
construit par newTransformer()
(qui se bornait à convertir le document FO en un SAXResult
,
en effectuant la transformation identique)newTransformer(src_tr)
,
qui effectue "au passage" la transformation XML -> FO.<?xml version="1.0" encoding="UTF-8"
standalone="no"?>
<liste>
<adherent nom1="AMBRONIOT" nom2=""
prenom1="Marguerite" prenom2="Marcel">
<adresse codePostal="38 256"
lieu="Saint André" localite="Vianney"/>
</adherent>
<adherent nom1="ALGEBRE" nom2=""
prenom1="Monique" prenom2="">
<adresse codePostal="26 567"
lieu="4 Allée de la Termite" localite="Bourg sous Valence"/>
</adherent>
<adherent nom1="BINÔME" nom2=""
prenom1="Mireille" prenom2="Olivier">
<adresse codePostal="26 356"
lieu="" localite="St Pierret en Diois"/>
</adherent>
<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="etiquettes"
page-height="29.7cm"
page-width="21cm"
margin-top="1cm" margin-bottom="1cm"
margin-left="1.5cm"
margin-right="0.5cm">
<fo:region-body margin-top="1cm" margin-bottom="0cm" column-count="3"/>
<fo:region-before extent="3cm"/>
<fo:region-after extent="1.5cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence
master-reference="etiquettes">
<fo:flow
flow-name="xsl-region-body">
<fo:block
font-size="10pt" keep-together="always">
<fo:block space-after="7pt">Marguerite et Marcel
AMBRONIOT</fo:block>
<fo:block space-after="7pt">Saint
André</fo:block>
<fo:block space-after="67pt">38 256
Vianney</fo:block>
</fo:block>
<fo:block
font-size="10pt" keep-together="always">
<fo:block space-after="7pt">Monique
ALGEBRE</fo:block>
<fo:block space-after="7pt">4 Allée de la
Termite</fo:block>
<fo:block space-after="67pt">26 567 Bourg sous
Valence</fo:block>
</fo:block>
<fo:block
font-size="10pt" keep-together="always">
<fo:block space-after="7pt">Mireille et Olivier
BINÔME</fo:block>
<fo:block space-after="81pt">26 356 St Pierret en
Diois</fo:block>
</fo:block>
page-sequence-master
layout-master-set
master-name
master-reference
) que son
homologue de fo:simple-page-master
.fo:page-sequence
via leur attribut master-reference
. single-page-master-reference
master-reference
repeatable-page-master-reference
master-reference
repeatable-page-master-alternatives
fo:conditional-page-master-reference
page-position
(ou odd-or-even
,
ou blank-or-not-blank
) page-position
-> first,
last, rest, any
odd-or-even
-> odd,
even, any
blank-or-not-blank
-> blank
, not-blank
,
any
master-reference
page-sequence
page-sequence-master
qui décrit sa
structure. page-sequence
que nous avons
vues précédemment
avec des page-sequence-master
?<fo:page-sequence-master
master-name="les-etiquettes">
<fo:repeatable-page-master-reference
master-reference="etiquettes" />
</fo:page-sequence-master
>
.....
<fo:page-sequence
master-reference="les-etiquettes">
... le même contenu que précédemment ...
</fo:page-sequence>
fo:page-sequence
il ya un format et
un flow
donnant le contenu.fo:page-sequence
fo:page-sequence-master
différents.<fo:page-sequence-master
master-name="la-couverture">
<fo:single-page-master-reference
master-reference="
couverture
">
</fo:page-sequence-master
>
<fo:page-sequence-master
master-name="les-adhérents">
<fo:repeatable-page-master-reference
master-reference="
adhérents
">
</fo:page-sequence-master
>
.....
<fo:page-sequence
master-reference="
la-couverture
">
... le même contenu que précédemment ...
</fo:page-sequence>
<fo:page-sequence
master-reference="les-
adhérents
">
... le même contenu que précédemment ...
</fo:page-sequence>
fo:page-sequence
relevant d'un fo:page-sequence-master
composéfo:single-page-master-reference
et d'un
fo:repeatable-page-master-reference
.)<fo:page-sequence>
peuvent
être en
nombre certes moindre, simple-page-master
seront nécessaires :<fo:simple-page-master
master-name="couverture"...>
<fo:simple-page-master
master-name="impair" ...>
page-sequence
dont la structure sera décrite par un page-sequence-master
<fo:page-sequence-master master-name="actes">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference
odd-or-even="odd"
master-reference="impair"/>
<fo:conditional-page-master-reference
odd-or-even="even"
master-reference="pair"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
page-sequence
que l'on
pourra imposer que la première page de chaque acte soit impaire, <fo:page-sequence
master-reference="actes" force-page-count="end-on-even" initial-page-number="1">
<fo:static-content
flow-name="xsl-region-before">
<fo:block text-align="center"
font-size="10pt">ACT I</fo:block>
</fo:static-content>
<fo:static-content
flow-name="xsl-region-after">
<fo:block text-align="center"
font-size="8pt">
p.
<fo:page-number/></fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">.......
force-page-count="end-on-even"
: <fo:page-sequence
master-reference="actes" force-page-count="end-on-even">
<fo:static-content
flow-name="xsl-region-before">
<fo:block text-align="center"
font-size="10pt">ACT II</fo:block>
</fo:static-content>
<fo:static-content
flow-name="xsl-region-after">
<fo:block text-align="center"
font-size="8pt">
p.
<fo:page-number/></fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">.....
<!DOCTYPE stylesheet [
<!ENTITY taille "10pt">
<!ENTITY apres1 "81pt">
<!ENTITY apres2 "67pt">
]>