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 116 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 | Vad det gör | Category | Evidence |
|---|---|---|---|
^XA |
Öppnar en etikett. Allt fram till ^XZ är en etikett. | Etikettformat | Rendered example |
^XZ |
Stänger etiketten som öppnades av ^XA och skriver ut den. | Etikettformat | Rendered example |
^PW |
Ställer in etikettens bredd i punkter. | Etikettformat | Rendered example |
^LL |
Ställer in etikettens längd i punkter. | Etikettformat | Rendered example |
^LH |
Flyttar urspunget som varje fältposition mäts från. | Etikettformat | Rendered example |
^LS |
Flyttar varje fält till vänster med det angivna antalet punkter. | Etikettformat | Rendered example |
^LT |
Flyttar hela etiketten upp eller ner med det angivna antalet prickrader. | Etikettformat | Rendered example |
^PO |
Skriver ut etiketten normalt (N) eller upp och ner (I). | Etikettformat | Rendered example |
^PM |
Spegelvänder hela etiketten horisontellt när inställt på Y. | Etikettformat | Rendered example |
^PQ |
Ställer in hur många etiketter som ska skrivas ut; varje räknas som en etikett i förhandsgranskningen. | Etikettformat | Rendered example |
^MU |
Ändrar enheten till punkter, tum eller millimeter. | Etikettformat | Rendered example |
^CI |
Väljer teckenuppsättningen. ^CI28 är UTF-8. | Etikettformat | Rendered example |
^FO |
Ställer in fältposition: x, y-koordinater i punkter från det övre vänstra hörnet. | Fält och position | Rendered example |
^FT |
Positionerar ett fält efter dess baslinje istället för dess övre vänstra hörn. | Fält och position | Rendered example |
^FD |
Texten eller streckkodens data för det aktuella fältet. | Fält och position | Rendered example |
^FS |
Avslutar det aktuella fältet. | Fält och position | Rendered example |
^FB |
Omgiver text i ett block med en bredd, radantal och justering. | Fält och position | Rendered example |
^FR |
Skriver ut fältet vitt på svart över vad som helst under det. | Fält och position | Rendered example |
^FH |
Låter ^FD innehålla hexescape som _0D. | Fält och position | Rendered example |
^FW |
Ställer in standardrotation för de följande fälten. | Fält och position | Rendered example |
^FN |
Namnger ett variabelfält i ett lagrat format. | Fält och position | Rendered example |
^FX |
En kommentar. Skrivaren ignorerar allt fram till nästa kommando. | Fält och position | Rendered example |
^SN |
Skriver ut ett nummer som ökar på varje etikett. | Fält och 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 |
Väljer typsnitt, rotation och storlek för nästa textfält. | Text och typsnitt | Rendered example |
^A@ |
Väljer ett typsnitt efter dess filnamn på skrivaren. | Text och typsnitt | Rendered example |
^CF |
Ställer in typsnitt och storlek som används när ett fält inte har någon ^A. | Text och typsnitt | Rendered example |
^CW |
Tilldelar ett enbokstavsnamn till en teckensnittsfil. | Text och typsnitt | Stores or recalls data; no image of its own |
^BY |
Ställer in modulbredd, brett-till-smalt förhållande och höjd för de följande streckkoderna. | Streckkoder | Rendered example |
^BC |
Kod 128 streckkod, den vanligaste på fraktetiketter. | Streckkoder | Rendered example |
^B3 |
Kod 39 streckkod. | Streckkoder | Rendered example |
^B2 |
Interleaved 2 av 5 streckkod, endast numerisk. | Streckkoder | Rendered example |
^BE |
EAN-13 detaljhandelsstreckkod. | Streckkoder | Rendered example |
^B8 |
EAN-8 detaljhandelsstreckkod. | Streckkoder | Rendered example |
^BU |
UPC-A detaljhandelsstreckkod. | Streckkoder | Rendered example |
^B9 |
UPC-E detaljhandelsstreckkod. | Streckkoder | Rendered example |
^BQ |
QR-kod. Fältdatastarten med felkorrigeringsnivån och inmatningsläget, som i ^FDQA,text. | Streckkoder | Rendered example |
^BX |
Data Matrix 2D streckkod. | Streckkoder | Rendered example |
^B7 |
PDF417 staplad 2D-streckkod. | Streckkoder | Rendered example |
^BO |
Aztec 2D streckkod. | Streckkoder | Rendered example |
^BD |
MaxiCode, som används av UPS. | Streckkoder | Rendered example |
^GB |
Ritar en ruta eller en linje: bredd, höjd, kanttjocklek, färg och rundning. | Grafik | Rendered example |
^GC |
Ritar en cirkel: diameter, kanttjocklek och färg. | Grafik | Rendered example |
^GE |
Ritar en ellips. | Grafik | Rendered example |
^GD |
Ritar en diagonal linje. | Grafik | Rendered example |
^GF |
Bäddar in en bitmapbild i etiketten (ASCII hex, binär eller Z64). | Grafik | Rendered example |
^GS |
Skriver ut ett registrerat, upphovsrättsligt eller annat symbol. | Grafik | Rendered example |
^DF |
Lagrar etikettformatet på skrivaren under ett namn. | Lagrade format och bilder | Rendered example |
^XF |
Återkallar ett lagrat format för att fylla sina ^FN-fält. | Lagrade format och bilder | Rendered example |
~DG |
Lagrar en bild på skrivaren under ett namn. | Lagrade format och bilder | Stores or recalls data; no image of its own |
^XG |
Skriver ut en bild lagrad med ~DG. | Lagrade format och bilder | Stores or recalls data; no image of its own |
^IM |
Skriver ut en lagrad bild vid nuvarande fältursprung. | Lagrade format och bilder | 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.