...
Cette macro doit être appelée dans le contenu imbriqué d'une macro hardisFO.foStaticContent. Cette macro permet d'inclure un fragment de document XSL-FO, c'est-à-dire d'autres macros hardisFO.foxxx (ou d'inclure le contenu d'un fichier .ftlx contenant un fragment de document XSL-FO) dans une balise <fo:static-content>, et de mettre à jour automatiquement l'espace physique qui lui est dédié dans le document XSL-FO résultat.
Rappel : dans la définition d'un document XSL-FO, il est possible de déclarer des régions before (en-tête de page), after (pied de page), start (colonne sur le côté "gauche" de la page) et end (colonne sur le côté "droit" de la page).
Pour construire ces régions dans le document, vous devez :
...
Pas de format |
---|
<@hardisFo.foStaticContent flowName="pageHeader"><#> <#-- On divise dans cet exemple le contenu de <fo:static-content> en deux sections pour definir le header de page --><@hardisAdv.staticSection><#> <@hardisAdv.staticSection> <#-- fragment de document : un block --><@hardisFo> <@hardisFo.foBlock>I'm the block of the first section</@hardisFo.foBlock><foBlock> </@hardisAdv.staticSection><@hardisAdv.staticSection><@hardisFostaticSection> <@hardisAdv.staticSection> <@hardisFo.foBlock>I'm the block of the second section</@hardisFo.foBlock><@hardisAdvfoBlock> <@hardisAdv.staticSection includeFile="subtemplate.ftlx"></@hardisAdv.staticSection><staticSection> </@hardisAdv.staticSection><staticSection> </@hardisFo.foStaticContent> Et le sous-template subtemplate.ftlx contient le fragment : <@hardisFo.foBlock>I'm the block from the sub template</@hardisFo.foBlock> |
Et le sous-template subtemplate.ftlx contient le fragment :
Pas de format |
---|
<@hardisFo.foBlock>I'm the block from the sub template</@hardisFo.foBlock> |
Hardis - Haut de page |
---|
↑ Haut de page |
...
Visibilité d'une section
Il est possible de conditionner l'affichage d'une macro staticSection c'est-à-dire de permettre d'afficher dynamiquement (à l'exécution du template) son contenu : le paramètre "delete" de type Boolean conditionne l'affichage. La valeur "true" indique que le contenu ne sera pas présent dans le document résultat (et "false" pour une présence du contenu).
Hardis - Haut de page |
---|
↑ Haut de page |
Hauteur d'une section
Il est possible de fixer une hauteur à une macro staticSection grâce au paramètre "height". Il doit contenir une valeur de hauteur telle que défini dans la norme XSL 1.1 (cliquez ici pour plus de détails). Lorsque le paramètre "height" est fixé, la macro encapsule son contenu dans une balise <fo :block-container>. Il faut donc dans ce cas s'assurer que la nature du contenu imbriqué peut être insérée dans une balise <fo:block-container> : La spécification XSL 1.1 impose que seules les balises <fo:block>, <fo:block-container>, <fo:table> et <fo:list-block> peuvent être à l'intérieure d'une balise <fo:block-container> (cliquez ici pour plus de détails). Une section non visible (paramètre "delete" à "false") a une hauteur à 0.
Par exemple
Pas de format |
---|
<@hardisAdv.staticSection height="2cm"><@hardisFo> <@hardisFo.foBlock>Content of section with height set</@hardisFo.foBlock><foBlock> </@hardisAdv.staticSection> |
...
produit dans le document résultat :
Pas de format |
---|
<fo:block-container height="2cm"><fo> <fo:block>Content of section with height set</fo:block><block> </fo:block-container> |
Si le contenu d'une balise <fo:static-content> est entièrement imbriqué dans une ou plusieurs macros staticSection, alors, à l'exécution de celles-ci, il est possible de déduire la hauteur du contenu en additionnant les hauteurs de chaque section. Dans le cas de macros staticSection imbriquées, lorsqu'une macro a une hauteur fixée, on ne prend pas en compte dans le calcul de la hauteur finale les hauteurs des macros imbriquées.
Exemple 1 :
Pas de format |
---|
<@hardisFo.foStaticContent><@hardisAdvfoStaticContent> <@hardisAdv.staticSection height="2cm">...</@hardisAdv.staticSection><@hardisAdvstaticSection> <@hardisAdv.staticSection height="1cm">...</@hardisAdv.staticSection><@hardisAdvstaticSection> <@hardisAdv.staticSection height="4cm" delete=true>...</@hardisAdv.staticSection><staticSection> </@hardisFo.foStaticContent> |
A l'exécution, la hauteur totale est de "2cm + 1cm".
Exemple 2
Pas de format |
---|
<@hardisFo.foStaticContent><@hardisAdv.staticSection><@hardisAdvfoStaticContent> <@hardisAdv.staticSection> <@hardisAdv.staticSection height="1cm">...</@hardisAdv.staticSection><@hardisAdvstaticSection> <@hardisAdv.staticSection height="40mm">...</@hardisAdv.staticSection><staticSection> </@hardisAdv.staticSection><@hardisAdvstaticSection> <@hardisAdv.staticSection height="12pt">...</@hardisAdv.staticSection><@hardisAdvstaticSection> <@hardisAdv.staticSection includeFile="subtemplate.ftlx"></@hardisAdv.staticSection><@hardisAdvstaticSection> <@hardisAdv.staticSection height="5cm"><@hardisAdv> <@hardisAdv.staticSection height="10cm">...</@hardisAdv.staticSection><staticSection> </@hardisAdv.staticSection><staticSection> </@hardisFo.foStaticContent> |
...
Pas de format |
---|
<@hardisAdv.staticSection height="1cm">...</@hardisAdv.staticSection><@hardisAdvstaticSection> <@hardisAdv.staticSection height="2.5cm" delete=true>...</@hardisAdv.staticSection> |
A l'exécution, la hauteur totale est de "1cm + 40mm + 12pt + 1cm + 5cm".
Hardis - Haut de page |
---|
↑ Haut de page |
Mise à jour des régions
Après exécution d'une macro hardisFo.foStaticContent, si celle-ci contient des macros staticSection, la hauteur totale des sections est calculée automatiquement et propagée dans la déclaration de la région associée.
En fonction de la valeur du paramètre flowName (qui doit contenir un nom de région) et de la référence à la séquence de pages maîtresse courante (paramètre masterReference de la macro hardisFo.foPageSequence englobant la macro hardisFo.foStaticContent), il est possible de retrouver la déclaration de la balise <fo:region-xxx> associée ainsi que la balise <fo:region-body> correspondante et d'affecter aux attributs "extent" et "marginxxx" la valeur calculée de la hauteur.
Cette étape ne fonctionne que si les régions concernées n'ont pas de hauteur déjà définie par l'utilisateur : si l'attribut "extent" est présent dans la balise <fo:region-xxx>, sa valeur n'est pas modifiée. De même, l'attribut margin-xxx de la balise <fo:region-body> correspondante n'est pas ajouté.
...
Par exemple le template :
Pas de format |
---|
< <?xml version="1.0" encoding="utf-8"?><@hardisFo.foRoot><@hardisFo.foLayoutMasterSet><@hardisFo> <@hardisFo.foRoot> <@hardisFo.foLayoutMasterSet> <@hardisFo.foSimplePageMaster masterName="sampleLayout" pageHeight="29.7cm" pageWidth="21cm" marginTop="2.5cm" marginBottom="2.5cm" marginLeft="1cm" marginRight="1cm"><@hardisFo> <@hardisFo.foRegionBody/><@hardisFo> <@hardisFo.foRegionBefore regionName="headerPage"/><@hardisFo> <@hardisFo.foRegionAfter regionName="footerPage"/><> </@hardisFo.foSimplePageMaster><foSimplePageMaster> </@hardisFo.foLayoutMasterSet><@hardisFofoLayoutMasterSet> <@hardisFo.foPageSequence masterReference="sampleLayout"><@hardisFo> <@hardisFo.foStaticContent flowName="headerPage"><@hardisAdv> <@hardisAdv.staticSection height="1cm"><@hardisFo> <@hardisFo.foBlock>Page header</@hardisFo.foBlock><foBlock> </@hardisAdv.staticSection><@hardisAdvstaticSection> <@hardisAdv.staticSection height="1cm"><@hardisFo> <@hardisFo.foBlock>My company</@hardisFo.foBlock><foBlock> </@hardisAdv.staticSection><staticSection> </@hardisFo.foStaticContent> <@hardisFo.foStaticContent flowName="footerPage"><@hardisAdv> <@hardisAdv.staticSection height="1cm"><@hardisFo> <@hardisFo.foBlock>Page footer</@hardisFo.foBlock><foBlock> </@hardisAdv.staticSection><staticSection> </@hardisFo.foStaticContent> <@hardisFo.foFlow flowName="xsl-region-body"><@hardisFo> <@hardisFo.foBlock>Page body</@hardisFo.foBlock><foBlock> </@hardisFo.foFlow><foFlow> </@hardisFo.foPageSequence><foPageSequence> </@hardisFo.foRoot> |
...
Produit comme résultat :
Pas de format |
---|
<?xml version="1.0" encoding="UTF-8"?><fo> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"><fo> <fo:layout-master-set><fo-set> <fo:simple-page-master master-name="sampleLayout" margin-right="1cm" margin-bottom="2.5cm" page-height="29.7cm" page-width="21cm" margin-top="2.5cm" margin-left="1cm"><fo> <fo:region-body margin-top="1cm+1cm" margin-bottom="1cm" margin-left="0pt" margin-right="0pt"/><fo> <fo:region-before region-name="headerPage" extent="1cm+1cm"/><fo> <fo:region-after region-name="footerPage" extent="1cm"/><> </fo:simple-page-master><master> </fo:layout-master-set><foset> <fo:page-sequence master-reference="sampleLayout"><fo> <fo:static-content flow-name="headerPage"><fo> <fo:block-container height="1cm"><fo> <fo:block>Page header</fo:block><block> </fo:block-container><foblock-container> <fo:block-container height="1cm"><fo> <fo:block>My company</fo:block><block> </fo:block-container><container> </fo:static-content><focontent> <fo:static-content flow-name="footerPage"><fo> <fo:block-container height="1cm"><fo> <fo:block>Page footer</fo:block><block> </fo:block-container><container> </fo:static-content><focontent> <fo:flow flow-name="xsl-region-body"><fo> <fo:block>Page body</fo:block><block> </fo:flow><flow> </fo:page-sequence><sequence> </fo:root> |
Hardis - Haut de page |
---|
↑ Haut de page |
Détection du type de page maîtresse
...
Une première solution consiste à particulariser le contenu de chaque balise <fo:static-content> correspondant à la région choisie et au type de page maîtresse choisi.
Par exemple
Pas de format |
---|
<?xml version="1.0" encoding="utf-8"?><@hardisFo.foRoot><@hardisFo.foLayoutMasterSet><#> <@hardisFo.foRoot> <@hardisFo.foLayoutMasterSet> <#-- Déclaration des pages maitresse --> <#-- Page maitresse de type position "autre" --><@hardisFo> <@hardisFo.foSimplePageMaster masterName="otherPage" pageHeight="29.7cm" pageWidth="21cm" marginTop="1cm" marginBottom="1cm" marginLeft="2.5cm" marginRight="2.5cm"><@hardisFo> <@hardisFo.foRegionBody /><@hardisFo> <@hardisFo.foRegionBefore regionName="otherPageHeader" /><> </@hardisFo.foSimplePageMaster> <# <#-- Page maitresse de type position "premiere" --><@hardisFo> <@hardisFo.foSimplePageMaster masterName="firstPage"><@hardisFo> <@hardisFo.foRegionBody /><@hardisFo> <@hardisFo.foRegionBefore regionName="firstPageHeader" /><> </@hardisFo.foSimplePageMaster> <#-- Page maitresse de type position "derniere" --><@hardisFo> <@hardisFo.foSimplePageMaster masterName="lastPage"><@hardisFo> <@hardisFo.foRegionBody /><@hardisFo> <@hardisFo.foRegionBefore regionName="lastPageHeader" /><> </@hardisFo.foSimplePageMaster> <# <#-- Déclaration de la sequence de pages maitresse --><@hardisFo> <@hardisFo.foPageSequenceMaster masterName="allPage"><@hardisFo> <@hardisFo.foRepeatablePageMasterAlternatives maximumRepeats="no-limit"><#> <#-- La premiere page du document aura comme page maitresse "firstPage" --><@hardisFo> <@hardisFo.foConditionalPageMasterReference masterReference="firstPage" pagePosition="first" /><#> <#-- La dernière page du document aura comme page maitresse "lastPage" --><@hardisFo> <@hardisFo.foConditionalPageMasterReference masterReference="lastPage" pagePosition="last" /><#> <#-- Les autres pages du document auront comme page maitresse "otherPage" --><@hardisFo> <@hardisFo.foConditionalPageMasterReference masterReference="otherPage" pagePosition="rest" /><> </@hardisFo.foRepeatablePageMasterAlternatives><foRepeatablePageMasterAlternatives> </@hardisFo.foPageSequenceMaster><foPageSequenceMaster> </@hardisFo.foLayoutMasterSet> <@hardisFo.foPageSequence masterReference="allPage"><#> <#-- Contenu de l'en-tete de page des pages autres --><@hardisFo> <@hardisFo.foStaticContent flowName="otherPageHeader"><@hardisAdv.staticSection><#> <@hardisAdv.staticSection> <#-- Particulariser ici le contenu de l'en-tete de page des pages autres --><> </@hardisAdv.staticSection><staticSection> </@hardisFo.foStaticContent><#foStaticContent> <#-- Contenu de l'en-tete de page de la première page --><@hardisFo> <@hardisFo.foStaticContent flowName="firstHeader"><@hardisAdv.staticSection><#> <@hardisAdv.staticSection> <#-- Particulariser ici le contenu de l'en-tete de page de la premiere page --><> </@hardisAdv.staticSection><.staticSection> </@hardisFo.foStaticContent><#foStaticContent> <#-- Contenu de l'en-tete de page de la dernière page --><@hardisFo> <@hardisFo.foStaticContent flowName="lastHeader"><@hardisAdv.staticSection><#> <@hardisAdv.staticSection> <#-- Particulariser ici le contenu de l'en-tete de page de la derniere page --><> </@hardisAdv.staticSection><staticSection> </@hardisFo.foStaticContent><#foStaticContent> <#-- Contenu du corps des pages --><@hardisFo> <@hardisFo.foFlow flowName="xsl-region-body">...</@hardisFo.foFlow><foFlow> </@hardisFo.foPageSequence><foPageSequence> </@hardisFo.foRoot> |
...
Si le contenu des trois en-têtes de page (première, dernière et autres) diffère peu, il y aura duplication de fragment de contenu dans les trois macros hardisAdv.staticSection.
Si la duplication de contenu pose problème, une deuxième solution consiste à factoriser le contenu de l'en-tête dans un sous-template et de l'inclure à chaque section via l'attribut "includeFile". De plus, il est possible, dans une macro staticSection, de récupérer dynamiquement le type de page maîtresse liée à la région à l'aide des variables (de type Boolean) suivantes :
Hardis - Tableau personnalisé | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||
|
...
Par exemple
Pas de format |
---|
< <?xml version="1.0" encoding="utf-8"?><@hardisFo.foRoot><@hardisFo.foLayoutMasterSet><#> <@hardisFo.foRoot> <@hardisFo.foLayoutMasterSet> <#-- Déclaration des pages maitresses --> <#-- Page maitresse de type position "autre" --><@hardisFo> <@hardisFo.foSimplePageMaster masterName="otherPage" pageHeight="29.7cm" pageWidth="21cm" marginTop="1cm" marginBottom="1cm" marginLeft="2.5cm" marginRight="2.5cm"><@hardisFo> <@hardisFo.foRegionBody /><@hardisFo> <@hardisFo.foRegionBefore regionName="otherPageHeader" /><> </@hardisFo.foSimplePageMaster> <#-- Page maitresse de type position "premiere" --><@hardisFo> <@hardisFo.foSimplePageMaster masterName="firstPage"><@hardisFo> <@hardisFo.foRegionBody /><@hardisFo> <@hardisFo.foRegionBefore regionName="firstPageHeader" /><> </@hardisFo.foSimplePageMaster> <#-- Page maitresse de type position "derniere" --><@hardisFo> <@hardisFo.foSimplePageMaster masterName="lastPage"><@hardisFo> <@hardisFo.foRegionBody /><@hardisFo> <@hardisFo.foRegionBefore regionName="lastPageHeader" /><> </@hardisFo.foSimplePageMaster> <#-- Déclaration de la séquence de pages maitresses --><@hardisFo> <@hardisFo.foPageSequenceMaster masterName="allPage"><@hardisFo> <@hardisFo.foRepeatablePageMasterAlternatives maximumRepeats="no-limit"><#> <#-- La premiere page du document aura comme page maitresse "firstPage" --><@hardisFo> <@hardisFo.foConditionalPageMasterReference masterReference="firstPage" pagePosition="first" /><#> <#-- La dernière page du document aura comme page maitresse "lastPage" --><@hardisFo --> <@hardisFo.foConditionalPageMasterReference masterReference="lastPage" pagePosition="last" /><#> <#-- Les autres pages du document auront comme page maitresse "otherPage" --><@hardisFo> <@hardisFo.foConditionalPageMasterReference masterReference="otherPage" pagePosition="rest" /><> </@hardisFo.foRepeatablePageMasterAlternatives><foRepeatablePageMasterAlternatives> </@hardisFo.foPageSequenceMaster><foPageSequenceMaster> </@hardisFo.foLayoutMasterSet> <@hardisFo.foPageSequence masterReference="allPage"><#> <#-- Contenu de l'en-tete de page des pages autres --><@hardisFo> <@hardisFo.foStaticContent flowName="otherPageHeader"><@hardisAdv> <@hardisAdv.staticSection includeFile="headerFirstLastRestPage.ftlx"><> </@hardisAdv.staticSection><.staticSection> </@hardisFo.foStaticContent><#foStaticContent> <#-- Contenu de l'en-tete de page de la première page --><@hardisFo> <@hardisFo.foStaticContent flowName="firstHeader"><@hardisAdv> <@hardisAdv.staticSection includeFile="headerFirstLastRestPage.ftlx"><> </@hardisAdv.staticSection><staticSection> </@hardisFo.foStaticContent><#foStaticContent> <#-- Contenu de l'en-tete de page de la dernière page --><@hardisFo> <@hardisFo.foStaticContent flowName="lastHeader"><@hardisAdv> <@hardisAdv.staticSection includeFile="headerFirstLastRestPage.ftlx"><> </@hardisAdv.staticSection><staticSection> </@hardisFo.foStaticContent><#foStaticContent> <#-- Contenu du corps des pages --><@hardisFo> <@hardisFo.foFlow flowName="xsl-region-body">...</@hardisFo.foFlow><foFlow> </@hardisFo.foPageSequence<foPageSequence </@hardisFo.foRoot> |
Et le template headerFirstLastRestPage.ftlx contient :
Pas de format |
---|
<#if hardisAdv.isFirstPage><#isFirstPage> <#-- Particulariser le contenu pour la première page --></#if><#if> </#if> <#if hardisAdv.isLastPage><#isLastPage> <#-- Particulariser le contenu pour la dernière page --></#if><#if> </#if> <#if hardisAdv.isMiddlePage><#isMiddlePage> <#-- Particulariser le contenu pour les autres pages --><> </#if> |
Directive vide : Non
Paramètres
Hardis - Tableau personnalisé | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
|
...
Par exemple
Pas de format |
---|
<#-- Associer la valeur "green" à l'attribut color --><@hardisFo> <@hardisFo.foStaticContent flowName="headerPage"><#> <#-- Creation d'une section conditionnée de hauteur 1cm --><@hardisAdv--> <@hardisAdv.staticSection height="1cm" delete =.data_model.hideCopyright><@hardisFohideCopyright> <@hardisFo.foBlock>© My company 2018</@hardisFo.foBlock><foBlock> </@hardisAdv.staticSection><#staticSection> <#-- Création d'une section dynamique affichant les auteurs du documentavecdocument avec une ligne d'en-tête et un auteur par ligne --><#> <#-- Hauteur section=(Nombre d'auteurs + 1) x hauteur ligne --><#> <#-- Dans la section on fixe la hauteur d'une ligne avec l'attribut lineHeight --><@hardisAdv> <@hardisAdv.staticSection height =((.data_model.authorsList?size + 1) * 12 + "pt") delete =(.data_model.authorsList?size == 0) lineHeight="12pt"><@hardisFo> <@hardisFo.foBlock>Authors of the document:</@hardisFo.foBlock><#listfoBlock> <#list.data_model.authorsList as aAuthor><@hardisFoaAuthor> <@hardisFo.foBlock>${aAuthor}</@hardisFo.foBlock></#list><foBlock> </#list> </@hardisAdv.staticSection><staticSection> </@hardisFo.foStaticContent> |
Hardis - Haut de page |
---|
↑ Haut de page |