Passer au contenu

ZPL compatibility of the OpenZPL engine

The OpenZPL engine draws the 51 ZPL commands of the command reference, one of them partially, and skips the ones that configure the printer. The barcode and text commands listed under “Not supported yet” don't draw correctly today.

Tested 2026-10-20 with openzpl-api 689632b at 8 dpmm.

How we test

Every example on this site is a fixture: a short synthetic label that the engine renders to a PNG when the site is built. If a fixture's ZPL changes and its image isn't rendered again, the build fails, so the image always shows what the engine does with that exact code.

The 115 fixtures are public in fixtures.json, with their size, density and image, under CC0. Use them to test any ZPL renderer.

A preview isn't a print. Darkness, media, firmware and the fonts installed on a printer change the result, so check critical labels on the printer itself.

Drawn

CommandCe que cela faitCategoryEvidence
^XA Ouvre une étiquette. Tout ce qui est jusqu'à ^XZ est une étiquette. Format de l'étiquette Rendered example
^XZ Ferme l'étiquette ouverte par ^XA et l'imprime. Format de l'étiquette Rendered example
^PW Définit la largeur de l'étiquette en points. Format de l'étiquette Rendered example
^LL Définit la longueur de l'étiquette en points. Format de l'étiquette Rendered example
^LH Déplace l'origine à partir de laquelle chaque position de champ est mesurée. Format de l'étiquette Rendered example
^LS Déplace chaque champ à gauche du nombre de points donné. Format de l'étiquette Rendered example
^LT Déplace l'ensemble de l'étiquette vers le haut ou vers le bas du nombre donné de lignes de points. Format de l'étiquette Rendered example
^PO Imprime l'étiquette normalement (N) ou à l'envers (I). Format de l'étiquette Rendered example
^PM Miroite l'ensemble de l'étiquette horizontalement lorsqu'il est réglé sur Y. Format de l'étiquette Rendered example
^PQ Définit combien d'étiquettes imprimer ; chacune compte comme une étiquette dans l'aperçu. Format de l'étiquette Rendered example
^MU Change l'unité de mesure en points, pouces ou millimètres. Format de l'étiquette Rendered example
^CI Sélectionne le jeu de caractères. ^CI28 est UTF-8. Format de l'étiquette Rendered example
^FO Définit la position du champ : coordonnées x, y en points depuis le coin supérieur gauche. Champs et position Rendered example
^FT Positionne un champ par son baseline au lieu de son coin supérieur gauche. Champs et position Rendered example
^FD Le texte ou les données de code-barres du champ actuel. Champs et position Rendered example
^FS Termine le champ actuel. Champs et position Rendered example
^FB Enveloppe le texte dans un bloc avec une largeur, un nombre de lignes et un alignement. Champs et position Rendered example
^FR Imprime le champ en blanc sur noir sur tout ce qui se trouve en dessous. Champs et position Rendered example
^FH Permet à ^FD de contenir des échappements hexadécimaux tels que _0D. Champs et position Rendered example
^FW Définit la rotation par défaut pour les champs qui suivent. Champs et position Rendered example
^FN Nomme un champ variable dans un format enregistré. Champs et position Rendered example
^FX Un commentaire. L'imprimante ignore tout jusqu'à la prochaine commande. Champs et position Rendered example
^SN Imprime un numéro qui s'incrémente sur chaque étiquette. Champs et position PartialRead but not drawn: the serial field is left out and copies aren't incremented (the same as Labelary's preview). Rendered example
^A Sélectionne la police, la rotation et la taille pour le prochain champ de texte. Texte et polices Rendered example
^A@ Sélectionne une police par son nom de fichier sur l'imprimante. Texte et polices Rendered example
^CF Définit la police et la taille utilisées lorsqu'un champ n'a pas de ^A. Texte et polices Rendered example
^CW Attribue un nom à une lettre à un fichier de police. Texte et polices Stores or recalls data; no image of its own
^BY Définit la largeur des modules, le rapport large à étroit et la hauteur pour les codes-barres qui suivent. Codes-barres Rendered example
^BC Code-barres Code 128, le plus commun sur les étiquettes d'expédition. Codes-barres Rendered example
^B3 Code-barres Code 39. Codes-barres Rendered example
^B2 Code-barres Interleaved 2 de 5, numérique uniquement. Codes-barres Rendered example
^BE Code-barres de détail EAN-13. Codes-barres Rendered example
^B8 Code-barres de détail EAN-8. Codes-barres Rendered example
^BU Code-barres UPC-A au détail. Codes-barres Rendered example
^B9 Code-barres UPC-E au détail. Codes-barres Rendered example
^BQ QR Code. Les données commencent par une correction d'erreur et un mode d'entrée, par ex. QA, Codes-barres Rendered example
^BX Code-barres 2D Data Matrix. Codes-barres Rendered example
^B7 Code-barres 2D PDF417 empilé. Codes-barres Rendered example
^BO Code-barres 2D Aztec. Codes-barres Rendered example
^BD MaxiCode, utilisé par UPS. Codes-barres Rendered example
^GB Dessine une boîte ou une ligne : largeur, hauteur, épaisseur de bordure, couleur et arrondi. Graphiques Rendered example
^GC Dessine un cercle : diamètre, épaisseur de bordure et couleur. Graphiques Rendered example
^GE Dessine une ellipse. Graphiques Rendered example
^GD Dessine une ligne diagonale. Graphiques Rendered example
^GF Intègre une image bitmap dans l'étiquette (ASCII hex, binaire ou Z64). Graphiques Rendered example
^GS Imprime un symbole enregistré, de copyright ou autre. Graphiques Rendered example
^DF Stocke le format d'étiquette sur l'imprimante sous un nom. Formats et images enregistrés Rendered example
^XF Rappelle un format stocké pour remplir ses champs ^FN. Formats et images enregistrés Rendered example
~DG Stocke une image sur l'imprimante sous un nom. Formats et images enregistrés Stores or recalls data; no image of its own
^XG Imprime une image stockée avec ~DG. Formats et images enregistrés Stores or recalls data; no image of its own
^IM Imprime une image stockée à l'origine du champ actuel. Formats et images enregistrés Stores or recalls data; no image of its own

Ignored on purpose

These commands set up the printer, not the label. The API accepts them and renders the label as if they weren't there; we checked that the image is byte-identical without them.

GroupCommands
Media and sensors^MM, ^MN, ^MT, ^MF, ~JS
Speed, darkness and tear-off^PR, ~SD, ^MD, ~TA
Calibration and printer state~JC, ~JA, ~JR, ^JU, ~HS
Network, RFID setup and host queries^NC, ^NI, ^RS, ~HI, ~HM

Not supported yet

Each one was tested by placing it in a label at 8 dpmm. None of them fails the request: the label renders, without the symbol.

CommandSymbology or featureWhat the engine does today
^TBText blockText is drawn on one line; the block doesn't wrap. Use ^FB instead.
^B0Aztec (alias)No symbol drawn. ^BO, the other Aztec command, is drawn.
^B1Code 11No bars; the data is printed as text.
^B4Code 49No bars; the data is printed as text.
^B5Planet CodeNo bars; the data is printed as text.
^BACode 93No bars; the data is printed as text.
^BBCODABLOCKNo symbol; the data is printed as text.
^BFMicroPDF417No symbol; the data is printed as text.
^BKANSI CodabarNo bars; the data is printed as text.
^BLLOGMARSNo bars; the data is printed as text.
^BMMSINo bars; the data is printed as text.
^BPPlesseyNo bars; the data is printed as text.
^BRGS1 DataBarNo symbol; the data is printed as text.
^BSUPC/EAN extensionsNo bars; the data is printed as text.
^BTTLC39No symbol; the data is printed as text.
^BZPOSTALNo bars; the data is printed as text.

Known differences

  • A format with no fields, such as ^XA^XZ, returns 400 ERROR: No labels found in the ZPL instead of a blank image.
  • Fonts: Zebra's font 0 (CG Triumvirate Bold Condensed) can't be bundled, so ^A0 is drawn with Roboto Condensed Bold, with spacing calibrated per character. The bitmap fonts ^AA–^AH are drawn with DejaVu Sans Mono. Text widths can differ by a few dots from a given printer.
  • An RFID write (^RF followed by ^FD…^FS) draws its data as text; a printer encodes it in the tag and prints nothing.

Moving from Labelary

The API keeps Labelary's v1 paths and headers, so most clients only change the host. See Migrate from Labelary for the tested differences and OpenZPL vs Labelary for the comparison.