Ludovic Frank - Développeur indépendant

Comment imprimer dans un alphabet non latin sur une imprimante Zebra ? Dans mon cas, en arabe.

ionicons-v5-k Ludovic Frank 20 janv. 2025
95 lectures Niveau : Confirmé

Coucou par ici 😁,

Merci d'avoir cliqué sur cet article, j'espère qu'il vous plaira, malgré son caractère très "niche"...

Mais bon, cette aventure m'est arrivée en décembre 2024, donc je me suis dit que j'allais en faire un article.

Vous êtes prêt ? Alors, c'est parti !

Qu'est-ce qu'une imprimante à étiquette (Zebra) ?

Sans vous en rendre compte, vous en utilisez tous les jours. Par exemple, sur vos colis commandés en ligne, il y a des étiquettes.

Ces étiquettes autocollantes sont créées à l'aide d'une imprimante à étiquette. Celle que je connais bien est celle de la marque Zebra.

À la différence d'une imprimante classique, les imprimantes à étiquette peuvent être programmées facilement avec un jeu d'instructions relativement simple. D'ailleurs, vous pouvez vous amuser avec ce jeu d'instructions sur le "ZPL Viewer".

En ce qui me concerne, la dernière fois que j'ai travaillé avec du ZPL et ce type d'imprimante, avant le mois de décembre 2024, c'était en 2021, lorsqu'on a créé la fromagerie en ligne des Frères Marchand.

Et oui, lorsque vous commandez, l'étiquette sur votre colis avec votre adresse a été imprimée avec une imprimante Zebra... Quand je vous dis que vous en utilisez tous les jours 😁.

Pourquoi cet article ?

En décembre 2024, j'ai été contacté pour plusieurs interventions sur un code en C# qui communique avec une imprimante Zebra.

La première intervention était simple : après le changement du matériel (l'imprimante), certaines images ne s'affichaient plus sur les étiquettes.

Après quelques minutes de recherche dans le code, j'ai découvert que l'instruction ZPL utilisait un "GFE" avec un fichier qui avait été chargé dans l'imprimante.

Sauf que l'imprimante avait changé entre-temps...

Et surtout, sur ce type d'imprimante et dans ce type d'environnement, elle peut être remplacée à tout moment. Dans notre cas, puisqu'elle est utilisée pour coller des étiquettes sur des colis, l'imprimante est très sollicitée tous les jours... et il ne doit surtout pas y avoir d'interruption.

Donc, c'était assez simple : j'ai remplacé l'instruction "GFE" par une instruction "GFA" avec l'image encodée. Je ne vais pas entrer trop dans les détails, car nous irons encore plus loin un peu plus bas dans cet article.

Ensuite, j'ai été sollicité pour une seconde intervention. Cette fois, il fallait que certaines informations sur l'étiquette soient disponibles en arabe, lorsque le colis est à destination d'un pays arabophone... et là, c'était plus de travail.

Pour la petite histoire : cette intervention, je l'ai réalisée alors que je venais d'attraper la grippe bien violente de fin 2024/début 2025... C'était fun.

On n'ajoute pas de fichier dans l'imprimante

Le problème avec l'arabe, c'est que c'est un alphabet non latin. Pour pouvoir imprimer dans cet alphabet avec une imprimante Zebra, il faut normalement ajouter des polices d'écriture dans l'imprimante.

Sauf que, comme dit plus haut, nous ne voulons pas faire cela.

Il a donc fallu trouver une autre solution.

Comment j'ai fait ?

Ici, nous allons entrer plus en détail dans le processus. Puis, plus bas, je vous donnerai en bonus le code de test que j'ai créé pour parvenir à mes fins.

Une bibliothèque C# pour créer des images

Comme mentionné, nous ne voulons pas ajouter de fichiers dans l'imprimante, mais nous pouvons exploiter les outils standards disponibles sur toutes les machines Windows.

En effet, il existe une bibliothèque en C# qui permet de créer des images, ce qui nous permet donc de générer une image contenant du texte en arabe.

Cette bibliothèque s'appelle "System.Drawing". Vous pouvez la télécharger avec NuGet dans Visual Studio.

Avec cette bibliothèque, vous pourrez créer des images "bitmap" en C#, et c'est un jeu d'enfant.

Vous pourrez ainsi créer une image contenant votre texte, que vous pourrez transmettre à d'autres fonctions par la suite.

S'assurer que le texte est en noir et blanc

D'après mes recherches, une imprimante Zebra ne connaît que le noir et le blanc, elle ne gère pas les niveaux de gris.

Le problème, c'est que l'image générée avec le texte contient des niveaux de gris, notamment dans les "bordures" des caractères.

Il va donc falloir transformer cette image en noir et blanc.

Pour cela, nous allons créer une fonction qui parcourt l'image, vérifie si chaque pixel est plus proche du blanc ou du noir, et le convertit complètement en noir ou en blanc.

Ne vous inquiétez pas, vous trouverez le code complet à la fin de cet article.

Transformer l'image en instruction ZPL

Maintenant que notre bitmap est en noir et blanc, il faut le transformer en instruction ZPL.

Une instruction GFA en ZPL prend 3 arguments principaux. Dans le code de test que je donne plus loin, avant le GFA, il y a un code qui indique où placer l'image sur l'étiquette. Mais pour le moment, concentrons-nous sur le GFA.

Voici les trois arguments :

  • La taille totale des données d'image.
  • La taille des données réellement utilisées (souvent identique au premier argument).
  • La largeur de l'image (en octets).
  • Les données de l'image au format hexadécimal. En C#, n'oubliez pas de supprimer les "-" lorsque vous utilisez BitConverter.ToString().

Cette partie, vous l'aurez compris, correspond à ce que j'ai fait la première fois pour remettre les logos sur une imprimante qui ne contient pas de fichiers en mémoire interne.

À ce stade, vous l'aurez compris, nous avons terminé. L'instruction est prête à être envoyée à l'imprimante.

Le code complet

Ici, je vous donne le code complet des étapes du chapitre précédent. Vous pouvez le réutiliser dans votre propre projet en C#.

Certaines parties peuvent être un peu difficiles, par exemple lorsqu'il s'agit de parcourir le bitmap pour déterminer si un pixel est noir ou blanc.

Mais dans l'ensemble, le code reste assez lisible !

Comme vous pouvez le voir, j'ai ajouté des lignes spécifiques à mon usage. Par exemple, j'utilise "Segoe UI" lorsque le texte est en arabe, tout simplement parce que cette police fonctionne très bien avec l'arabe.

Conclusion

Cet article un peu exotique touche à sa fin...

J'ai bien conscience qu'il diffère de ce que j'écris habituellement, mais que voulez-vous... Parfois, on a des interventions qui sortent complètement de notre cadre habituel (et ce n'est pas pour me déplaire !).

Passez une très bonne semaine et à la prochaine 😁.