Ce moteur de transformation Java de document s'appuie sur le langage de description XSL-FO.
Apache FOP supporte XSL-FO dans sa version 1.1. Cependant, un certain nombre de fonctionnalités décrites dans XSL-FO v1.1 ne sont pas implémentées par Apache FOP (cliquez ici pour plus de détails).
Langage XSL-FO
Ce langage permet de construire un document comme un ensemble d'objets de formatage.
Chaque objet a une signification (chapitre, page, paragraphe, liste, etc.) et a des propriétés comportementales et de rendu (mise en page, police de caractères, bordure, etc.).
Ce langage est basé sur XML : un document est donc construit comme une arborescence de balises au format XML.
Cliquez ci-dessous pour plus d'informations (liste non exhaustive) :
- http://w3schools.sinsixx.com/xslfo/default.asp.htm,
- https://www.qctutorials.com/learning/xslfo/index.html,
- https://www.youscribe.com/BookReader/Index/539403/?documentId=510526
- https://www.antennahouse.com/comprehensive-xsl-fo-tutorials-and-samples-collection/,
- http://www.renderx.com/tutorial.html
Voici un exemple de document XSL-FO :
<?xml version="1.0" encoding="utf-8"?> (1)
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> (2)
<fo:layout-master-set> (3)
<fo:simple-page-master master-name="A4_portrait" page-width="21cm" page-height="29.7cm">
<fo:region-body region-name="PageBody" margin="7mm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4_portrait"> (4)
<fo:flow flow-name="PageBody"> (5)
<fo:block>Hello World</fo:block> (6)
</fo:flow>
</fo:page-sequence>
</fo:root>
- Prologue (déclaration) XML. Dans le cadre de l'utilisation dans l'APE, un document XSL-FO doit être encodé en UTF-8.
- La balise <fo:root> est l'élément racine d'un document XSL-FO. Il sert aussi à déclarer l'espace de noms pour le langage XSL-FO. Toutes les balises XSL-FO ont le préfixe "fo".
- Cet élément contient une ou plusieurs déclarations de pages maîtresses et de séquence de pages maîtresses (éléments qui définissent la présentation de pages simples et de séquences de pages). Cet exemple définit une page maîtresse rudimentaire (de dimension A4, 21 cm x 29.7 cm), avec une seule zone. La zone a une marge de 7 mm de tous les côtés de la page.
- Les pages du document sont regroupées en séquences. Chaque séquence commence à partir d'une nouvelle page. L'attribut "master-reference" sélectionne un schéma de présentation approprié parmi les maîtres répertoriés dans <fo:layout-master-set>. Définir une référence sur un nom de page maîtresse signifie que toutes les pages de cette séquence seront formatées à l'aide de celle-ci.
- C'est l'objet conteneur de tout le texte utilisateur du document. Tout ce qui est contenu dans le flux sera formaté en régions sur des pages générées dans la séquence de pages. Le nom du flux relie le flux à une région spécifique de la page (définie dans la page maîtresse) ; dans l'exemple, c'est la région "region-body".
- Cet objet correspond fonctionnellement à la balise <DIV> en HTML (définition d'un bloc) et comprend normalement un paragraphe de texte. Le langage XSL-FO impose que du texte ne peut pas être placé directement dans un flux.
Un document XSL-FO peut contenir à la fois du texte et des images (via une balise d'inclusion d'images).
Apache FOP supporte un certain nombre de format d'images (Jpeg, PNG, SVG, etc.) en fonction du format final d'édition.
↑ Haut de page
Formats d'édition
Apache FOP permet de transformer un document XSL-FO en plusieurs formats de sortie. Les principaux formats sont détaillés par leur type MIME (Multipurpose Internet Mail Extensions) :
- application/pdf : format de document "Portable Document Format". La version supportée est 1.4. Si le document TransformDoc est sauvegardé dans un fichier, il est préconisé que celui-ci ait l'extension .PDF,
- application/postscript : format de document PostScript. La version supportée est PostScript Level 3. Si le document TransformDoc est sauvegardé dans un fichier, il est préconisé que celui-ci ait l'extension .PS,
- application/x-pcl : format de document "Printer Command Language". La version supportée est PCL 5 (avec support HP GL/2 et PJL). Si le document TransformDoc est sauvegardé dans un fichier, il est préconisé que celui-ci ait l'extension .PCL,
- application/rtf : format de document "Rich Text Format". Ce format n'est plus maintenu par le moteur Apache FOP 2.3. Si le document TransformDoc est sauvegardé dans un fichier, il est préconisé que celui-ci ait l'extension .RTF,
- text/plain : format de document textuel utilisant l'encodage ASCII. Si le document TransformDoc est sauvegardé dans un fichier, il est préconisé que celui-ci ait l'extension .TXT,
- image/png : format d'image "Portable Network Graphics". Si le document TransformDoc est sauvegardé dans un fichier, il est préconisé que celui-ci ait l'extension .PNG,
- image/tiff : format d'image "Tagged Image File Format". Si le document TransformDoc est sauvegardé dans un fichier, il est préconisé que celui-ci ait l'extension .TIFF (ou .TIF).
Attention
Suivant le format de sortie, il existe des différences de support de formats d'images et de formats de polices de caractères.
Gestion des polices de caractères
Apache FOP permet de gérer plusieurs polices dans un document XSL-FO.
L'attachement du texte d'une balise à une police se fait via les attributs suivants :
- font-family : décrit la famille de police (sensible à la casse),
- font-size : décrit la taille de la police,
- font-style : décrit le style de la police (normal, italique, etc.),
- font-weight : décrit le poids de la police (normal, bold, etc.).
La norme XSL-FO v1.1 définit d'autres attributs (comme font-stretch par exemple), mais ceux-ci ne sont pas implémentés dans le moteur Apache FOP 2.3.
La manipulation d'une police dans un document XSL-FO impose que celle-ci soit connue (et accessible) par Apache FOP.
Pour cela, la police doit :
- soit être installée sur le système d'exploitation,
- soit être accessible dans un répertoire connu d'Apache FOP.
Le paramétrage de la gestion des polices par Apache FOP se fait dans le fichier de configuration fop.xconf.
Détection des polices
Par défaut, Apache FOP est configuré pour charger automatiquement toutes les polices installées sur le système d'exploitation (balise "auto-detect" dans le fichier de configuration fop.xconf).
Comme cette fonctionnalité a des impacts sur les performances du moteur dans le cas de fortes charges (et dépend du nombre de polices installées), elle a été désactivée temporairement pour l'APE (et peut être réactivée dans le fichier fop.xconf).
Il est possible de manipuler une police non installée sur le système d'exploitation. Dans ce cas, vous devez indiquer le répertoire ou se trouve la police (balise "directory" dans le fichier fop.xconf).
Incorporation de polices dans le document
Par défaut, lorsqu'une police est utilisée dans un document XSL-FO, elle est incorporée dans le document résultat. Ceci peut avoir une incidence sur le temps de production du document final ainsi que sur sa taille.
Cependant, les principaux formats d'impression que sont PDF, Postcript et PCL imposent que soit supporté nativement, par les périphériques de lecture et d'impression, un certain nombre de polices.
Ces polices ("les 14 polices de base") n'ont pas besoin d'être incorporées au document. Ces polices sont les suivantes :
- Helvetica (normal, bold, italic, bold italic),
- Times (normal, bold, italic, bold italic),
- Courier (normal, bold, italic, bold italic),
- Symbol,
- ZapfDingbats.
Apache FOP associe les familles de polices suivantes pour chacune des 14 polices de base :
Police de base |
Famille de police associée |
Helvetica |
Helvetica, sans-serif, SansSerif |
Times |
Times, Times Roman, Times-Roman, serif, any |
Courier |
Courier, monospace, Monospaced |
Symbol |
Symbol |
ZapfDingbats |
ZapfDingbats |
Veuillez noter que les versions récentes d'Adobe Acrobat Reader remplacent en interne "Helvetica" par "Arial" et "Times" par "Times New Roman".
GhostScript remplace "Helvetica" par "Nimbus Sans L" et "Times" par "Nimbus Roman No9 L". D'autres lecteurs de documents peuvent effectuer des substitutions de polices similaires. Si vous devez vous assurer qu'il n'y a pas de telles substitutions, vous devez spécifier une police explicite et l'intégrer au document cible.
Lorsque qu'Apache FOP ne dispose pas d'une police spécifique (car elle n'est pas installée dans le système d'exploitation ou configurée dans la configuration fop.xconf), la police est remplacée par "any". "any" est mappé en interne sur la police "Times" des 14 polices de base (voir ci-dessus).
Chaque police contient un ensemble particulier de glyphes. Si aucun glyphe ne peut être trouvé pour un caractère donné, Apache FOP émettra un avertissement dans les traces et utilisera le glyphe pour "#" à la place (si disponible).