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 3

1. Qu'est ce que XSL-FO ? ...... 3

2. Structure d'un fichier XSL-FO ...... 3

3. Exemple XSL-FO ...... 4

II - Introduction à XHTML+CSS pour la publication PDF 6

1. Principe ...... 6

2. Exemple ...... 7

3. Flying Saucer ...... 8

III - Exercices 10

1. Travaux pratiques FO et Flying Saucer ...... 11

1.1. Exercice : ...... 11 1.2. Exercice : ...... 12 1.3. Exercice : ...... 15 Solutions des exercices 16

Bibliographie 17 Introduction à XSL-FO

Introduction à XSL- FO 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Syntaxe : Balisage de bloc

1 2 Contenu 3

L'élément fo:block contient des attributs de stylage.

Syntaxe : Balisage inline

1 Contenu

L'élément fo:inline contient des attributs de stylage.

3. Exemple XSL-FO

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Hello world! 16 17 18 19

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 II la publication PDF

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 format de papiers - des marges d'impression - des sauts de pages manuels et automatiques - des paragraphes solidaires - des veuves et orphelins - des numérotations de pages - des tables de matières - des 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 2 3 Document 4 5 6 7

Document

8
9

Chapitre 1

10

...

11

...

12
13
14

Chapitre 2

15

...

16
17 18

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 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

Syntaxe : Ligne de commande Flying Saucer (Windows)

1 java -cp lib/core-renderer.jar;lib/iText-2.1.7.jar org.xhtmlrenderer.simple.PDFRenderer

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 2 3 4 Wheel barrow 5 6

A good wheel barrow will save your back from extensive trauma when you garden.

7 8

1 2 3 4 Taking out the garbage 5 6 7 Find out from the town what day of the week garbage is collected in your neighborhood. 8 The night before collection, place the garbage cans on the curb. 9 After the garbage has been collected, move the cans back into your garage. 10 11 12 13 Lawnmower 14 15

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

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(), il peut ensuite être référencé par un content: element().

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)