Utiliser la Brother QL (étiqueteuse) avec le RPi - La petite histoire et présentation du projet

Salut à tous!

Encore un autre projet, je suis un homme de projet et il n’y as pas un mois que je m’en part un.

Ce coup si, je désire utiliser mon imprimante Brother QL pour générer des étiquettes via le Rapsberry Pi.

Ceux qui ce demande qu’est-ce que la Broher QL, voici l’imprimante que j’ai; https://www.brother.ca/fr/p/QL700

La petite histoire

L’idées est venu de mon travail, je suis en département Logistique (et support TI, mon titre exacte est Agent logistique, spécialiste support TI) . J’ai donc développé suivant des application en Python sous Windows pour imprimer des trucs :stuck_out_tongue: Quand j’ai pris poste, les applications était très basiques, souvent en ligne de commande et peux pratique pour ceux non initiés. J’ai fait un peu de rétro-ingénirie pour comprendre ce que mon prédécesseur avait fait.

Pour résumé, il utilisait le B-pac de Brother pour imprimer des étiquettes via les scripts VBS. Le code de base est en Python, mais pour lancer l’impression sous Windows il faut absolument passer par un langage supporté, soit des scripts en VBS.

J’ai retravaillé le code pour le rendre facilement utilisable depuis un code ou en ligne de commande directement, le résultat est disponible ici:

Le problème est que d’avoir un ordinateur complet que pour imprimer des étiquettes est une perte de ressource énorme, et exige l’installation de Python, de modules Python et du B-Pac. L’avantage ici est que le B-pac permet de réutiliser des Template généré depuis l’application P-Touch pour les formaté aux besoins.

J’ai sortie plusieurs versions d’applications améliorés, avec GUI qui est plus simple que le CLI pour l’utilisation, et j’ai adoré le fait de pouvoir imprimer des étiquettes rapidement avec juste comme effort de remplir les champs et de choisir le nombre de copies.

Avec le temps, je me suis dit qu’il serait intéressant de convertir les usages pour mon « chez nous », j’ai commencé a développé une version « domestique » et je me suis rendu compte d’une chose; l’utilisation serait limité qu’à mon ordinateur.

La j’ai eu l’idée de prendre un Raspberry Pi 2 et de le convertir en terminal de création d’étiquettes. Et de la l’idée de ce projet.


Le Projet

Le B-pac est une librairie qui est compatible seulement avec Windows, alors dès le départ je sais que les templates P-Touch ne seront pas compatible, d’après mes recherche il existe aucun équivalent pour Linux. Mais il existe un pilote pour Raspbian (oui, oui, Raspbian, pas Debian, pas Ubuntu, mais bien Raspbian) et il est simple a installé.

Il existe également un module Python pour prendre en charge la Brother QL, encore la j’ai un avantage, elle est conçu pour Linux avant tout, alors à la base j’ai besoin d’aucune modification pour arriver à lancer une impression sous RPi.

Le problème est qu’il peut imprimer que des images qu’ont lui fourni. Et à la base, une image est statique, alors impossible de les personnalisé « on the fly », théoriquement.

Alors si je veux aboutir mon projet, il faudra générer des images pour les envoyer en impression. Du coup, je dois établir mes besoins et leur design. Je part avec une première chose; la génération d’étiquette avec un code à barre.

Alors faut trouver un module pour le faire, et ce module trouvé, le « treepoem » marche très bien, mais génère une image, alors faut je l’inclus dans mon image à imprimer.

Bref, avec quelques heures de travail, je produit un premier script avec des fonctions pour génér une image de travail, ajouter du texte, ajouter une image et la sauvegardé, par la suite suffit que de l’envoyer à l’imprimante via le module Python et j’ai une impression.

La base des mesures de l’image de travail a été défini à 732px, ce basant sur un calcul de conversion de 62mm en 600dpi et la hauteur est de 183px. L’imprimante redimensionne automatiquement l’image.

Autre surprise, dans l’application P-Touch, l’impression par défaut ce fait de manière a utiliser la longueur du papier comme « largeur » et la hauteur de 62mm est celui de la « hauteur », mais l’impression par défaut sous la version Linux (que je dirais de base) est autre; la largeur du document est le 62mm, et la hauteur la longueur du papier. EN d’autres mots, P-Touch par défaut imprime en mode « bannière » tandis que l’imprimante à la base imprime en « liste », comme une imprimante à reçu.

Parfait, mes besoins ce font dans ce sens, alors j’ai aucune rotation ou autre préparatif à faire quand je crée une image pour l’impression. Alors dans mes test je ne risque pas de gaspiller du papier.

Après quelques tests et j’arrive à produire un code barre, voici un exemple généré depuis le script.

WoW, je peux généré des codes à la volé! Ajoutons une variante, avec le code affiché sous le code barre.

Bon, j’ai le « plus important », soit la compréhension de comment; ajouter du texte, ajouter une image, la redimensionner, et arriver à rendre le tout potable pour l’impression.

Alors je me lance dans la suite; Texte seulement, texte avec une image à gauche ou à droite, doubler le texte gauche et droite) pour créer des étiquette pour nommer des câbles (ont enroule le milieu et recolle les extrémité gauche et droite ensemble, comme proposé dans l’application P-Touch). Super, j’arrive a tout faire ça!


Du texte simplement


Du texte avec une image (elle est converti en noir et blanc par l’imprimante)


Pour nommer un câble

ET ceci est fait en ligne de commande, voici l’aide de mon script pour vous donner une idée (oui c’est anglais, c’est plus universel)

