Créer ou modifier un modèle d’étiquettes
Les étiquettes sont composées de deux parties : un code lisible avec un lecteur optique, et du texte.
Le code optique peut être de deux types :
- soit un QRCODE: celui-ci peut contenir :
- plusieurs informations, stockées au format JSON : il devra alors comprendre au minimum l'UID de l'objet et le code de la base de données ;
- une seule information. Dans ce cas, on privilégiera l'identifiant de type UUID, qui garantit l'unicité de l'objet au niveau mondial, sauf si le QRCODE généré est trop grand. Il faudra alors stocker uniquement l'UID de l'échantillon ;
- soit un code-barre 1D au format EAN 128. Ce format est utilisé pour les supports ronds (tubes), qui rendent la lecture optique 2D difficile. Dans ce cas, le code ne devra contenir que l'UID de l'échantillon.
Les étiquettes sont créées en recourant au logiciel FOP, écrit en Java.
Voici les opérations réalisées par l’application pour générer les étiquettes :
- pour chaque objet concerné (des contenants ou des échantillons associés à un type de contenant, et si le type de contenant est rattaché à un modèle d’étiquettes), une image du QRcode est générée dans un dossier temporaire ;
- dans ce dossier temporaire, un fichier au format XML est généré, contenant les informations à imprimer sur l’étiquette ;
- un fichier au format XSL, qui contient les ordres de création de l’étiquette, est également créé dans le même dossier. Le contenu de ce fichier est issu d’un enregistrement provenant de la table label ;
- le programme PHP fait appel à FOP pour générer, à partir du fichier XML et en utilisant le fichier XSL, un fichier PDF. Une page du fichier correspond à une étiquette (mécanisme utilisé par les imprimantes à étiquettes pour les séparer).
La configuration du modèle d’étiquettes revient à définir à la fois le contenu des informations qui seront insérées dans le code-barre ou le QRCODE et la forme que prendra l’étiquette, c’est à dire les informations qui seront imprimées, le format, etc. Cette forme reprend la syntaxe XSL comprise par FOP.
Définir le contenu du QRcode
Le QRcode est un format de code barre normalisé en deux dimensions, qui permet de stocker jusqu’à 2000 caractères en 8 bits.
Le principe retenu dans l’application est de stocker l’information au format JSON. Pour limiter la taille du code barre, les noms des balises doivent être les plus petites possibles. Voici les balises obligatoires à insérer systématiquement dans une étiquette :
Nom | Description |
---|---|
uid | Identifiant unique de l’objet dans la base de données |
db | Identifiant de la base de données. C’est la valeur du paramètre APPLI_code |
D’autres informations peuvent être également insérées :
Champs utilisables dans le QRCODE (au format JSON) ou textuellement, dans l'étiquette
Nom | Description |
---|---|
id | identifiant métier général |
col | code de la collection |
pid | identifiant de l'échantillon parent |
clp | code de risque |
pn | nom du protocole |
x | coordonnée wgs84_x de l'objet (lieu de prélèvement ou de stockage suivant le cas) |
y | coordonnée wgs84_y de l'objet |
loc | localisation du prélèvement (table des lieux de prélèvement) |
ctry | code du pays de collecte |
prod | produit utilisé pour la conservation |
cd | date de création de l'échantillon dans la base de données |
sd | date d'échantillonnage |
ed | date d'expiration de l'échantillon |
uuid | UID Universel (UUID) |
ref | référent de l'objet |
autre codes | tous les codes d’identification secondaires définis dans la table de paramètres Types d’identifiants |
les champs utilisés dans les métadonnnées | les codes des champs utilisés dans la description des métadonnées. Un modèle d’étiquette ne peut être associé qu’à un type de métadonnées |
Champs utilisables dans le QRCODE à contenu unique
Nom | Description |
---|---|
id | identifiant métier général |
uid | Identifiant unique de l’objet dans la base de données |
uuid | UID Universel (UUID) |
autre | tout identifiant secondaire non numérique - cf. paramètres > Types d'identifiants |
dbuid_origin | identifiant de la base de données d'origine. Pour un échantillon créé dans la base courante, la valeur sera de type db:uid |
Il est conseillé d'utiliser dans ce cas de figure de préférence le code UUID, qui garantit l'unicité du numéro de l'échantillon ou de l'objet au niveau mondial.
Champ utilisable dans le code-barre EAN 128
Pour des raisons de lecture optique, il est fortement conseillé de n'insérer que le numéro uid de l'échantillon.
Configuration du fichier XSL
La syntaxe particulière du fichier XSL ne doit être modifiée qu’en conservant la version initiale (recopie dans un bloc-notes, par exemple), pour éviter de perdre une configuration opérationnelle suite à un mauvais paramétrage.
Voici la description du contenu du fichier et les zones modifiables.
Entête du fichier
Elle permet de modifier la taille de l’étiquette (largeur et hauteur maximale). Vous ne devriez changer que les attributs page-height et page-width. Pour les marges (attributs margin-), soyez prudents et vérifiez notamment que les QRcodes ne soient pas rognés à cause de marges insuffisantes.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="objects">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="label"
page-height="5cm" page-width="10cm"
margin-left="0.5cm"
margin-top="0.5cm"
margin-bottom="0cm"
margin-right="0.5cm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="label">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates select="object" />
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="object">
Format de l’étiquette
Le contenu de l’étiquette est décrit sous la forme d’un tableau (balises fo:table). La première colonne contient le QRCode, la seconde le texte associé.
Ici, deux colonnes de taille identique (4 cm chacune) sont définies.
<fo:table table-layout="fixed" border-collapse="collapse"
border-style="none" width="8cm"
keep-together.within-page="always">
<fo:table-column column-width="4cm"/>
<fo:table-column column-width="4cm" />
<fo:table-body border-style="none" >
Les cellules (table-cell) sont insérées dans une ligne (table-row) :
<fo:table-row>
Insertion du QRcode
Le QRcode est inséré dans un bloc. Les seules informations modifiables sont celles concernant la
hauteur (attribut height et la largeur (attribut content-width)). Veillez à ce que la hauteur et la largeur
soient identiques, et ne modifiez pas les autres informations.
<fo:table-cell>
<fo:block>
<fo:external-graphic>
<xsl:attribute name="src">
<xsl:value-of select="concat(uid,’.png’)" />
</xsl:attribute>
<xsl:attribute name="content-height">
scale-to-fit
</xsl:attribute>
<xsl:attribute name="height">4cm</xsl:attribute>
<xsl:attribute name="content-width">4cm</xsl:attribute>
<xsl:attribute name="scaling">uniform</xsl:attribute>
</fo:external-graphic>
</fo:block>
</fo:table-cell>
Contenu textuel
Les autres informations sont affichées dans des blocs, avec une ligne par catégorie d’information.
L’étiquette commence ici par indiquer l’établissement (ici, INRAE), écrit en gras.
<fo:table-cell>
<fo:block>
<fo:inline font-weight="bold">
INRAE
</fo:inline>
</fo:block>
Chaque information est affichée dans un bloc, comprenant un titre (par exemple, uid), associé à une ou plusieurs valeurs. Ainsi, la première ligne affiche sur la même ligne, et en gras (attribut font-weight= "bold"), le code de la base de données () et l’UID de l’objet ().
<fo:block>uid:
<fo:inline font-weight="bold">
<xsl:value-of select="db"/>:
<xsl:value-of select="uid"/></fo:inline>
</fo:block>
<fo:block>id:
<fo:inline font-weight="bold">
<xsl:value-of select="id"/></fo:inline>
</fo:block>
<fo:block>col:
<fo:inline font-weight="bold">
<xsl:value-of select="col"/></fo:inline>
</fo:block>
<fo:block>clp:
<fo:inline font-weight="bold">
<xsl:value-of select="clp"/></fo:inline>
</fo:block>
Si vous souhaitez modifier la taille des caractères, utilisez la balise :
<fo:inline font-size="8pt">texte</fo:inline>
<fo:inline font-size="8pt" font-weight="bold">texte en gras</fo:inline>
Fin de l’étiquette
Une fois toutes les informations affichées, le tableau est fermé, et un saut de page est généré systématiquement :
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<fo:block page-break-after="always"/>
Enfin, le fichier XSL est correctement fermé :
</xsl:template>
</xsl:stylesheet>
Il est possible de créer des étiquettes avec des formats différents, par exemple en créant plusieurs
lignes. Pensez à fermer vos balises, et qu’elles soient correctement imbriquées, pour éviter tout souci.
Pour aller plus loin dans la mise en page, vous pouvez consulter la documentation du projet FOP, et pour le formatage du texte, celle concernant XSL.