<?xml version="1.0" encoding="utf-8"?>
<document>
   <titre>Introduction à XSL-FO</titre>
   <contenu>
      <h2>Introduction à XSL-FO</h2>
      <p class="abstract">XSL-FO (<em xml:lang="en">Formatting Objects</em>) est l’outil de prédilection pour générer du PDF.
      Voici une petite introduction pratique à son maniement.</p>
      <h3>Introduction</h3>
      <p>
         XSL-FO est un langage de description de mise en page de documents destiné principalement à l’impression (type <acronym title="Portable Document Format">PDF</acronym>).
         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.
      <p>
      <p>
         Ce jeu de balises XML permet de faire une mise en <strong>page par zones</strong>.
      </p>
      <h3>Installation</h3>
      <p>
         L’outil principal pour traiter des fichiers XSL-FO (<code>.fo</code>) est <a href="http://xmlgraphics.apache.org/fop/" hreflang="en">FOP</a>,
         un logiciel en Java qui permet de générer des fichiers PDF mais également PS, <acronym title="Scalable Vector Graphics">SVG</acronym>, TXT...
      </p>
      <p>
         Téléchargez la <a href="http://xmlgraphics.apache.org/fop/download.html" hreflang="en">dernière version stable</a> de FOP (actuellement 0.20.5),
         son usage est assez trivial. N’hésitez pas à vous référer à la
         <a href="http://xmlgraphics.apache.org/fop/0.20.5/running.html" hreflang="en">documentation</a> en cas de doute.
      </p>
      <h3>Un premier document</h3>
      <p>
         Rentrons dans le vif du sujet avec ce premier exemple (<a href="intro.fo">intro.fo</a>, <a href="intro.pdf">pdf</a>).
      </p>
<pre>
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;fo:root xmlns:fo=&quot;http://www.w3.org/1999/XSL/Format&quot; &gt;

<span style="color:#090;">&lt;!-- Déclaration de la mise en page --&gt;</span>
&lt;fo:layout-master-set&gt;
   &lt;fo:simple-page-master master-name=&quot;<strong>ma-page</strong>&quot; margin=&quot;2cm&quot;&gt;
      &lt;fo:region-body /&gt;
   &lt;/fo:simple-page-master&gt;
&lt;/fo:layout-master-set&gt;

<span style="color:#090;">&lt;!-- Corps du document --&gt;</span>
&lt;fo:page-sequence master-reference=&quot;<strong>ma-page</strong>&quot;&gt;
   &lt;fo:flow flow-name=&quot;xsl-region-body&quot;&gt;
      &lt;fo:block&gt;XSL-FO, c’est simple&lt;/fo:block&gt;
   &lt;/fo:flow&gt;
&lt;/fo:page-sequence&gt;

&lt;/fo:root&gt;
</pre>
      <p>
         Le premier élément (<code>layout-master-set</code>) contient les déclarations de mise en page (<code>simple-page-master</code>) nommée (ici <em>ma-page</em>).
         Les paramètres d’une pages sont sa dimension (<code>page-width</code> et <code>page-height</code>) et ses marges (<code>margin</code> ou <code>margin-left</code>,
         <code>margin-top</code>, <code>margin-right</code> et <code>margin-bottom</code>). L’espace disponible est la taille de la page moins les marges.
      </p>
      <h3>Les régions</h3>
      <p>
         Ensuite une page peut se découper en 5 zones :
      </p>
      <dl>
         <dt><code>region-body</code></dt>
         <dd>la zone centrale</dd>
         <dt><code>region-before</code></dt>
         <dd>l’entête</dd>
         <dt><code>region-after</code></dt>
         <dd>le pied de page</dd>
         <dt><code>region-start</code></dt>
         <dd>la marge de gauche</dd>
         <dt><code>region-end</code></dt>
         <dd>la marge de droite</dd>
      </dl>
      <p>
         Ensuite ces zones se voient définir leur(s) marge(s) à la manière de CSS.
      </p>
      <p style="text-align:center;">
         <img src="regions.png" alt="aperçu des zones" /><br /><a href="regions.fo">regions.fo</a> (<a href="regions.pdf">pdf</a>)
      </p>
      <p>
         Il est possible d’utiliser différents types d’unité : centimètres (<code>cm</code>), pouce (<code>in</code>), cadratin (<code>em</code>), points (<code>pt</code>), ...
      </p>
      <h3>Le flux de texte</h3>
      <p>
         Pour chaque <code>page-sequence</code> le <code>flow</code> contient le texte qui sera paginé automatiquement en fonction de sa longueur.
         Ce flux se compose de blocs (grosso-modo le <code>p</code> en HTML) auquels s’applique le formattage qui se fait avec CSS.
      </p>
<pre>
&lt;fo:page-sequence master-reference="ma-page"&gt;
    &lt;fo:flow
        flow-name="xsl-region-body"
        font-size="2em"&gt;
        &lt;fo:block
            font-family="Times"
            font-weight="700"
            color="#f00"&gt;
         XSL-FO, c’est simple
      &lt;/fo:block&gt;
        &lt;fo:block
               font-size="4em"
               letter-spacing="-.05em"&gt;
            &lt;fo:inline
                   font-weight="100"&gt;do&lt;/fo:inline&gt;&lt;fo:inline
                   font-weight="900"&gt;Simple&lt;/fo:inline&gt;
        &lt;/fo:block&gt;
        &lt;fo:block
               border-left="4px solid #0f0"
               padding-left="1em"
               padding-top="3em"
               font-family="Helvetica"&gt;
            Lorem Lipsum
        &lt;/fo:block&gt;
    &lt;/fo:flow&gt;
&lt;/fo:page-sequence&gt;
</pre>
      <p>
         <a href="format.fo">Cet exemple</a> (<a href="format.pdf">pdf</a>) 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 <code>div</code> en HTML. L'œil attentif aura remarqué l’élément <code>inline</code> permettant
         de définir un style à un élément en ligne. Il est très semblable au <code>span</code> d’HTML.
      </p>
      <h3>Exemple final</h3>
      <p>
          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.
      </p>
      <p>Télécharger <a href="final.fo">le fichier .fo</a> (<a href="final.pdf">pdf</a>).
      <h3>Conclusion</h3>
      <p>
          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 <a href="http://docbook.org/">docbook</a>, XHTML, ... ou n’importe lequel
          écrit selon la syntaxe XML via les transformations XSL (XSLT). Voir <a href="/articles/Introduction_XSL-FO_via_XSLT">XSL-FO via XSLT</a>, la suite ce cette article.
      </p>
   </contenu>
   <zone>
   <h4>Auteur</h4>
   <p><a href="http://yoan.dosimple.ch/">Yoan Blanc</a></p>
   <h4>Liens</h4>
   <ul>
      <li><a href="http://www.w3.org/TR/xsl/" hreflang="en">XSL</a> (<a href="http://w3.org/">W3C</a></li>
      <li><a href="http://zvon.org/xxl/xslfoReference/Output/index.html" hreflang="en">XSL FO reference</a> (<a href="http://zvon.org/">Zvon</a>)</li>
      <li><a href="http://www.renderx.com/tutorial.html" hreflang="en">XSL Formatting Objects Tutorial</a></li>
   </ul>
   </zone>
</document>

                                                                                          		