python3 core.py -h
** HELP **
Syntax: core.py -a <action> [parameters]
  -a    Action to do
  -c    Code for the barcode
  -t    Text to print
  -s    Display text under the barcode (like same as the code used for barcode)
  -q    Position of barcode (in px, like y,x )
  -d    For use with acion 'barcode', you can easy use 'up' or 'down' (default) for positionning the barcode (text also inverted)
            For use custom positionning, you must set value to 'custom'
  -u    Position of text (in px, like y,x)
  -m    Marge (top/left) of element(s) (in px)
  -x    Max width of image (in px)
  -y    Max height of image (in px)
  -r    Resize the image by 'wide' or 'portrait'
  -i    Image file
  -j    Position of image (left/right)
  -k    Number of copies to print (default is 1)

Les actions possibles

  • barcode Pour générer un texte et un code à barre, possible d’ajouter une information sous le code ou non. Possible de choisir aussi la position du code (up/down)
  • archive Même chose que le « barcode » mais pas possible de choisir où est le code barre et l’information du code est affiché.
  • text Imprimer un texte, s’ajuste à la largeur maximal du papier
  • textlarge Imprimer un texte, s’ajuste à la hauteur maximal du papier (qui est en fait la largeur, 732px) et est tourné à 90 degrés pour utiliser le papier en style banderole. J’ai pas mis de démo car l’image généré est très grande.
  • textimage même chose que « text », mais possible d’y ajouter une image à gauche ou droite (left/right), possible de forcer une dimension à l’image, et de pouvoir redimensionner selon la hauteur ou largeur maximal, selon le mode choisi (wide/portrait) pour déterminer qui a priorité. Ceci est du aux images en format large, ou en format portrait.
  • cable C’est un peut comme « text » mais double le texte, car il va être replié sur lui même. Une espace est libre au centre pour pas que le texte soi illisible une fois enroulé autour du câble. Le texte prend une largeur divisé en deux du papier pour s’ajuster.
  • expire Je n’ai pas encore travaillé cette section, mais va me permettre de créer des étiquettes pour les produits qui ont une date d’expiration (la bouffe quoi…), alors il inclura le nom du produit, la date d’emballage et si désiré la date d’expiration. Cette commande sera pratique pour étiqueter mes plats.

Ici je parle de ma version en ligne de commande, ultimement il y aura une interface graphique pour faciliter la création de ces étiquettes.

Une fois le projet complété, il sera disponible sur GitHub.

Donner mois vos avis, suggérez moi vos idées d’étiquettes.

Le code avance très bien, j’ai révisé pas mal de chose e amélioré mon rendu.

Pour le fun, qui a une Brother QL ?

Archives

De base


Avec information du propriétaire (sous titre)


Code à barre
En bas normal


En bas avec définition du code

En haut

En haut avec définition du code


Câble


Texte simple


Texte large

La taille est plus garde, il à une largeur de 732px en réel


Texte avec image

Texte et image à gauche


Texte et image à droite

J’ai également une interface graphique pour en générer







Mon projet peut très bien être converti pour utiliser un autre type d’imprimante, car l’impression ce fait sur une commande, alors je peux le rendre compatible pour Windows, et ajouter d’autres support d’imprimante.

Je dois encore améliorer mon code; supporter un fichier de configuration, améliorer et retirer certaines valeurs « outdated » (comme certaines marge).

Et pourquoi pas ajouter un serveur Web pour rendre le tout encore plus flexible.

Je ne poste pas toutes les pages, vous comprenez le principe :slight_smile:
Il est possible aussi de mettre à jour le RPi et de le fermer/redémarrer, et c’est protégé par mot de passe.

Me reste encore des choses à finir avant de pouvoir le sortir, tout comme encore quelques optimisation.

  • Simplifier certains paramètres du « core.py », qui génère les images et imprime
  • Faire le support pour « expire »
  • Ajouter la configuration du système depuis l’interface Web
  • Ajouter un visionnement des versions des scripts (Core,GUI,Web)
  • Aperçu des images depuis l’interface Web
  • Meilleur recharge du fichier de configuration pour prendre en charge les changements en cours d’exécution
  • Documentation du « core.py » et de l’API Web.
  • (optionnel) envoie d’image, conversion en noir et blanc et redimensionne, pour l’ajouter dans la liste des images pris en charge (Texte et image)
  • (optionnel) D’autres types d’étiquettes comme; adresse, image (seul), … des idées ?

Encore des avancement, le projet sera bientôt publié.
Voici les dernières étiquettes possibles;

Pour les adresses, utile pour les envoies, marquer l’adresse de retour ou la desination.

Version complète


Version sans le nom

Enfin les dates d’expiration, il peut y avoir plusieurs contextes, voici les résultats possibles.

La version complète


Titre et date d’expiration

Titre et da d’emballage

Sans le titre avec les deux dates

Sans titre avec la date d’expiration

Sans titre avec date d’emballage


J’ai grandement simplifié le « core.py », qui génère et imprime les images, moins de paramètres, surtout ceux optionnels jouant sur les valeur par défaut importante. Je réutilise aussi certaines valeurs entre les commandes, pour en limiter le nombre.


L’interface Web est complété dans les grandes lignes, possible d’imprimer, de contrôler le Raspberry Pi et de configurer l’imprimante via l’interface. Les mêmes options que dans la version GUI a quelques détails près.

Le API est en lien avec le GUI quand il est démarré sous Windows. Il fait office de pont entre l’application et l’imprimante relié au Raspberry Pi. Si l’adresse IP est correctement assigné dans le fichier de configuration, il est possible d’utiliser le GUI sous Windows pour lancer les impression sur le Raspberry Pi. Une démonstration de l’API offert.

Je suis encore a fixer certains détails avant de le rendre publique.

Publier sur GitHub