FO - Cours (Stéphane Crozat)
Transcription
FO - Cours (Stéphane Crozat)
Langages de publication paginée Ingénierie Documentaire http://doc.crzt.fr Stéphane Crozat 14 septembre 2016 Table des matières I - Introduction à XSL-FO 1. Qu'est ce que XSL-FO ? 3 ......................................................................................................... 3 2. Structure d'un fichier XSL-FO 3. Exemple XSL-FO ................................................................................................ 3 ....................................................................................................................... 4 II - Introduction à XHTML+CSS pour la publication PDF 6 1. Principe ........................................................................................................................................ 6 2. Exemple ....................................................................................................................................... 7 3. Flying Saucer .............................................................................................................................. 8 III - Exercices 1. Travaux pratiques FO et Flying Saucer 10 ............................................................................... 11 1.1. Exercice : ............................................................................................................................................................ 11 1.2. Exercice : ............................................................................................................................................................ 12 1.3. Exercice : ............................................................................................................................................................ 15 Solutions des exercices 16 Bibliographie 17 Introduction à XSL-FO Introduction à XSLFO I 1. Qu'est ce que XSL-FO ? Définition : XSL Formatting Objects XSL-FO (on parle généralement plus simplement de FO) est la seconde partie du langage XSL, qui définit un langage de présentation en vue de la publication de documents imprimables. C'est un langage XML permettant d'obtenir un fichier PDF une fois traité par un moteur de rendu FO. Remarque : FO est un langage de publication Le langage FO n'est pas destiné à être écrit manuellement, mais plutôt à être obtenu automatiquement après une transformation XSL-XSLT. Chaîne de publication FO (Technologies Apache) Complément : Moteurs FO - Apache FOP, moteur open source, ne supportant pas la totalité du standard http://xmlgraphics.apache.org/fop - XEP, moteur commercial, plus complet http://www.renderx.com - Antenna House Formatter http://www.antennahouse.com 2. Structure d'un fichier XSL-FO Un fichier XSL-FO est composé de deux parties : - La mise en page générale ou layout - Le contenu et sa mise en forme 3 Exemple XSL-FO Syntaxe 1 <?xml version="1.0" encoding="utf-8"?> 2 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 3 <fo:layout-master-set> 4 <fo:simple-page-master master-name="..."> 5 6 <!--mise en page --> 7 8 </fo:simple-page-master> 9 </fo:layout-master-set> 10 <fo:page-sequence master-reference="..."> 11 12 <!--contenu --> 13 14 </fo:page-sequence> 15 </fo:root> Syntaxe : Balisage de bloc 1 <fo:block> 2 Contenu 3 </fo:block> L'élément fo:block contient des attributs de stylage. Syntaxe : Balisage inline 1 <fo:inline>Contenu</fo:inline> L'élément fo:inline contient des attributs de stylage. 3. Exemple XSL-FO 1 <?xml version="1.0" encoding="utf-8"?> 2 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 3 <fo:layout-master-set> 4 <fo:simple-page-master master-name="A4" page-height="297mm" page-width="210mm" margin-top= "1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm"> 5 <fo:region-body margin="3cm"/> 6 <fo:region-before extent="2cm"/> 7 <fo:region-after extent="2cm"/> 8 <fo:region-start extent="2cm"/> 9 <fo:region-end extent="2cm"/> 10 </fo:simple-page-master> 11 </fo:layout-master-set> 12 <fo:page-sequence master-reference="A4"> 13 <fo:flow flow-name="xsl-region-body"> 14 <fo:block> 15 <fo:inline font-weight="bold">Hello world!</fo:inline> 16 </fo:block> 17 </fo:flow> 18 </fo:page-sequence> 19 </fo:root> 4 Exemple XSL-FO Exemple de structure de page FO Complément : Pour aller plus loin - "Publier à partir de XML : Formatting Objects" (par Bruno Bachimont) (cf. fo.pdf) - XML : Cours et exercice * , pp157-167 * Complément - Stylesheet Tutorial, Sample Files of Formatting Objects and Sample Stylesheets http://www.antennahouse.com/XSLsample/XSLsample.htm 5 Introduction à XHTML+CSS pour la publication PDF Introduction à XHTML+CSS pour la publication PDF II 1. Principe CSS introduit avec CSS 2.1 puis prolonge avec CSS3 des extensions pour gérer les médias paginés. En effet les pages XHTML destinées à l'écran ne sont pas paginées : le scrolling permet d'étendre la taille d'une page à l'infini. À l'inverse, lors d'une impression typiquement, la taille de la page est fixe. Ces extensions recouvrent typiquement la gestion : - des des des des des des des des ... format de papiers marges d'impression sauts de pages manuels et automatiques paragraphes solidaires veuves et orphelins numérotations de pages tables de matières entêtes et pieds de page Schéma de principe Chaîne de publication CSS (Technologies Apache et Flying Saucer) Exemple : Exemples de moteurs XHTML+CSS - PrinceXML Référence commerciale (version d'évaluation disponible). 6 Exemple http://www.princexml.com/ - Flying Saucer Moteur Open Source. http://code.google.com/p/flying-saucer/ - Antenna House Formatter http://www.antennahouse.com/ Complément : Standards associés - CSS3 Module: Paged Media, W3C Working Draft, 10 October 2006. http://www.w3.org/TR/css3-page/ - CSS Paged Media Module Level 3, Editor's Draft, 6 October 2011. http://dev.w3.org/csswg/css3-page/ - CSS Generated Content for Paged Media Module, W3C Working Draft, 08 June 2010. http://www.w3.org/TR/css3-gcpm/ - CSS Fonts Module Level 3, W3C Working Draft, 4 October 2011. http://www.w3.org/TR/css3-fonts/ - Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification, W3C Recommendation, 07 June 2011. http://www.w3.org/TR/CSS21/ Rappel Structure générale XHTML (cf. p.) Balises de base XHTML (cf. p.) Introduction à CSS (cf. p.) 2. Exemple Exemple : XHTML 1 <html> 2 <head> 3 <title>Document</title> 4 <link href="exemple.css" type="text/css" rel="stylesheet"/> 5 </head> 6 <body> 7 <h1>Document</h1> 8 <div id="chapter1" class="part chapter"> 9 <h2>Chapitre 1</h2> 10 <p>...</p> 11 <p>...</p> 12 </div> 13 <div id="chapter2" class="part chapter"> 14 <h2>Chapitre 2</h2> 15 <p>...</p> 16 </div> 17 </body> 18 </html> 7 Flying Saucer Exemple : CSS 1 @page { 2 size: A4 portrait; 3 margin: 2cm; 4 @bottom-right { 5 content: counter(page); 6 font-size: 8pt; 7 font-family: "Computer Modern"; 8 text-align: right; 9 } 10 } 11 div.part { 12 page-break-before: always; 13 } 14 h1, h2 { 15 text-align: center; 16 } 17 p { 18 text-align: justify; 19 orphans: 0; 20 widows: 0; 21 } Complément - Introduction to page composition with CSS http://www.antennahouse.com/CSSInfo/index.html 3. Flying Saucer Flying Saucer est un moteur de rendu permettant de générer du PDF à partir d'une source XHTML+CSS. Il exploite les possibilités de CSS 2.1 et quelques fonctions CSS3. Il est Open Source. Fondamental : Programme Flying Saucer Télécharger la version officielle en ligne sur http://code.google.com/p/flying-saucer/ [cf. Exécutable Java Flying Saucer] Syntaxe : Ligne de commande Flying Saucer (Linux et Mac) 1 java -cp lib/core-renderer.jar:lib/iText-2.1.7.jar org.xhtmlrenderer.simple.PDFRenderer <input.xhtml> <output.pdf> Syntaxe : Ligne de commande Flying Saucer (Windows) 1 java -cp lib/core-renderer.jar;lib/iText-2.1.7.jar org.xhtmlrenderer.simple.PDFRenderer <input.xhtml> <output.pdf> 8 Flying Saucer Remarque - FS prend en entrée du XHTML, le fichier HMTL doit donc être un XML valide - FS échoue quelques fois à générer un nouveau PDF lorsque le fichier de destination est ouvert (le supprimer en cas de problème). Complément http://code.google.com/p/flying-saucer/ 9 Exercices Exercices III 10 Exercice : 1. Travaux pratiques FO et Flying Saucer 1.1. Exercice : [45 min] Soit les fichiers DITA ci-après. 1 <?xml version="1.0" encoding="utf-8"?> 2 <!-- wheelbarrow.xml --> 3 <concept id="wheelbarrow" xml:lang="en-us"> 4 <title>Wheel barrow</title> 5 <conbody> 6 <p>A good wheel barrow will save your back from extensive trauma when you garden.</p> 7 </conbody> 8 </concept> 1 <?xml version="1.0" encoding="utf-8"?> 2 <!-- takinggarbage.xml --> 3 <task id="takinggarbage" xml:lang="en-us"> 4 <title>Taking out the garbage</title> 5 <taskbody> 6 <steps> 7 <step><cmd>Find out from the town what day of the week garbage is collected in your neighborhood. </cmd></step> 8 <step><cmd>The night before collection, place the garbage cans on the curb.</cmd></step> 9 <step><cmd>After the garbage has been collected, move the cans back into your garage. </cmd></step> 10 </steps> 11 </taskbody> 12 <related-links> 13 <link href="../concepts/lawnmower.xml" format="dita" type="concept" ><linktext>Lawnmower</linktext></link> 14 </related-links> 15 </task> 11 Exercice : Question 1 [solution n°1 p.16] [ *] En utilisant Oxygen, produire une XSLT qui permet de publier en PDF via FO le fichier de type concept. Indices : Oxygen : Transformations XSLT (cf. p.) Scénario de publication XSLT->FO->PDF avec Oxygen Penser à la gestion des namespaces. 1 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:fo="http: //www.w3.org/1999/XSL/Format"> Question 2 Traiter de la même façon le fichier de type task. 1.2. Exercice : [45 minutes] La réalisation de ce tutoriel porte sur la publication progressivement améliorée du fichier XHTML disponible en exemple. Installer et tester Flying Saucer (cf. p.8) . Question 1 Lancer Flying Saucer en ne précisant aucune feuille de style (désactiver la feuille de style dans le fichier XHTML) pour observer le stylage de base appliqué aux éléments XHTML (FS contient une feuille de style par défaut). Question 2 Appliquer un style simple sur les éléments (h1, h2, p) et observer les changements dans le PDF : centrer les titres et justifier les paragraphes par exemple. 12 Exercice : Question 3 Préciser un style de page qui réduit la taille des pages et augmente leurs marges. Indice : CSS3 Module: Paged Media Section : "3. Page Boxes: the @page Rule" http://www.w3.org/TR/css3-page/#page-box-page-rule Question 4 Modifier la police du document, en utilisant la police Computer Modern spécifiée dans le fichier polices/cmunrm.ttf du dossier de l'exemple. Indices : CSS Fonts Module Level 3 Section : "4 Font resources > 4.1 The @font-face rule" http://www.w3.org/TR/css3-fonts/#font-face-rule Il faut déclarer un @font-face pour les 4 types de polices (normal, bold, italic, bold/italic). La propriété -fs-pdf-font-embed est spécifique à FS et permet d'embarquer la police dans le PDF. Question 5 Insérer des sauts de page avant chaque partie du document ( div de classe part) et éviter les veuves et les orphelins (adapter le document pour visualiser la gestion des veuves et orphelins). Indice : CSS3 Module: Paged Media Section : "5. Page Breaks" http://www.w3.org/TR/css3-page/#page-breaks Question 6 Numéroter automatiquement les parties en utilisant un compteur personnalisé. Indices : Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification Section : "Syntax and basic data types > 4.3.5 Counters" http://www.w3.org/TR/CSS21/syndata.html#counter La pseudo-classe :before permet d'insérer le compteur avant le contenu inline de l'élément 13 Exercice : Question 7 Insérer des numéros de page en marge, dont la position dépend si l'on se situe sur une page paire ou impaire. On utilisera le compteur page géré en interne par le moteur. Indices : CSS Generated Content for Paged Media Module Section : "2. Running headers and footers" http://www.w3.org/TR/css3-gcpm/#running-headers-and-footers Les @bottom-left, @bottom-right n'hérite de rien : il faut dupliquer les règles de mise en forme (police, taille) CSS Paged Media Module Level 3 Section : "7.1. Page-based counters" http://dev.w3.org/csswg/css3-page/#page-based-counters Question 8 Insérer le titre du document en entête des pages. L'élément portant le contenu à mettre en marge doit être sorti du "flot" par la propriété position: running(<identifiant>), il peut ensuite être référencé par un content: element(<identifiant>). Indices : CSS Generated Content for Paged Media Module Section : "2. Running headers and footers" http://www.w3.org/TR/css3-gcpm/#running-headers-and-footers On utilise la balise title du head plutôt que de créer un autre élément portant le titre, le head étant caché par la feuille de style par défaut, on force son affichage dans une première règle : head {display: block;} La mise en forme des blocs référencés de cette manière n'est pas facile, il ne vaut mieux pas trop en abuser. 14 Exercice : Question 9 Créer une table des matières. Indices : CSS Generated Content for Paged Media Module Section : "3. Leaders" http://www.w3.org/TR/css3-gcpm/#leaders La fonction leader('.') insère des points jusqu'à la fin de la ligne. la fonction target-counter(attr(href), page) récupère la valeur du compteur page tel qu'il est à l'élément pointé par l'attribut href. NB : Cela ne fonctionne que pour le compteur page dans Flying Saucer. 1.3. Exercice : [2h] Soit les fichiers DITA [cf. Sources XML "Garage tasks and concepts"][cf. Publication PDF "Garage concepts"][cf. Publication PDF "Garage tasks"] Question 1 Écrire une transformation XSLT pour intégrer les différents fichiers DITA en un seul fichier XML. Indice : Utiliser la fonction document() et l'instruction xsl:copy. Principales instructions XSLT (cf. p.) Question 2 Écrire une transformation XSLT pour obtenir un PDF en utilisant XHTML+CSS et Flying Saucer. Question 3 Écrire une transformation XSLT pour obtenir un PDF en utilisant XSL-FO et Oxygen. Indice : [cf. "Publier à partir de XML : Formatting Objects" (par Bruno Bachimont)] 15 Solutions des exercices Solutions des exercices > Solution n°1 Exercice p. 12 [cf. Exemple de solution] 16 Stéphane Crozat (Contributions : David Rivron) Bibliographie Bibliographie Alexandre Brillant, XML : Cours et exercices, Eyrolles, 2007 [ISBN 978-2212126914] 17 Stéphane Crozat (Contributions : David Rivron)