Téléchargement des produits


Version anglaise


Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

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é
alternateColorstrue
firstLineHeadertrue
marginLeft30px

Nom de variable

Description

hardisAdv.isFirstPage

"true" si cette macro s'exécute dans une balise <fo:static-content> associée à une page maîtresse ayant un critère de position "first" ou "only" ou "any"

hardisAdv.isLastPage

"true" si cette macro s'exécute dans une balise <fo:static-content> associée à une page maîtresse ayant un critère de position "last" ou "only" ou "any"

hardisAdv.isMiddlePage

"true" si cette macro s'exécute dans une balise <fo:static-content> associée à une page maîtresse ayant un critère de position "rest" ou "any"

hardisAdv.isOddPage

"true" si cette macro s'exécute dans une balise <fo:static-content> associée à une page maîtresse ayant un critère de parité "odd" ou "any"

hardisAdv.isEvenPage

"true" si cette macro s'exécute dans une balise <fo:static-content> associée à une page maîtresse ayant un critère de parité "even" ou "any"

hardisAdv.isBlankPage

"true" si cette macro s'exécute dans une balise <fo:static-content> associée à une page maîtresse ayant un critère de contenance "blank" ou "any"

hardisAdv.isNotBlankPage

"true" si cette macro s'exécute dans une balise <fo:static-content> associée à une page maîtresse ayant un critère de contenance "not-blank" ou "any"

...



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

Boolean

delete

Suppression de la section et de son contenu

Optionnel. La valeur par défaut est "false"

String

height

Hauteur de la section.

Optionnel.

String

includeFile

Chemin relatif vers un sous-template .ftlx.

Optionnel

...



 


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