El manual completo de Zebra Programming Language — anatomía, comandos, fuentes, códigos de barras y ejemplos listos para copiar y pegar en envíos, retail y logística.
TL;DR
ZPL (Zebra Programming Language) es el estándar de facto para impresión de etiquetas térmicas desde los años 80. Toda etiqueta empieza con ^XA y termina con ^XZ. Los comandos con ^ van dentro del formato; los comandos con ~ configuran la impresora. Las coordenadas se expresan en dots (203 dpi = 8 dots/mm, 300 dpi = 12 dots/mm). Las fuentes integradas 0 y A–H cubren la mayoría de casos — la Fuente 0 es totalmente escalable. Los códigos de barras más usados son ^BC (Code 128) para envíos, ^BQ (QR) para tracking y ^BE (EAN-13) para retail. Define la posición del campo con ^FO, escribe el dato con ^FD y cierra cada campo con ^FS. Usa ^CI28 para habilitar UTF-8 y caracteres internacionales.
Prueba nuestras herramientas ZPL gratuitas ahora
Gratis, funciona en el navegador — Resultados instantáneos
ZPL son las siglas de Zebra Programming Language, un lenguaje de descripción de página creado por Zebra Technologies en la década de 1980 para controlar impresoras térmicas de etiquetas. Es el estándar de la industria para etiquetas de envío, identificación de almacén, tags de precio en retail y empaque farmacéutico porque es compacto, determinístico y compatible con todos los modelos de impresora Zebra (ZD, ZT, ZE, ZQ, GK, GX, ZM y las antiguas 105SL/110XiIII).
Un programa ZPL es un flujo de texto plano de comandos que la impresora interpreta línea por línea. Cada comando empieza con un carácter de control — ^ (caret) para comandos de formato o ~ (tilde) para comandos de configuración — seguido de un código de dos caracteres y parámetros opcionales separados por comas. ZPL II, la revisión actual, añade gráficos, fuentes descargables, campos fijos y serializados, etiquetas multi-formato y comunicación bidireccional. El mismo código imprime el mismo resultado en cualquier impresora Zebra, lo que convierte a ZPL en la lingua franca de la producción de etiquetas en todo el mundo.
Cada etiqueta imprimible es un bloque autocontenido llamado formato. El formato abre con ^XA, contiene uno o más campos y cierra con ^XZ. Dentro del bloque importa el orden: la impresora aplica los comandos secuencialmente como estado. Un campo — texto, código de barras o gráfico — se define con un comando de posición (^FO o ^FT), un comando de contenido (^A, ^BC, ^GB, etc.) y un separador (^FS). Lo que esté fuera de ^XA..^XZ se trata como configuración de impresora y se ejecuta inmediatamente.
^XA ; Inicio del formato
^CI28 ; Habilita UTF-8
^CF0,40 ; Fuente 0 por defecto, tamaño 40
^FO50,50 ; Posición X=50, Y=50
^FDHola ZPL Mundo^FS ; Imprime texto, cierra campo
^FO50,120^BY3 ; Nuevo campo + ancho del barcode
^BCN,100,Y,N,N ; Code 128, 100 dots de altura
^FD1234567890^FS ; Datos del barcode, cierra campo
^XZ ; Fin del formato → imprime la etiquetaZPL posiciona cada elemento usando coordenadas en dots medidas desde la esquina superior izquierda de la etiqueta. La conversión entre milímetros o pulgadas y dots depende de la densidad de impresión (DPI). Conocer el conteo exacto de dots de tu etiqueta es esencial para alineación perfecta, especialmente con formularios pre-impresos y transportistas como FedEx, UPS o Mercado Libre que exigen dimensiones de etiqueta estrictas.
Tres ejemplos progresivamente más completos. Pega cada uno en el visor ZPL para ver exactamente qué sale por la impresora.
El programa ZPL válido más pequeño posible. Abre un formato, imprime un solo campo de texto en (50,50) usando la Fuente 0 escalable por defecto a 40 dots de alto y cierra el formato.
^XA
^CF0,40
^FO50,50^FDHola ZPL^FS
^XZAñade un código de barras Code 128 (^BC), el estándar para etiquetas de envío. ^BY define el ancho del módulo antes de declarar el barcode. El barcode renderiza los dígitos legibles debajo gracias al flag Y.
^XA
^CF0,40
^FO50,50^FDPedido #1042^FS
^FO50,120^BY3
^BCN,100,Y,N,N
^FD1234567890^FS
^XZCombina texto variable, un bloque de dirección multi-línea, un código QR y un barcode Code 128 de tracking — la estructura de una etiqueta de envío real de e-commerce.
^XA
^CI28
^CF0,32
^FO40,40^FDEnviar a:^FS
^FO40,90^FB540,4,0,L,0^FDJuana Pérez\&Calle Mayor 123\&Madrid, 28013\&España^FS
^FO40,260^FDPedido #A-7782^FS
^FO40,310^BY3^BCN,90,Y,N,N^FD1Z999AA10123456784^FS
^FO450,260^BQN,2,5^FDHA,https://example.com/track/A-7782^FS
^XZLos comandos ZPL II más usados agrupados por propósito. Para cada comando listamos una descripción breve, un ejemplo que puedes pegar en un visor y el significado de los parámetros.
| Comando | Descripción | Ejemplo | Parámetros |
|---|---|---|---|
| ^XA | Inicio del formato de etiqueta. Obligatorio al principio de toda etiqueta imprimible. | ^XA ... ^XZ | Ninguno |
| ^XZ | Fin del formato de etiqueta. Envía la etiqueta a la cola de impresión. | ^XA^FO50,50^FDHola^FS^XZ | Ninguno |
| ^FS | Separador de campo. Cierra el campo actual. Obligatorio tras cada elemento imprimible. | ^FO50,50^FDTexto^FS | Ninguno |
| ^CI | Cambia el set de caracteres internacional. ^CI28 habilita UTF-8 para acentos y scripts no latinos. | ^CI28 | 28 = UTF-8, 13 = Latin-1 |
| ^CF | Fuente, altura y ancho por defecto para toda la etiqueta. Evita repetir ^A en cada campo. | ^CF0,30,30 | fuente,alto,ancho |
| ^LH | Label Home — desplaza el origen (0,0) de todas las coordenadas. | ^LH30,30 | x,y en dots |
| ^PQ | Cantidad de impresión. Imprime la misma etiqueta N veces tras ^XZ. | ^PQ5,0,0,N | qty,pausa,replicar,override |
| ~JR | Reset de impresora. Se envía fuera de un formato; la impresora reinicia. | ~JR | Ninguno |
| Comando | Descripción | Ejemplo | Parámetros |
|---|---|---|---|
| ^FO | Origen del campo — posiciona el siguiente campo por su esquina superior izquierda. | ^FO50,80 | x,y en dots |
| ^FT | Field Typeset — posiciona el siguiente campo por la línea base del texto. Ideal para tamaños mixtos. | ^FT50,80 | x,y en dots |
| ^A | Selección de fuente para el siguiente campo. Sobrescribe ^CF localmente. | ^A0N,40,40 | fuente,orientación,alto,ancho |
| ^FD | Datos del campo. El texto o valor numérico literal a imprimir. | ^FDPedido #42^FS | texto (hasta 3072 chars) |
| ^FB | Bloque de campo — texto multi-línea con wrap y alineación. | ^FB400,3,0,L,0^FD…^FS | ancho,maxLíneas,interlínea,alineación,sangría |
| ^FN | Número de campo — placeholder de template rellenado después con datos ^FN. | ^FN1^FS | 1–999 |
| ^SN | Número serial — auto-incrementa entre copias de un mismo job. | ^SN001,1,Y | inicio,incremento,relleno-ceros |
| Comando | Descripción | Ejemplo | Parámetros |
|---|---|---|---|
| ^BY | Ancho de módulo y ratio por defecto. Debe ir ANTES del comando de barcode. | ^BY3,3,100 | anchoMódulo,ratio,alto |
| ^BC | Code 128 — el estándar en envíos y logística. | ^BCN,100,Y,N,N | orientación,alto,línea-debajo,línea-arriba,checkDigit |
| ^BQ | QR Code — URLs, JSON, IDs de tracking. Hasta 7089 chars numéricos. | ^BQN,2,5 | orientación,modelo,magnificación |
| ^BE | EAN-13 — código de producto retail global (13 dígitos). | ^BEN,100,Y,N | orientación,alto,línea-debajo,línea-arriba |
| ^BU | UPC-A — código de producto retail norteamericano (12 dígitos). | ^BUN,100,Y,N | orientación,alto,línea-debajo,línea-arriba |
| ^BX | Data Matrix — código 2D de alta densidad para artículos pequeños y farma. | ^BXN,200,200 | orientación,alto,calidad |
| ^B0 | Aztec — código 2D usado en tickets de transporte y SmartCard. | ^B0N,7,N,0,N | orientación,magnificación(1-10),ECI(Y/N),errorControl(0-300),menú(Y/N) |
| ^B7 | PDF417 — barcode 2D apilado usado en carnets de conducir y envíos. | ^B7N,8,5,10,30,N | orientación,altoFila,seguridad(0-8),cols(1-30),filas(3-90),truncar(Y/N) |
| Comando | Descripción | Ejemplo | Parámetros |
|---|---|---|---|
| ^GB | Caja gráfica — rectángulos, bordes, separadores. | ^GB300,2,2,B^FS | ancho,alto,grosor,color |
| ^GC | Círculo gráfico. | ^GC100,3,B^FS | diámetro,grosor,color |
| ^GD | Línea diagonal. | ^GD200,200,2,B,R^FS | ancho,alto,grosor,color,orientación |
| ^GF | Campo gráfico — bitmap embebido (ASCII o comprimido). | ^GFA,1024,1024,32,… | formato,bytes,total,bytesPorFila,datos |
| ^FR | Field Reverse — invierte negro/blanco dentro del campo. | ^FO50,50^FR^GB100,30,30^FS | Ninguno |
Las impresoras Zebra incluyen un set fijo de fuentes bitmap (A a H) más una fuente totalmente escalable (0). La Fuente 0 es la única que puede ajustarse a cualquier alto y ancho con ^CF o ^A; las bitmap tienen tamaños fijos que pueden estirarse pero no redibujarse limpiamente. El comando ^A selecciona fuente + tamaño para un solo campo; ^CF fija el valor por defecto para toda la etiqueta.
| Código | Nombre | Tamaño | Notas |
|---|---|---|---|
| 0 | Fuente 0 (CG Triumvirate) | Escalable, cualquier alto/ancho | Fuente escalable por defecto. Ideal para precios, títulos, contenido dinámico. |
| A | Fuente A | 9 × 5 dots (fija) | La bitmap más pequeña. Para letra fina y etiquetas densas. |
| B | Fuente B | 11 × 7 dots (fija) | Algo mayor que A. Habitual en líneas de detalle. |
| C / D | Fuente C, D | 18 × 10 dots (fija) | Bitmaps de tamaño medio para campos variables. |
| E | Fuente E | 28 × 15 dots (OCR-B) | Compatible con OCR. |
| F | Fuente F | 26 × 13 dots | Bitmap mayor de uso general. |
| G | Fuente G | 60 × 40 dots | Tamaño display, para cabeceras. |
| H | Fuente H (OCR-A) | 21 × 13 dots | Estándar OCR-A, pensada para lectura por máquina. |
| P–V | Fuentes soft P–V | Variable | Letras P, Q, R, S, T, U, V — fuentes bitmap heredadas en firmware antiguo. |
^XA
^CF0,50,50 ; Fuente 0 por defecto a 50x50
^FO50,50^FDPrecio: $19.99^FS
^FO50,120^ABN,30,15 ; Fuente B explícita
^FDSKU: ABC-001^FS
^FO50,170^A0N,80,80 ; Fuente 0 grande inline
^FDOFERTA^FS
^XZZPL renderiza nativamente todas las simbologías 1D y 2D comunes. Declara siempre ^BY (ancho de módulo y ratio) antes del comando de barcode para mantener felices a los escáneres.
Envíos, logística, tracking de paquetes. Números + letras. Default de FedEx, UPS, USPS.
^FO50,50^BY3^BCN,100,Y,N,N^FD1234567890^FSURLs, payloads JSON, IDs de tracking. Hasta 7089 chars numéricos. Lectores ubicuos.
^FO50,50^BQN,2,6^FDHA,https://zplpdf.com^FSProductos retail a nivel mundial. Exactamente 12 dígitos — el 13º es checksum automático.
^FO50,50^BY2^BEN,100,Y,N^FD750123456789^FSRetail norteamericano. 11 dígitos + checksum automático.
^FO50,50^BY2^BUN,100,Y,N^FD01234567890^FSUDI farmacéutico, electrónica, artículos muy pequeños. Lee en cualquier ángulo.
^FO50,50^BXN,200,200^FDPharmaCode-42^FSTickets de transporte, tarjetas de embarque. Compacto, no requiere zona de silencio.
^FO50,50^B0N,7,N,0,N^FDBOARDING-A14^FSCarnets de conducir, tarjetas ID, envíos. Apilado 2D, hasta ~1.1 KB.
^FO50,50^B7N,8,5,10,30,N^FDLastName/FirstName/DOB^FSInventario interno, etiquetas de activos. Alfanumérico pero menos denso que Code 128.
^FO50,50^BY3^B3N,N,100,Y,N^FDASSET-001^FSProgramas funcionales listos para soltar en el visor ZPLPDF. Cada ejemplo es un bloque ^XA..^XZ probado a 203 dpi en etiqueta de 4×6 pulgadas.
Remitente, destinatario, barcode Code 128 de tracking y QR para URL de seguimiento.
^XA
^CI28
^PW812
^LL1218
^CF0,28
^FO40,40^FDDE:^FS
^FO40,80^FB400,3,0,L,0^FDZPLPDF Bodega\&Calle Logística 500\&Miami, FL 33101^FS
^FO40,210^FDPARA:^FS
^FO40,250^A0N,38,38^FB500,4,0,L,0^FDJuana Pérez\&Calle Mayor 123, 4ºB\&Madrid, 28013\&España^FS
^FO40,520^GB720,2,2,B^FS
^FO40,540^FDSeguimiento:^FS
^FO40,580^BY3^BCN,110,Y,N,N^FD1Z999AA10123456784^FS
^FO520,540^BQN,2,6^FDHA,https://zplpdf.com/track/1Z999AA10123456784^FS
^FO40,820^FDPedido #A-7782^FS
^FO40,860^FD2026-05-21^FS
^XZNombre del producto, SKU, barcode EAN-13 y precio destacado con caja de reverse-print.
^XA
^CI28
^CF0,40
^FO40,30^A0N,50,50^FDCafé Orgánico 250g^FS
^FO40,100^FDSKU: COF-ORG-250^FS
^FO40,150^BY2^BEN,100,Y,N^FD750123456789^FS
^FO40,290^GB300,80,80,B^FS
^FO50,300^FR^A0N,60,60^FD$ 12.99^FS
^XZNombre del fármaco, lote y caducidad con Data Matrix llevando identificadores de aplicación GS1 — habitual en cadena de suministro farmacéutico.
^XA
^CI28
^CF0,32
^FO40,40^A0N,44,44^FDParacetamol 500 mg^FS
^FO40,100^FDLote: B25C-0481^FS
^FO40,150^FDCad: 2027-09^FS
^FO40,200^BXN,200,200^FD>;(01)07640123456789(17)270930(10)B25C-0481^FS
^XZ^PQ50 imprime 50 copias; ^SN auto-incrementa el número serial en cada una.
^XA
^CF0,40
^FO50,50^FDLote SN^FS
^FO50,120^A0N,80,80^SN0001,1,Y^FS
^PQ50,0,0,N
^XZLa etiqueta sale en blanco o se salta papel.
→ Falta ^XZ al final o hay bytes extra entre ^XA y ^XZ.
✓ Asegura que el formato empiece con ^XA, termine con ^XZ y que ningún carácter rompa el flujo.
El texto muestra ? en vez de acentos (á, é, ñ).
→ La codificación por defecto es CP-850 y no acarrea bytes UTF-8.
✓ Añade ^CI28 justo después de ^XA para pasar la impresora a UTF-8.
El barcode imprime pero el escáner no lo lee.
→ Ancho de módulo demasiado pequeño o ratio fuera de spec.
✓ Pon ^BY3,3,100 antes del barcode y deja zonas de silencio alrededor.
El campo aparece en posición incorrecta.
→ Mezclar ^FO y ^FT — usan distintos puntos de referencia.
✓ Elige uno: ^FO (esquina superior izquierda) o ^FT (línea base). No alternes dentro de la misma etiqueta.
El texto multi-línea se sale del borde.
→ ^FD no hace wrap si no lo envuelves en ^FB.
✓ Envuelve el texto multi-línea en ^FBancho,maxLíneas,interlínea,alineación,sangría antes de ^FD.
La imagen (^GF) imprime corrupta.
→ El conteo de bytes o bytes-por-fila no coincide con la longitud de los datos.
✓ Re-codifica la imagen con una herramienta conocida — bytesPorFila debe ser ceil(ancho/8).
Pega cualquiera de los ejemplos de esta página en nuestro visor ZPL gratuito online para ver exactamente qué imprimirá tu equipo — directo en el navegador.