Saltar al contenido

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

CommandQué haceCategoryEvidence
^XA Abre una etiqueta. Todo hasta ^XZ es una etiqueta. Formato de etiqueta Rendered example
^XZ Cierra la etiqueta abierta por ^XA y la imprime. Formato de etiqueta Rendered example
^PW Establece el ancho de la etiqueta en puntos. Formato de etiqueta Rendered example
^LL Establece la longitud de la etiqueta en puntos. Formato de etiqueta Rendered example
^LH Mueve el origen desde el que se mide cada posición de campo. Formato de etiqueta Rendered example
^LS Desplaza cada campo a la izquierda por la cantidad dada de puntos. Formato de etiqueta Rendered example
^LT Mueve toda la etiqueta hacia arriba o hacia abajo por el número dado de filas de puntos. Formato de etiqueta Rendered example
^PO Imprime la etiqueta normalmente (N) o al revés (I). Formato de etiqueta Rendered example
^PM Refleja toda la etiqueta horizontalmente cuando se establece en Y. Formato de etiqueta Rendered example
^PQ Establece cuántas etiquetas imprimir; cada una cuenta como una etiqueta en la vista previa. Formato de etiqueta Rendered example
^MU Cambia la unidad de medida a puntos, pulgadas o milímetros. Formato de etiqueta Rendered example
^CI Selecciona el conjunto de caracteres. ^CI28 es UTF-8. Formato de etiqueta Rendered example
^FO Establece la posición del campo: coordenadas x, y en puntos desde la esquina superior izquierda. Campos y posición Rendered example
^FT Posiciona un campo por su línea base en lugar de su esquina superior izquierda. Campos y posición Rendered example
^FD Los datos de texto o código de barras del campo actual. Campos y posición Rendered example
^FS Finaliza el campo actual. Campos y posición Rendered example
^FB Envuelve el texto en un bloque con un ancho, contador de líneas y alineación. Campos y posición Rendered example
^FR Imprime el campo blanco sobre negro sobre lo que esté debajo. Campos y posición Rendered example
^FH Permite que ^FD contenga escapes hexadecimales como _0D. Campos y posición Rendered example
^FW Establece la rotación por defecto para los campos que siguen. Campos y posición Rendered example
^FN Nombrar un campo variable en un formato almacenado. Campos y posición Rendered example
^FX Un comentario. La impresora ignora todo hasta el siguiente comando. Campos y posición Rendered example
^SN Imprime un número que se incrementa en cada etiqueta. Campos y posición PartialRead but not drawn: the serial field is left out and copies aren't incremented (the same as Labelary's preview). Rendered example
^A Selecciona la fuente, rotación y tamaño para el siguiente campo de texto. Texto y fuentes Rendered example
^A@ Selecciona una fuente por su nombre de archivo en la impresora. Texto y fuentes Rendered example
^CF Establece la fuente y el tamaño utilizados cuando un campo no tiene ^A. Texto y fuentes Rendered example
^CW Asigna un nombre de una letra a un archivo de fuente. Texto y fuentes Stores or recalls data; no image of its own
^BY Establece el ancho del módulo, la relación de ancho a estrecho y la altura para los códigos de barras que siguen. Códigos de barras Rendered example
^BC Código de barras de Código 128, el más común en etiquetas de envío. Códigos de barras Rendered example
^B3 Código de barras de Código 39. Códigos de barras Rendered example
^B2 Código de barras Intercalado 2 de 5, solo numérico. Códigos de barras Rendered example
^BE Código de barras minorista EAN-13. Códigos de barras Rendered example
^B8 Código de barras minorista EAN-8. Códigos de barras Rendered example
^BU Código de barras minorista UPC-A. Códigos de barras Rendered example
^B9 Código de barras minorista UPC-E. Códigos de barras Rendered example
^BQ Código QR. Los datos comienzan con una corrección de errores y modo de entrada, p. ej. QA, Códigos de barras Rendered example
^BX Código de barras 2D Data Matrix. Códigos de barras Rendered example
^B7 Código de barras 2D PDF417 apilado. Códigos de barras Rendered example
^BO Código de barras 2D Aztec. Códigos de barras Rendered example
^BD MaxiCode, utilizado por UPS. Códigos de barras Rendered example
^GB Dibuja un cuadro o una línea: ancho, altura, grosor del borde, color y redondeo. Gráficos Rendered example
^GC Dibuja un círculo: diámetro, grosor del borde y color. Gráficos Rendered example
^GE Dibuja una elipse. Gráficos Rendered example
^GD Dibuja una línea diagonal. Gráficos Rendered example
^GF Incrusta una imagen de mapa de bits en la etiqueta (hexadecimal ASCII, binario o Z64). Gráficos Rendered example
^GS Imprime un símbolo registrado, de copyright u otro. Gráficos Rendered example
^DF Almacena el formato de la etiqueta en la impresora bajo un nombre. Formatos e imágenes almacenadas Rendered example
^XF Recupera un formato almacenado para llenar sus campos ^FN. Formatos e imágenes almacenadas Rendered example
~DG Almacena una imagen en la impresora bajo un nombre. Formatos e imágenes almacenadas Stores or recalls data; no image of its own
^XG Imprime una imagen almacenada con ~DG. Formatos e imágenes almacenadas Stores or recalls data; no image of its own
^IM Imprime una imagen almacenada en el origen de campo actual. Formatos e imágenes almacenadas 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.