doSimple Introduction à XSL-FO
Introduction à XSL-FO
XSL-FO (Formatting Objects) est l’outil de prédilection pour générer du PDF. Voici une petite introduction pratique à son maniement.
Introduction
XSL-FO est un langage de description de mise en page de documents destiné principalement à l’impression (type PDF). On peut y voir des similitudes avec les formats XML de la suite Office : WordML, et de la suite OpenOffice.org : OpenDocument. Étant plutôt destiné à des typographes, il offre peut-être un meilleur contrôle du résultat. Un prérequis a cette article est une bonne connaissance de XML et de CSS.
Ce jeu de balises XML permet de faire une mise en page par zones.
Installation
L’outil principal pour traiter des fichiers XSL-FO (.fo) est FOP,
un logiciel en Java qui permet de générer des fichiers PDF mais également PS, SVG, TXT...
Téléchargez la dernière version stable de FOP (actuellement 0.20.5), son usage est assez trivial. N’hésitez pas à vous référer à la documentation en cas de doute.
Un premier document
Rentrons dans le vif du sujet avec ce premier exemple (intro.fo, pdf).
<?xml version="1.0" encoding="UTF-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" > <!-- Déclaration de la mise en page --> <fo:layout-master-set> <fo:simple-page-master master-name="ma-page" margin="2cm"> <fo:region-body /> </fo:simple-page-master> </fo:layout-master-set> <!-- Corps du document --> <fo:page-sequence master-reference="ma-page"> <fo:flow flow-name="xsl-region-body"> <fo:block>XSL-FO, c’est simple</fo:block> </fo:flow> </fo:page-sequence> </fo:root>
Le premier élément (layout-master-set) contient les déclarations de mise en page (simple-page-master) nommée (ici ma-page).
Les paramètres d’une pages sont sa dimension (page-width et page-height) et ses marges (margin ou margin-left,
margin-top, margin-right et margin-bottom). L’espace disponible est la taille de la page moins les marges.
Les régions
Ensuite une page peut se découper en 5 zones :
region-body- la zone centrale
region-before- l’entête
region-after- le pied de page
region-start- la marge de gauche
region-end- la marge de droite
Ensuite ces zones se voient définir leur(s) marge(s) à la manière de CSS.
Il est possible d’utiliser différents types d’unité : centimètres (cm), pouce (in), cadratin (em), points (pt), ...
Le flux de texte
Pour chaque page-sequence le flow contient le texte qui sera paginé automatiquement en fonction de sa longueur.
Ce flux se compose de blocs (grosso-modo le p en HTML) auquels s’applique le formattage qui se fait avec CSS.
<fo:page-sequence master-reference="ma-page">
<fo:flow
flow-name="xsl-region-body"
font-size="2em">
<fo:block
font-family="Times"
font-weight="700"
color="#f00">
XSL-FO, c’est simple
</fo:block>
<fo:block
font-size="4em"
letter-spacing="-.05em">
<fo:inline
font-weight="100">do</fo:inline><fo:inline
font-weight="900">Simple</fo:inline>
</fo:block>
<fo:block
border-left="4px solid #0f0"
padding-left="1em"
padding-top="3em"
font-family="Helvetica">
Lorem Lipsum
</fo:block>
</fo:flow>
</fo:page-sequence>
Cet exemple (pdf) est limpide pour les connaisseurs de CSS. Cependant, il faut savoir qu’il n’est pas possible
d’imbriquer des blocs comme on pourrait le faire avec l’élément div en HTML. L'œil attentif aura remarqué l’élément inline permettant
de définir un style à un élément en ligne. Il est très semblable au span d’HTML.
Exemple final
Pour terminer, un exemple concret avec plusieurs élements complexes (table, numérotation des pages, colonnes, ...). Consultez-le pour y découvrir comment se réalisent ces éléments.
Télécharger le fichier .fo (pdf).
Conclusion
XSL-FO est un format très adéquat pour générer du contenu destiné à l’impression. Mais on se rend vite compte que d’écrire dans ce format directement est assez lourd. Ainsi ce format est souvent utiliser comme format de sortie généré à partir de documents docbook, XHTML, ... ou n’importe lequel écrit selon la syntaxe XML via les transformations XSL (XSLT). Voir XSL-FO via XSLT, la suite ce cette article.
