zplCloud Blog
Llega zplCore.com: el motor de etiquetas de zplCloud como SDK para .NET
El motor que hay detrás de cada vista previa de zplCloud ya está disponible para sus propias aplicaciones: renderizado de ZPL II y EPL2 medido frente a referencias fieles a la impresora, 144 simbologías, verificación previa de conformidad, scan-proof, gemelo de impresora, pruebas de etiquetas en CI y un servidor MCP para agentes de programación.
El motor de zplCloud ahora es un SDK
Cada vista previa y cada PDF de zplCloud se renderiza con un único motor: zplCore.com. Desde hoy está disponible como SDK para .NET 10 para sus propias aplicaciones, con todas las funciones que utiliza zplCloud: renderizar ZPL II y EPL2 a PNG, PDF y SVG, crear etiquetas a partir de datos, comprobarlas frente a las reglas de GS1 y de los transportistas, volver a leer cada código de barras, simular impresoras incluidos sus fallos e imprimir. Funciona en Windows, Linux y macOS, en Docker y Kubernetes, sin controlador de impresora.
En resumen: zplCore.com es una biblioteca .NET con una CLI, un paquete de pruebas y un servidor MCP. Renderiza como una impresora Zebra virtual y se mide frente a referencias fieles a la impresora. Además de renderizar, comprueba y simula: verificación previa de conformidad, scan-proof, gemelo de impresora, impresora del caos y pruebas de etiquetas en CI. Puede solicitar una versión de prueba en zplcore.com.
Por qué zplCloud ha creado su propio motor
Hasta octubre de 2026, zplCloud utilizaba los SDK ThermalLabel y ZPLPrinter de Neodynamic para las vistas previas y para convertir los diseños en ZPL. Hoy, zplCore.com es el único motor de zplCloud: el diseñador genera ZPL, y las vistas previas en PNG, SVG y PDF renderizan exactamente ese ZPL. Lo que ve en la vista previa es lo que llega a la impresora. Ya no existe una segunda vía de generación de imágenes.
Teníamos tres motivos:
- La impresora es la referencia. zplCore se compara píxel a píxel, con una tolerancia de 2 puntos, con renders de referencia de Labelary fieles a la impresora: una puntuación media de 0,986 en 169 casos de prueba, 131 de ellos con 0,99 o más y 85 idénticos píxel a píxel. Las pruebas automatizadas garantizan que ningún caso baje de su puntuación actual.
- Renderizar no basta. Una etiqueta puede verse bien y aun así fallar: un código de barras en la zona de silencio, un campo fuera del cabezal de impresión, un SSCC con la dimensión X incorrecta. Queríamos un motor que respondiera a estas preguntas por sí mismo, sin conexión y dentro del proceso de compilación.
- Una sola base de código para la nube y para sus propios servidores. Las funciones que hay detrás de las herramientas gratuitas de zplCloud son las mismas que obtiene con el SDK.
zplCore.com es una implementación independiente basada en la especificación pública de ZPL II y en los estándares de simbologías. No contiene código de otros fabricantes comerciales; los componentes de código abierto que utiliza figuran en sus avisos de terceros.
Qué es zplCore.com
| Área | Contenido |
|---|---|
| Plataforma | .NET 10; probado en Windows 11, macOS, Debian y Azure Linux 3.0 (también distroless); incluye Dockerfile y Helm chart; compatible con NativeAOT |
| Entrada | ZPL II y EPL2; los formularios EPL se pueden convertir a ZPL |
| Salida | PNG, JPEG, WebP, BMP, GIF, PDF y SVG (ambos vectoriales), TIFF, PCX, PCL, GRF, EPS, HTML, además de EPL, Fingerprint y ESC/POS |
| Códigos de barras | 144 simbologías, de Code 128, GS1 DataBar y QR a MaxiCode, DotCode y Han Xin; analizador y validador GS1 con 534 identificadores de aplicación |
| Etiquetas a partir de datos | modelo de etiqueta en mm o pulgadas, plantillas JSON, enlace de datos a objetos C#, EF Core, LiteDB, MongoDB y JSON, streaming con memoria constante |
| Impresión | TCP 9100, serie, USB, cola de impresión de Windows, CUPS; estado ~HS/~HQES; una impresora virtual en TCP 9100 |
| Escrituras | shaping con HarfBuzz y bidi para árabe, hebreo, tailandés, escrituras índicas y CJK |
Unas pocas líneas de C# hasta la vista previa:
using ZplCore;
var renderer = new ZplRenderer(new ZplRenderSettings { Dpi = 203 }.WithLabelSizeMm(100, 150));
List<byte[]> pngs = renderer.ProcessFile("labels.zpl"); // one PNG per label
renderer.Settings.OutputFormat = ZplOutputFormat.Pdf; // one PDF, one page per label
File.WriteAllBytes("preview.pdf", renderer.ProcessFile("labels.zpl")[0]);
Qué significa «fiel a la impresora» en detalle:
- Los códigos QR (
^BQ, modelo 2) son idénticos módulo a módulo a la salida de Zebra: selección de modo, versión, corrección de errores y máscara, verificados con más de 3.600 símbolos de referencia de Labelary. - PDF417 (
^B7) y MicroPDF417 (^BF) son idénticos palabra de código a palabra de código a Labelary, con la compactación de Zebra. - Los juegos de caracteres (
^CI) y^FHfuncionan como en la impresora: sin^CIla etiqueta usa la página de códigos 850,^CI0a^CI12sustituyen los caracteres nacionales, las páginas de códigos de Windows siguen la guía de ZPL y, con^CI28, los símbolos 2D contienen los bytes que codifica la impresora. - Comportamiento de Zebra reproducido: anchos de avance de la fuente 0, el desplazamiento de la posición del QR según la altura de
^BY, Code 128 en modo N que permanece en el subconjunto B, barras anchas comofloor(ratio × module).
Además, es rápido. En una compilación release en un Apple M3 Max, zplCore generó hasta 199.000 etiquetas por segundo en ZPL (formato almacenado, 100.000 etiquetas en un solo trabajo) y más de 5.000 vistas previas PNG por segundo con 10 hilos. Cada medición se puede repetir con un solo comando.
Un recorrido por las funciones
Todas las imágenes y salidas de esta sección proceden del propio motor: de la documentación de zplCore, de la CLI de zplCore o de las herramientas gratuitas de zplCloud.
Verificación previa de conformidad
ZplCompliance.Check comprueba una etiqueta frente a 84 reglas en 8 paquetes: etiqueta logística GS1, Sunrise 2027 con GS1 Digital Link, Amazon FBA, UPS MaxiCode, requisitos básicos de FedEx y DHL Paket, UDI y RFID/EPC. Mide la etiqueta renderizada en lugar de leer el texto: dimensión X en mm, altura de las barras, zonas de silencio, tamaño del HRI, formatos de AI y dígitos de control. Cada hallazgo incluye ID de regla, línea, posición y fuente, como texto, JSON, SARIF 2.1.0 o un PNG anotado como el de arriba. Este es el ejemplo de nuestra herramienta gratuita Comprobación de conformidad de etiquetas:
$ zplcore comply pallet.zpl --pack gs1-logistic --dpi 203
pallet.zpl:13:1: error ZPL3104: label 1 ^BC: X-dimension 0.25 mm (2 dot(s) at 203 dpi) is below the minimum 0.495 mm for logistic units (0.250 mm only if the unit is physically too small). [GS1 General Specifications 26.0 §5.12.3.5 Table 5-51]
fix: Use ^BY4 or wider at 203 dpi.
pallet.zpl:15:1: error ZPL3106: label 1 ^BC: GS1-128 needs 10X quiet zones: the left quiet zone (30 dots = 3.754 mm) runs 20 dot(s) past the label edge. [GS1 General Specifications 26.0 §5.4.4.2, §5.4.6.3, Table 5-51]
fix: Move the barcode or the neighbouring field, or reduce ^BY.
1 label(s) at 203 dpi, packs gs1-logistic GenSpecs 26.0 / LLG 1.3: 6 error(s), 0 warning(s), 2 info(s). Pre-check only, not a certification.
La salida se ha reducido a dos de los seis errores. El paquete Sunrise 2027 comprueba los códigos de barras 2D en la caja del comercio minorista; nuestro artículo GS1 Sunrise 2027: códigos de barras 2D en la caja lo explica en detalle. Importante: se trata de una verificación previa, no de una certificación. No sustituye la aprobación de un transportista o de una autoridad, ni un verificador sobre la etiqueta impresa. Documentación
Scan-proof
ZplScanProof.Verify vuelve a leer cada código de barras del mapa de bits renderizado con dos decodificadores independientes (zxing-cpp y ZXing.Net) y compara el resultado con los datos del campo. Mide la dimensión X, las zonas de silencio, la altura de las barras, los recortes y los solapamientos, y asigna una nota de A a F: una verificación previa digital basada en ISO/IEC 15415/15416, calculada a la resolución de la impresora. En el ejemplo de nuestra herramienta gratuita Barcode Scan-Proof, los cuatro códigos de barras se decodifican, pero dos darían problemas (salida abreviada):
$ zplcore verify shelf.zpl --dpi 203
[0.0] ^BE EAN-13 line 7 at 8,80 (285×120 dots, 0°)
status: Match digital grade: F (0.0)
SP1101 error: Quiet zone left: 2.7X, 11X required (ISO/IEC 15420 / GS1); limited by the label edge.
SP1102 error: The symbol is cut off by the label edge (129 pixels of its ink lie outside ^PW/^LL).
[0.1] ^BQ QR Code line 8 at 600,10 (125×245 dots, 0°)
status: Match digital grade: D (1.0)
SP1101 warning: Quiet zone bottom: 3X, 4X required (ISO/IEC 18004); limited by other ink.
El Code 39 obtiene una A, pero con una advertencia: el texto «ART-4712» que tiene al lado parece su línea de interpretación, pero no coincide con el valor codificado «ART-4711». La nota no sustituye a un verificador calibrado sobre la etiqueta impresa. Documentación
De ZPL a un modelo de etiqueta editable
Label.FromZpl convierte ZPL existente en una plantilla editable y vinculada a datos: textos, códigos de barras, formas, imágenes y RFID se convierten en elementos tipados, los campos ^FN en campos de datos y los formatos ^DF en plantillas. Cada elemento se comprueba píxel a píxel frente al original; los 318 archivos del corpus de pruebas se reproducen con exactitud de píxel. Por ejemplo, la etiqueta de envío del banner:
$ zplcore import hero-label.zpl -o label.json --report
1 label(s), 203 dpi (LabelSize), fidelity 1,0000
label 1: fidelity 1.0000 pixel-exact, 38 typed, 0 raw item(s)
Info: Resolution detected as 203 dpi from the label width
zplCloud utiliza exactamente esto para importar ZPL en el diseñador (más información abajo). Documentación
Comprensión de etiquetas y anonimización conforme al RGPD
ZplExtract lee del ZPL el destinatario, el remitente, los números de seguimiento con dígito de control, el SSCC, el GTIN, las fechas y los pesos, cada uno con su ubicación y un valor de confianza. En la etiqueta de arriba encuentra la dirección del destinatario con una confianza de 0,95, el SSCC 340123450000000017 del AI (00) de GS1 con un dígito de control válido, el peso y la fecha. ZplRedact sustituye los datos personales manteniendo el diseño, incluidos los comentarios ^FX, los datos ^DF/^XF y el contenido de los códigos de barras 2D, inserta códigos de barras ficticios válidos y vuelve a buscar: en esta etiqueta, 28 acciones, 29 valores buscados, 0 restantes. Se basa en reglas y funciona sin red; revise el resultado antes de compartirlo. El texto dentro de imágenes no se lee. Documentación
GS1 Digital Link y migración a Sunrise 2027
ZplGs1Migration.Migrate localiza el GTIN en un EAN/UPC, GS1-128, ITF-14 o GS1 DataBar y añade en un espacio libre un código QR con un URI de GS1 Digital Link o un GS1 DataMatrix, con su zona de silencio y una verificación previa Sunrise del resultado. En esta etiqueta, el lote y la fecha de consumo preferente se toman del GS1-128 (salida abreviada):
$ zplcore gs1 migrate cheese.zpl -o cheese-2d.zpl
label 1: migrated – added a QR Code with GS1 Digital Link URI with GTIN 09506000134352 right of the EAN-13 (^BE, line 9), top-aligned with the bars
uri: https://id.gs1.org/01/09506000134352/10/L2604?15=270331
sunrise pre-check of the migrated ZPL: 0 error(s), 0 warning(s), 0 info(s)
En zplCloud, la herramienta gratuita Migración Sunrise 2027 hace lo mismo en el navegador. Es un asistente de migración, no una certificación. Documentación
RFID Studio
ZplRfid codifica y decodifica EPC según el GS1 EPC Tag Data Standard 2.3 (SGTIN, SSCC, SGLN, GRAI, GIAI y los esquemas «plus» de TDS 2.0) y genera los comandos ^RF correspondientes. La comprobación de coherencia compara el tag con la etiqueta impresa. En este ejemplo, el tag recibiría un SSCC distinto del que muestra el código de barras:
$ zplcore rfid check carton.zpl
carton.zpl:6:1: error ZPL3904: label 1 ^RF: The SSCC-96 EPC encodes SSCC (00) 340123450000000024, but ^BC prints 340123450000000017. [GS1 EPC Tag Data Standard 2.3 §7 (correspondence of EPC and GS1 keys); GS1 General Specifications 26.0 §4.13]
fix: Encode the printed key, e.g. ZplRfid.EncodeEpc("(00)340123450000000017…") or 'zplcore rfid encode'.
zplcore rfid simulate ejecuta los comandos RFID de una etiqueta contra un tag Gen2 simulado, como lo haría una impresora RFID. Documentación
Gemelo de impresora (Printer Twin)
¿Se imprimirá esta etiqueta en este modelo? ZplPrinterTwin.Check compara una etiqueta con uno de 24 perfiles (entre ellos ZD421, ZD621, ZT411, ZT610, ZQ630 y tres perfiles genéricos) e informa de campos fuera del ancho del cabezal, opciones que faltan como cortador o RFID, límites de firmware, fuentes y memoria, además de una estimación del tiempo de impresión. Cada dato de un perfil está respaldado por una fuente citada o marcado como desconocido. La etiqueta de 4 × 6 pulgadas de arriba en una impresora con cabezal de 72 mm (se muestra uno de los 21 hallazgos):
$ zplcore twin check hero-label.zpl --profile ZQ510-203
ZPL5102 error (53:1): Label 1: ^BC ">;>800340123450000000017" at x=280 is 16 dots (2 mm) wider than the printhead of ZQ510-203 (576 dots = 72 mm): the right part is cut off; a clipped barcode does not scan.
ZQ510-203: 13 error(s), 8 warning(s), 0 info
Impresora del caos y vista previa del cortador
ZplVirtualPrinter escucha en TCP 9100, renderiza los trabajos entrantes y responde a ~HS y ~HQES como una impresora. Si se lo pide, falla: sin papel o sin cinta, cabezal abierto, búfer lleno, atasco del cortador, RFID nulo, desconexiones, tiempos de espera agotados, todo programable y reproducible:
printer.Faults.Schedule(ZplFaultKind.PaperOut, ZplFaultTrigger.AfterLabels(3)); // label 4 waits
printer.Faults.Seed = 42; // deterministic random triggers
La simulación del cortador muestra dónde corta una impresora con cortador (^MM, ^PQ, ^CN, ~JK y más) y dibuja los cortes en las vistas previas PNG, SVG y PDF, como arriba: ^MMC con ^PQ6,3 corta después de las etiquetas 3 y 6. Impresora del caos · Cortador
Testing+ y GitHub Action
Las etiquetas son código, así que pruébelas como código. El paquete ZplCore.Testing funciona con xUnit, NUnit y MSTest:
ZplAssert.Label(zpl)
.NoOverlaps()
.Complies(CompliancePacks.Gs1LogisticLabel)
.Barcode("SSCC").Decodes("(00)376104250021234569").HasGrade(atLeast: 'B')
.And.MatchesSnapshot("pallet");
Cuando una prueba falla, indica el elemento, su posición y la línea de ZPL, y enlaza una imagen con el elemento resaltado. zplcore check ejecuta las mismas comprobaciones sobre muchos archivos y genera JUnit XML, SARIF y Markdown. La GitHub Action incluida en el SDK comenta en los pull requests con imágenes de antes, después y diferencias, y enumera lo que ha cambiado. Las imágenes de arriba proceden de una de estas ejecuciones: un cambio estrechó el código de barras SSCC de ^BY4 a ^BY3 y modificó sus datos (salida abreviada):
$ zplcore check labels/pallet.zpl --pack gs1-logistic --verify --baseline ../base
FAIL labels/pallet.zpl (1 label(s), 0.25 s) · changed vs baseline (3 element change(s))
FAIL comply gs1-logistic
labels/pallet.zpl:12:1: error ZPL3104: Label 1: X-dimension 0.375 mm (3 dot(s) at 203 dpi) is below the minimum 0.495 mm for logistic units (0.250 mm only if the unit is physically too small).
labels/pallet.zpl:12:1: note ZT3001: Label 1: barcode ^BC Code128 at x=86 y=820: data "(00)376104250021234569" → "(00)376104250021234576"
FAILED (fail-on error)
Servidor MCP para agentes de programación
zplcore-mcp pone a disposición de Claude Code, Claude Desktop, VS Code con GitHub Copilot y Cursor 26 herramientas a través del Model Context Protocol: renderizado, lint, formateo, diff, conformidad, scan-proof, anonimización, gemelo de impresora, GS1 y RFID, entre otras. Un agente escribe ZPL, mira el PNG, lee los diagnósticos y corrige la etiqueta en un bucle.
claude mcp add zplcore -- zplcore-mcp
El servidor está diseñado para entradas no confiables. Solo se comunica por stdio y no abre ningún puerto de red. Cada llamada se ejecuta en su propio proceso de trabajo con límites de tiempo y memoria y un entorno vacío, sin acceso a archivos, red, impresoras ni variables de entorno; en macOS se añade un sandbox del sistema operativo. Pruebas adversariales, fuzzing y una auditoría IL del ensamblado verifican estas reglas. Documentación
De PDF y SVG a ZPL nativo (Vector-Lift)
Vector-Lift convierte los PDF o SVG de transportistas y ERP en ZPL real en lugar de una única imagen rasterizada ^GF: textos como campos ^A0; códigos de barras decodificados, regenerados como comandos ^B nativos y verificados; líneas y recuadros como ^GB, ^GC y ^GE. Cada etiqueta incluye una fidelidad medida:
$ zplcore lift lift-label.svg -o lift.zpl --report
799x400 dots @ 203 dpi (default), fidelity 0.9785 (exact 0.9114), native ink 97.8 %, 370 bytes vs 4,140 bytes ^GF raster (8.9%)
4 native, 5 approximated, 0 raster, 1 dropped, barcodes match
El texto se compone en la fuente 0 en lugar de la tipografía original, y el texto que en el PDF solo existe como contornos se mantiene como gráfico (sin OCR). En zplCloud lo utiliza la herramienta gratuita PDF a ZPL nativo. Documentación
NativeAOT
El SDK, el paquete de pruebas, la CLI y el servidor MCP se compilan sin advertencias de trimming ni de AOT. La CLI y el servidor MCP pueden publicarse como programas nativos que arrancan sin un runtime de .NET instalado, y una prueba de humo compara su salida con la versión JIT byte a byte y píxel a píxel. Documentación
Qué significa para los usuarios de zplCloud
No necesita instalar nada; zplCloud ya funciona con zplCore.com:
- Cuatro nuevas herramientas gratuitas: Comprobación de conformidad de etiquetas, Barcode Scan-Proof, Migración Sunrise 2027 y PDF a ZPL nativo. Las cuatro también están disponibles a través de la API de zplCloud en
/v1/tools/…. - La vista previa es igual a la impresión: las vistas previas en PNG, SVG y PDF renderizan el mismo ZPL que llega a la impresora.
- Mejor importación en el diseñador: la importación de ZPL en el diseñador pasa ahora por
Label.FromZpl. En el ciclo completo ZPL → diseño → ZPL de las 96 plantillas en 10 idiomas, la puntuación media subió de 0,7707 a 0,9998, y el número de plantillas exactas al píxel, de 26 a 911 de 960. - Las herramientas que ya conoce, como el Linter ZPL, el Formateador ZPL, ZPL Diff y Comprobar código de barras, funcionan con el mismo motor.
Próximamente: zplCore Server (Docker)
Lo siguiente es empaquetar el motor como un contenedor listo para usar con una API REST: entra ZPL y sale PNG, PDF o un informe de comprobación. Está previsto ofrecer una imagen multiarquitectura para linux/amd64 y linux/arm64, distroless, que se ejecute sin root y con un sistema de archivos de solo lectura, los endpoints /health, /ready y /metrics (Prometheus), una descripción OpenAPI e imágenes firmadas con SBOM. En nuestra prueba con NativeAOT en linux/arm64, el servidor arrancó en unos 4 ms, renderizó su primera etiqueta en unos 11 ms y la imagen ocupaba unos 100 MB. El conjunto de funciones está planificado; en zplcore.com puede solicitar que le avisemos cuando la primera versión esté lista.
Pruébelo
- Demo en vivo: zplcore.com/en/demo renderiza ZPL y ejecuta en el navegador la verificación previa de conformidad, el scan-proof, la migración GS1, la extracción con anonimización y el gemelo de impresora.
- Documentación: zplcore.com/en/docs con API, CLI, ejemplos, precisión y limitaciones conocidas.
- Versión de prueba: solicítela a través del formulario de contacto de zplcore.com. El equipo de desarrollo responde directamente y revisa con gusto sus propios archivos ZPL y EPL. Las licencias están dirigidas a clientes empresariales (B2B).
- Sin código: las herramientas gratuitas de zplCloud funcionan con el mismo motor.
Preguntas frecuentes
¿Es zplCore.com el mismo motor que utiliza zplCloud?
Sí. zplCloud renderiza las vistas previas, los PDF y los resultados de las herramientas con zplCore.com, y las nuevas herramientas llaman a las mismas funciones que obtiene con el SDK.
¿Necesita zplCore.com conexión a internet o un controlador de impresora?
No. La biblioteca se ejecuta en su propio proceso, sin conexión, en Windows, Linux y macOS. La impresión se realiza directamente por TCP 9100, puerto serie, USB, la cola de impresión de Windows o CUPS.
¿Son certificaciones la verificación previa de conformidad y la nota de escaneo?
No. La verificación previa de conformidad comprueba frente a reglas publicadas, y la nota de escaneo es una verificación previa digital basada en ISO/IEC 15415/15416. Ninguna de las dos sustituye la aprobación de un transportista, de una autoridad o de su organización miembro de GS1, ni un verificador calibrado sobre la etiqueta impresa.
¿Qué no puede hacer todavía zplCore.com?
Pharmacode 2D, Response Plus PostMatrix y HIBC según ISO/IEC 15434 no están implementados porque no existe una especificación pública. Deutsche Post BZL y JAB Code son experimentales. Las fuentes residentes de Zebra son propietarias y se sustituyen por fuentes alternativas calibradas; si necesita glifos idénticos, registre el TTF original. La lista completa está en las limitaciones conocidas.
¿Tengo que cambiar algo en zplCloud?
No. Los diseños, las plantillas, las impresoras y las llamadas a la API se mantienen tal como están.
Zebra y ZPL son marcas comerciales de Zebra Technologies Corporation; GS1 y GS1 Digital Link son marcas comerciales de GS1 AISBL, y Neodynamic, ThermalLabel y ZPLPrinter son marcas comerciales de sus respectivos propietarios. Aquí se utilizan únicamente con fines descriptivos.