Question : Comment insérer une image dans un gabarit de transformation ODT en XSLT ?

Niveau : Scriptage (gabarit et exportation)

Réponse :

Voici un exemple de code dans XSLT qui insère le logo de la fichothèque en cours.

<text:p>
<draw:frame draw:style-name="Logo" text:anchor-type="paragraph" svg:width="5cm" svg:height="3cm" draw:z-index="0">
<draw:image xlink:href="bdf://this/rsc/logo.png" xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/>
</draw:frame>
</text:p>

Le point à comprendre ici est la valeur de l’attribut xlink:href, en l’occurrence bdf://this/rsc/logo.png. En effet, tout le reste du code en exemple concerne le format XML OpenDocument et non le logiciel BDF.

La valeur bdf://this/rsc/logo.png indique au logiciel BDF qu’il doit insérer l’image correspondante dans le fichier ODT résultant. Cette image doit appartenir aux ressources de la fichothèque (voir Administration Personnalisation Gestion des ressources) : bdf://this/ indique qu’il s’agit d’une ressource de la fichothèque en cours. rsc/logo.png est le chemin de la ressource, en l’occurrence le chemin de l’image de logo d’accueil telle qu’elle est définie dans Configuraton logos.

Toute ressource qui est une image au format PNG ou JPEG fonctionnera (par exemple, bdf://this/theme/icons/marker-blue.png insère le marqueur bleu. Insérer une ressource qui n’est pas une image ne déclenche pas d’erreur mais ne donnera pas de résultat dans LibreOffice.

Pour compléter, voici quelques pistes pour la mise en forme de cette image dans le fichier ODT résultant. Dans l’exemple ci-dessus, on voit qu’une image est définie par un élément <draw:frame> contenant un élément <draw:image>. <draw:image> contient l’information du lien vers l’image, c’est l’élément <draw:frame> qui comprend les infromations qui nous intéressent.

La taille exacte de l’image est définie directement par les attributs svg:width et svg:height de l’élément <draw:frame>. Ces attributs sont obligatoires, en leur absence l’image est de taille ridicule.

L’autre attribut important est l’attribut text:anchor-type qui indique le type d’ancrage à la page qui, sous LibreOffice, est configurée par l’entrée « Ancrer » du menu contextuel de l’image. Les valeurs possibles sont (voir la spécification du format pour plus de détails) :

  • as-char : image traitée comme un caractère (comportement similaire à une balise <img> en HTML

  • char : image ancrée au caractère

  • paragraph : image ancrée au paragraphe

  • page : image ancrée à la page (voir les spécifications pour plus de détail)

  • frame : image ancrée au bloc de texte (n’est pas utilisé dans le format ODT)

Les autres dispositions d’une image sont déterminées par le style. Dans notre exemple, l’élément <draw:frame> possède un attribut draw:style-name dont la valeur est Logo. Il faut donc qu’un style graphique porte ce nom-là dans le fichier styles.xml dans le fichier ODT résultant. Pour cela nous allons passer par le fichier styles.css de notre gabarit de transformation, ce qui permet d’avoir une syntaxe plus ramassée.

graphic.Logo {
horizontal-pos: left;
}

Exemple de CSS pour le style du logo

Dans notre exemple, graphic.Logo indique qu’il s’agit d’un style de graphique avec comme nom Logo. La propriété horizontal-pos précise le positionnement horizontal à gauche (voir la spécification du format pour plus détail).

Questions voisines