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
| Command | Ce que cela fait | Category | Evidence |
|---|---|---|---|
^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.
| Group | Commands |
|---|---|
| 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.
| Command | Symbology or feature | What the engine does today |
|---|---|---|
^TB | Text block | Text is drawn on one line; the block doesn't wrap. Use ^FB instead. |
^B0 | Aztec (alias) | No symbol drawn. ^BO, the other Aztec command, is drawn. |
^B1 | Code 11 | No bars; the data is printed as text. |
^B4 | Code 49 | No bars; the data is printed as text. |
^B5 | Planet Code | No bars; the data is printed as text. |
^BA | Code 93 | No bars; the data is printed as text. |
^BB | CODABLOCK | No symbol; the data is printed as text. |
^BF | MicroPDF417 | No symbol; the data is printed as text. |
^BK | ANSI Codabar | No bars; the data is printed as text. |
^BL | LOGMARS | No bars; the data is printed as text. |
^BM | MSI | No bars; the data is printed as text. |
^BP | Plessey | No bars; the data is printed as text. |
^BR | GS1 DataBar | No symbol; the data is printed as text. |
^BS | UPC/EAN extensions | No bars; the data is printed as text. |
^BT | TLC39 | No symbol; the data is printed as text. |
^BZ | POSTAL | No bars; the data is printed as text. |
Known differences
- A format with no fields, such as
^XA^XZ, returns400 ERROR: No labels found in the ZPLinstead of a blank image. - Fonts: Zebra's font 0 (CG Triumvirate Bold Condensed) can't be bundled, so
^A0is drawn with Roboto Condensed Bold, with spacing calibrated per character. The bitmap fonts^AA–^AHare drawn with DejaVu Sans Mono. Text widths can differ by a few dots from a given printer. - An RFID write (
^RFfollowed 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.