zplCloud Blog
Chegou o zplCore.com: o motor de etiquetas do zplCloud como SDK .NET
O motor por trás de cada pré-visualização do zplCloud agora está disponível para as suas próprias aplicações: renderização de ZPL II e EPL2 medida contra referências fiéis à impressora, 144 simbologias, pré-verificação de conformidade, scan-proof, gêmeo da impressora, testes de etiquetas na CI e um servidor MCP para agentes de programação.
O motor do zplCloud agora é um SDK
Cada pré-visualização e cada PDF no zplCloud é renderizado por um único motor: o zplCore.com. A partir de hoje, ele está disponível como SDK .NET 10 para as suas próprias aplicações, com todos os recursos que o zplCloud usa: renderizar ZPL II e EPL2 para PNG, PDF e SVG, montar etiquetas a partir de dados, verificá-las com as regras da GS1 e das transportadoras, ler de volta cada código de barras, simular impressoras, inclusive falhas, e imprimir. Ele roda em Windows, Linux e macOS, em Docker e Kubernetes, sem driver de impressora.
Em resumo: o zplCore.com é uma biblioteca .NET com uma CLI, um pacote de testes e um servidor MCP. Ele renderiza como uma impressora Zebra virtual e é medido contra referências fiéis à impressora. Além de renderizar, ele verifica e simula: pré-verificação de conformidade, scan-proof, gêmeo da impressora, impressora do caos e testes de etiquetas na CI. Uma versão de avaliação está disponível mediante solicitação em zplcore.com.
Por que o zplCloud criou o próprio motor
Até outubro de 2026, o zplCloud usava os SDKs ThermalLabel e ZPLPrinter da Neodynamic para as pré-visualizações e para transformar designs em ZPL. Hoje o zplCore.com é o único motor do zplCloud: o designer gera ZPL, e as pré-visualizações em PNG, SVG e PDF renderizam exatamente esse ZPL. O que você vê na pré-visualização é o que vai para a impressora. Não existe mais um segundo caminho de geração de imagens.
Tivemos três motivos:
- A impressora é a referência. O zplCore é comparado pixel a pixel, com tolerância de 2 pontos, com renderizações de referência do Labelary fiéis à impressora: pontuação média de 0,986 em 169 casos de teste, 131 deles com 0,99 ou mais e 85 idênticos pixel a pixel. Testes automatizados garantem que nenhum caso fique abaixo da pontuação atual.
- Só renderizar não basta. Uma etiqueta pode parecer certa e mesmo assim falhar: um código de barras na zona de silêncio, um campo fora da cabeça de impressão, um SSCC com a dimensão X errada. Queríamos um motor que respondesse a essas perguntas sozinho, offline e dentro do build.
- Uma única base de código para a nuvem e para os seus próprios servidores. As funções por trás das ferramentas gratuitas do zplCloud são as mesmas que você recebe no SDK.
O zplCore.com é uma implementação independente, baseada na especificação pública do ZPL II e nos padrões das simbologias. Ele não contém código de outros fornecedores comerciais; os componentes de código aberto que utiliza estão listados nos seus avisos de terceiros.
O que é o zplCore.com
| Área | Conteúdo |
|---|---|
| Plataforma | .NET 10; testado em Windows 11, macOS, Debian e Azure Linux 3.0 (inclusive distroless); Dockerfile e Helm chart incluídos; compatível com NativeAOT |
| Entrada | ZPL II e EPL2; formulários EPL podem ser convertidos para ZPL |
| Saída | PNG, JPEG, WebP, BMP, GIF, PDF e SVG (ambos vetoriais), TIFF, PCX, PCL, GRF, EPS, HTML, além de EPL, Fingerprint e ESC/POS |
| Códigos de barras | 144 simbologias, de Code 128, GS1 DataBar e QR a MaxiCode, DotCode e Han Xin; parser e validador GS1 com 534 identificadores de aplicação |
| Etiquetas a partir de dados | modelo de etiqueta em mm ou polegadas, modelos JSON, data binding com objetos C#, EF Core, LiteDB, MongoDB e JSON, streaming com memória constante |
| Impressão | TCP 9100, serial, USB, spooler do Windows, CUPS; status ~HS/~HQES; uma impressora virtual na TCP 9100 |
| Sistemas de escrita | shaping com HarfBuzz e bidi para árabe, hebraico, tailandês, escritas índicas e CJK |
Poucas linhas de C# até a pré-visualização:
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]);
O que “fiel à impressora” significa em detalhe:
- QR Codes (
^BQ, modelo 2) são idênticos módulo a módulo à saída da Zebra: seleção de modo, versão, correção de erros e máscara, verificados em mais de 3.600 símbolos de referência do Labelary. - PDF417 (
^B7) e MicroPDF417 (^BF) são idênticos palavra de código a palavra de código ao Labelary, com a compactação da Zebra. - Conjuntos de caracteres (
^CI) e^FHfuncionam como na impressora: sem^CIa etiqueta usa a Code Page 850,^CI0a^CI12substituem os caracteres nacionais, as code pages do Windows seguem o guia do ZPL e, com^CI28, os símbolos 2D carregam os bytes que a impressora codifica. - Comportamento da Zebra reproduzido: larguras de avanço da fonte 0, o deslocamento da posição do QR pela altura do
^BY, Code 128 no modo N permanecendo no subconjunto B, barras largas comofloor(ratio × module).
E ele também é rápido. Em um build de release em um Apple M3 Max, o zplCore gerou até 199.000 etiquetas por segundo em ZPL (formato armazenado, 100.000 etiquetas em um único job) e mais de 5.000 pré-visualizações PNG por segundo com 10 threads. Cada medição pode ser repetida com um único comando.
Um tour pelos recursos
Todas as imagens e saídas desta seção vêm do próprio motor: da documentação do zplCore, da CLI do zplCore ou das ferramentas gratuitas do zplCloud.
Pré-verificação de conformidade
ZplCompliance.Check verifica uma etiqueta com 84 regras em 8 pacotes: etiqueta logística GS1, Sunrise 2027 com GS1 Digital Link, Amazon FBA, UPS MaxiCode, requisitos básicos de FedEx e DHL Paket, UDI e RFID/EPC. Ele mede a etiqueta renderizada em vez de ler o texto: dimensão X em mm, altura das barras, zonas de silêncio, tamanho do HRI, formatos de AI e dígitos verificadores. Cada achado traz ID da regra, linha, posição e fonte, como texto, JSON, SARIF 2.1.0 ou um PNG anotado como o de cima. Este é o exemplo da nossa ferramenta gratuita Verificação de conformidade 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.
A saída foi reduzida a dois dos seis erros. O pacote Sunrise 2027 verifica códigos de barras 2D no caixa do varejo; o nosso post GS1 Sunrise 2027: códigos de barras 2D no caixa mostra isso em detalhe. Importante: trata-se de uma pré-verificação, não de uma certificação. Ela não substitui a aprovação de uma transportadora ou de um órgão regulador, nem um verificador na etiqueta impressa. Documentação
Scan-proof
ZplScanProof.Verify lê de volta cada código de barras do bitmap renderizado com dois decodificadores independentes (zxing-cpp e ZXing.Net) e compara o resultado com os dados do campo. Ele mede dimensão X, zonas de silêncio, altura das barras, cortes e sobreposições e atribui uma nota de A a F: uma pré-verificação digital baseada na ISO/IEC 15415/15416, calculada na resolução da impressora. No exemplo da nossa ferramenta gratuita Teste de leitura de códigos de barras, os quatro códigos de barras são decodificados, mas dois causariam problemas (saída 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.
O Code 39 recebe nota A, mas com um aviso: o texto “ART-4712” ao lado parece ser a sua linha de interpretação, mas difere do valor codificado “ART-4711”. A nota não substitui um verificador calibrado na etiqueta impressa. Documentação
De ZPL para um modelo de etiqueta editável
Label.FromZpl transforma ZPL existente em um modelo editável e vinculado a dados: textos, códigos de barras, formas, imagens e RFID viram itens tipados, campos ^FN viram campos de dados e formatos ^DF viram modelos. Cada item é verificado pixel a pixel em relação ao original; todos os 318 arquivos do corpus de testes voltam idênticos pixel a pixel. Por exemplo, a etiqueta de envio do 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
O zplCloud usa exatamente isso para importar ZPL no designer (mais detalhes abaixo). Documentação
Compreensão de etiquetas e anonimização conforme o GDPR
ZplExtract lê do ZPL destinatário, remetente, números de rastreamento com dígito verificador, SSCC, GTIN, datas e pesos, cada um com a sua posição e um valor de confiança. Na etiqueta acima, ele encontra o endereço do destinatário com confiança de 0,95, o SSCC 340123450000000017 do AI (00) da GS1 com dígito verificador válido, o peso e a data. ZplRedact substitui os dados pessoais mantendo o layout, inclusive comentários ^FX, dados ^DF/^XF e conteúdo de códigos de barras 2D, insere códigos de barras fictícios válidos e depois faz uma nova busca: nesta etiqueta, 28 ações, 29 valores pesquisados, 0 restantes. O recurso é baseado em regras e funciona sem rede; revise o resultado antes de compartilhá-lo. Texto dentro de imagens não é lido. Documentação
GS1 Digital Link e migração para o Sunrise 2027
ZplGs1Migration.Migrate encontra o GTIN em um EAN/UPC, GS1-128, ITF-14 ou GS1 DataBar e adiciona, em um espaço livre, um QR Code com URI GS1 Digital Link ou um GS1 DataMatrix, com a zona de silêncio e uma pré-verificação Sunrise do resultado. Nesta etiqueta, o lote e a data de consumo preferencial (AI 15) são aproveitados do GS1-128 (saída 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)
No zplCloud, a ferramenta gratuita Migração Sunrise 2027 faz o mesmo no navegador. É um assistente de migração, não uma certificação. Documentação
RFID Studio
ZplRfid codifica e decodifica EPCs de acordo com o GS1 EPC Tag Data Standard 2.3 (SGTIN, SSCC, SGLN, GRAI, GIAI e os esquemas “plus” do TDS 2.0) e gera os comandos ^RF correspondentes. A verificação de consistência compara a tag com a etiqueta impressa. Neste exemplo, a tag receberia um SSCC diferente do que o código de barras mostra:
$ 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 executa os comandos RFID de uma etiqueta em uma tag Gen2 simulada, como faria uma impressora RFID. Documentação
Gêmeo da impressora (Printer Twin)
Esta etiqueta vai imprimir neste modelo? ZplPrinterTwin.Check compara uma etiqueta com um de 24 perfis (entre eles ZD421, ZD621, ZT411, ZT610, ZQ630 e três perfis genéricos) e aponta campos fora da largura da cabeça de impressão, opcionais ausentes como cortador ou RFID, limites de firmware, fontes e memória, além de uma estimativa do tempo de impressão. Cada informação de perfil é respaldada por uma fonte citada ou marcada como desconhecida. A etiqueta de 4 × 6 polegadas acima em uma impressora com cabeça de impressão de 72 mm (um dos 21 achados exibido):
$ 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
Impressora do caos e pré-visualização do cortador
ZplVirtualPrinter escuta na TCP 9100, renderiza os jobs recebidos e responde a ~HS e ~HQES como uma impressora. Quando solicitado, ela falha: falta de papel ou de ribbon, cabeça aberta, buffer cheio, cortador travado, RFID void, desconexões, timeouts, tudo roteirizado e reproduzível:
printer.Faults.Schedule(ZplFaultKind.PaperOut, ZplFaultTrigger.AfterLabels(3)); // label 4 waits
printer.Faults.Seed = 42; // deterministic random triggers
A simulação do cortador mostra onde uma impressora com cortador corta (^MM, ^PQ, ^CN, ~JK e outros) e desenha os cortes nas pré-visualizações PNG, SVG e PDF, como acima: ^MMC com ^PQ6,3 corta depois das etiquetas 3 e 6. Impressora do caos · Cortador
Testing+ e GitHub Action
Etiquetas são código, então teste-as como código. O pacote ZplCore.Testing funciona com xUnit, NUnit e MSTest:
ZplAssert.Label(zpl)
.NoOverlaps()
.Complies(CompliancePacks.Gs1LogisticLabel)
.Barcode("SSCC").Decodes("(00)376104250021234569").HasGrade(atLeast: 'B')
.And.MatchesSnapshot("pallet");
Quando um teste falha, ele indica o elemento, a posição e a linha do ZPL, com o link de uma imagem em que o elemento aparece destacado. zplcore check executa as mesmas verificações em muitos arquivos e gera JUnit XML, SARIF e Markdown. A GitHub Action incluída no SDK comenta nos pull requests com imagens de antes, depois e das diferenças e lista o que mudou. As imagens acima vêm de uma dessas execuções: uma alteração estreitou o código de barras SSCC de ^BY4 para ^BY3 e mudou os dados (saída 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 programação
O zplcore-mcp oferece ao Claude Code, ao Claude Desktop, ao VS Code com GitHub Copilot e ao Cursor 26 ferramentas via Model Context Protocol: renderização, lint, formatação, diff, conformidade, scan-proof, anonimização, gêmeo da impressora, GS1 e RFID, entre outras. Um agente escreve ZPL, olha o PNG, lê os diagnósticos e corrige a etiqueta em loop.
claude mcp add zplcore -- zplcore-mcp
O servidor foi feito para entradas não confiáveis. Ele se comunica apenas via stdio e não abre nenhuma porta de rede. Cada chamada roda em um processo de trabalho próprio, com limites de tempo e memória e um ambiente vazio, sem acesso a arquivos, rede, impressoras ou variáveis de ambiente; no macOS, soma-se um sandbox do sistema operacional. Testes adversariais, fuzzing e uma auditoria de IL do assembly verificam essas regras. Documentação
De PDF e SVG para ZPL nativo (Vector-Lift)
O Vector-Lift transforma PDFs ou SVGs de transportadoras e ERPs em ZPL de verdade, em vez de uma única imagem raster ^GF: textos como campos ^A0; códigos de barras decodificados, regenerados como comandos ^B nativos e verificados; linhas e caixas como ^GB, ^GC e ^GE. Cada etiqueta vem com uma fidelidade 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
O texto é composto na fonte 0 em vez da tipografia original, e texto que no PDF existe apenas como contornos continua sendo gráfico (sem OCR). No zplCloud, a ferramenta gratuita PDF para ZPL nativo usa esse recurso. Documentação
NativeAOT
O SDK, o pacote de testes, a CLI e o servidor MCP compilam sem avisos de trimming ou de AOT. A CLI e o servidor MCP podem ser publicados como programas nativos que iniciam sem um runtime .NET instalado, e um smoke test compara a saída deles com a versão JIT byte a byte e pixel a pixel. Documentação
O que muda para quem usa o zplCloud
Você não precisa instalar nada; o zplCloud já roda com o zplCore.com:
- Quatro novas ferramentas gratuitas: Verificação de conformidade de etiquetas, Teste de leitura de códigos de barras, Migração Sunrise 2027 e PDF para ZPL nativo. As quatro também estão disponíveis pela API do zplCloud em
/v1/tools/…. - Pré-visualização igual à impressão: as pré-visualizações em PNG, SVG e PDF renderizam o mesmo ZPL que vai para a impressora.
- Importação melhor no designer: a importação de ZPL no designer agora passa pelo
Label.FromZpl. No ciclo completo ZPL → design → ZPL de todos os 96 modelos em 10 idiomas, a pontuação média subiu de 0,7707 para 0,9998, e o número de modelos idênticos pixel a pixel, de 26 para 911 de 960. - As ferramentas que você já conhece, como o Linter ZPL, o Formatador ZPL, o ZPL Diff e o Verificar código de barras, funcionam com o mesmo motor.
Em breve: zplCore Server (Docker)
O próximo passo é empacotar o motor como um contêiner pronto para uso com uma API REST: entra ZPL, sai PNG, PDF ou um relatório de verificação. Estão planejados uma imagem multi-arquitetura para linux/amd64 e linux/arm64, distroless, rodando sem root e com sistema de arquivos somente leitura, os endpoints /health, /ready e /metrics (Prometheus), uma descrição OpenAPI e imagens assinadas com SBOM. No nosso teste com NativeAOT em linux/arm64, o servidor iniciou em cerca de 4 ms, renderizou a primeira etiqueta em cerca de 11 ms e a imagem tinha cerca de 100 MB. O conjunto de recursos está planejado; em zplcore.com você pode pedir para ser avisado quando a primeira versão estiver pronta.
Experimente
- Demo ao vivo: zplcore.com/en/demo renderiza ZPL e executa no navegador a pré-verificação de conformidade, o scan-proof, a migração GS1, a extração com anonimização e o gêmeo da impressora.
- Documentação: zplcore.com/en/docs com API, CLI, exemplos, precisão e limitações conhecidas.
- Versão de avaliação: solicite pelo formulário de contato em zplcore.com. A equipe de desenvolvimento responde diretamente e tem prazer em verificar os seus próprios arquivos ZPL e EPL. As licenças são destinadas a clientes empresariais (B2B).
- Sem código: as ferramentas gratuitas do zplCloud rodam com o mesmo motor.
Perguntas frequentes
O zplCore.com é o mesmo motor que o zplCloud usa?
Sim. O zplCloud renderiza pré-visualizações, PDFs e resultados das ferramentas com o zplCore.com, e as novas ferramentas chamam as mesmas funções que você recebe no SDK.
O zplCore.com precisa de conexão com a internet ou de driver de impressora?
Não. A biblioteca roda no seu próprio processo, offline, em Windows, Linux e macOS. A impressão vai diretamente por TCP 9100, serial, USB, spooler do Windows ou CUPS.
A pré-verificação de conformidade e a nota de leitura são certificações?
Não. A pré-verificação de conformidade testa com base em regras publicadas, e a nota de leitura é uma pré-verificação digital baseada na ISO/IEC 15415/15416. Nenhuma das duas substitui a aprovação de uma transportadora, de um órgão regulador ou da sua Organização-Membro GS1, nem um verificador calibrado na etiqueta impressa.
O que o zplCore.com ainda não faz?
Pharmacode 2D, Response Plus PostMatrix e HIBC conforme a ISO/IEC 15434 não estão implementados, porque não existe especificação pública. Deutsche Post BZL e JAB Code são experimentais. As fontes residentes da Zebra são proprietárias e substituídas por fontes alternativas calibradas; se você precisar de glifos idênticos, registre o TTF original. A lista completa está nas limitações conhecidas.
Preciso mudar alguma coisa no zplCloud?
Não. Designs, modelos, impressoras e chamadas de API continuam como estão.
Zebra e ZPL são marcas comerciais da Zebra Technologies Corporation, GS1 e GS1 Digital Link são marcas comerciais da GS1 AISBL, e Neodynamic, ThermalLabel e ZPLPrinter são marcas comerciais de seus respectivos proprietários. Elas são usadas aqui apenas de forma descritiva.