zplCloud Blog
zplCore.com est disponible : le moteur d'étiquettes de zplCloud en SDK .NET
Le moteur qui produit chaque aperçu zplCloud est désormais disponible pour vos propres applications : rendu ZPL II et EPL2 mesuré par rapport à des références fidèles à l'imprimante, 144 symbologies, pré-vérification de conformité, scan-proof, jumeau d'imprimante, tests d'étiquettes en CI et un serveur MCP pour les agents de codage.
Le moteur de zplCloud devient un SDK
Chaque aperçu et chaque PDF de zplCloud est rendu par un seul et même moteur : zplCore.com. Dès aujourd'hui, il est disponible sous forme de SDK .NET 10 pour vos propres applications, avec toutes les fonctions qu'utilise zplCloud : rendre du ZPL II et de l'EPL2 en PNG, PDF et SVG, construire des étiquettes à partir de données, les contrôler au regard des règles GS1 et des transporteurs, relire chaque code-barres, simuler des imprimantes, pannes comprises, et imprimer. Il fonctionne sous Windows, Linux et macOS, dans Docker et Kubernetes, sans pilote d'imprimante.
En bref : zplCore.com est une bibliothèque .NET accompagnée d'une CLI, d'un package de test et d'un serveur MCP. Il effectue le rendu comme une imprimante Zebra virtuelle et il est mesuré par rapport à des références fidèles à l'imprimante. Au-delà du rendu, il contrôle et simule : pré-vérification de conformité, scan-proof, jumeau d'imprimante, imprimante chaos, tests d'étiquettes en CI. Une version d'essai est disponible sur demande sur zplcore.com.
Pourquoi zplCloud a développé son propre moteur
Jusqu'en octobre 2026, zplCloud utilisait les SDK ThermalLabel et ZPLPrinter de Neodynamic pour les aperçus et pour convertir les designs en ZPL. Aujourd'hui, zplCore.com est le seul moteur de zplCloud : le designer produit du ZPL, et les aperçus PNG, SVG et PDF rendent exactement ce ZPL. Ce que vous voyez dans l'aperçu est ce qui part vers l'imprimante. Il n'existe plus de second circuit de rendu d'image.
Nous avions trois raisons :
- L'imprimante est l'étalon. zplCore est comparé pixel par pixel, avec une tolérance de 2 points, à des rendus de référence Labelary fidèles à l'imprimante : un score moyen de 0,986 sur 169 cas de test, dont 131 à 0,99 ou plus et 85 identiques au pixel près. Des tests automatisés garantissent que chaque cas conserve au moins son score actuel.
- Le rendu seul ne suffit pas. Une étiquette peut sembler correcte et pourtant poser problème : un code-barres dans la zone de silence, un champ hors de la tête d'impression, un SSCC avec une mauvaise dimension X. Nous voulions un moteur qui réponde lui-même à ces questions, hors ligne et directement dans le build.
- Une seule base de code pour le cloud et pour vos propres serveurs. Les fonctions qui font tourner les outils gratuits de zplCloud sont celles que vous obtenez dans le SDK.
zplCore.com est une implémentation indépendante, fondée sur la spécification publique ZPL II et sur les normes des symbologies. Il ne contient aucun code d'autres éditeurs commerciaux ; les composants open source qu'il utilise sont répertoriés dans ses mentions relatives aux composants tiers.
Ce qu'est zplCore.com
| Domaine | Contenu |
|---|---|
| Plateforme | .NET 10 ; testé sous Windows 11, macOS, Debian et Azure Linux 3.0 (y compris distroless) ; Dockerfile et chart Helm fournis ; compatible NativeAOT |
| Entrée | ZPL II et EPL2 ; les formulaires EPL peuvent être convertis en ZPL |
| Sortie | PNG, JPEG, WebP, BMP, GIF, PDF et SVG (tous deux vectoriels), TIFF, PCX, PCL, GRF, EPS, HTML, ainsi qu'EPL, Fingerprint et ESC/POS |
| Codes-barres | 144 symbologies, du Code 128, GS1 DataBar et QR au MaxiCode, DotCode et Han Xin ; parseur et validateur GS1 avec 534 identifiants d'application |
| Étiquettes à partir de données | modèle d'étiquette en mm ou en pouces, modèles JSON, liaison de données avec des objets C#, EF Core, LiteDB, MongoDB et JSON, streaming à mémoire constante |
| Impression | TCP 9100, série, USB, spouleur Windows, CUPS ; état ~HS/~HQES ; une imprimante virtuelle sur TCP 9100 |
| Écritures | mise en forme HarfBuzz et bidi pour l'arabe, l'hébreu, le thaï, les écritures indiennes et le CJK |
Quelques lignes de C# suffisent pour obtenir un aperçu :
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]);
Ce que signifie « fidèle à l'imprimante » en détail :
- Les QR Codes (
^BQ, modèle 2) sont identiques module par module à la sortie Zebra : choix du mode, version, correction d'erreur et masque, vérifiés sur plus de 3 600 symboles de référence Labelary. - PDF417 (
^B7) et MicroPDF417 (^BF) sont identiques mot de code par mot de code à Labelary, avec la compaction de Zebra. - Les jeux de caractères (
^CI) et^FHfonctionnent comme sur l'imprimante : sans^CI, l'étiquette est en page de code 850,^CI0à^CI12remplacent les caractères nationaux, les pages de code Windows suivent le guide ZPL, et sous^CI28les symboles 2D contiennent les octets que l'imprimante encode. - Comportement Zebra reproduit : chasses de la police 0, décalage de position du QR en fonction de la hauteur
^BY, Code 128 en mode N qui reste dans le sous-ensemble B, barres larges selonfloor(ratio × module).
Et il est rapide. En build release sur un Apple M3 Max, zplCore a généré jusqu'à 199 000 étiquettes par seconde en ZPL (format stocké, 100 000 étiquettes en un seul job) et plus de 5 000 aperçus PNG par seconde avec 10 threads. Chaque mesure peut être reproduite avec une seule commande.
Tour d'horizon des fonctions
Toutes les images et sorties de cette section proviennent du moteur lui-même : de la documentation zplCore, de la CLI zplCore ou des outils gratuits de zplCloud.
Pré-vérification de conformité
ZplCompliance.Check contrôle une étiquette au regard de 84 règles réparties en 8 packs : étiquette logistique GS1, Sunrise 2027 avec GS1 Digital Link, Amazon FBA, UPS MaxiCode, règles de base FedEx et DHL Paket, UDI et RFID/EPC. Il mesure l'étiquette rendue au lieu de lire le texte : dimension X en mm, hauteur des barres, zones de silence, taille du HRI, formats des AI et chiffres de contrôle. Chaque constat comporte un ID de règle, une ligne, une position et une source, au format texte, JSON, SARIF 2.1.0 ou PNG annoté comme ci-dessus. Voici l'exemple de notre outil gratuit Contrôle de conformité d'étiquette :
$ 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 sortie est réduite à deux des six erreurs. Le pack Sunrise 2027 contrôle les codes-barres 2D en caisse ; notre article GS1 Sunrise 2027 : codes-barres 2D en caisse le présente en détail. Important : il s'agit d'une pré-vérification, pas d'une certification. Elle ne remplace ni la validation par un transporteur ou une autorité, ni un vérificateur sur l'étiquette imprimée. Documentation
Scan-proof
ZplScanProof.Verify relit chaque code-barres à partir du bitmap rendu avec deux décodeurs indépendants (zxing-cpp et ZXing.Net) et compare le résultat aux données du champ. Il mesure la dimension X, les zones de silence, la hauteur des barres, le rognage et les chevauchements, puis attribue une note de A à F : une pré-vérification numérique sur le modèle des normes ISO/IEC 15415/15416, calculée à la résolution de l'imprimante. Dans l'exemple de notre outil gratuit Barcode Scan-Proof, les quatre codes-barres sont décodés, mais deux poseraient tout de même problème (sortie abrégée) :
$ 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.
Le Code 39 obtient un A, mais avec un avertissement : le texte « ART-4712 » placé à côté ressemble à sa ligne d'interprétation, mais diffère de la valeur encodée « ART-4711 ». La note ne remplace pas un vérificateur étalonné sur l'étiquette imprimée. Documentation
Du ZPL à un modèle d'étiquette modifiable
Label.FromZpl transforme du ZPL existant en un modèle modifiable et lié aux données : textes, codes-barres, formes, images et RFID deviennent des éléments typés, les champs ^FN deviennent des champs de données et les formats ^DF des modèles. Chaque élément est comparé pixel par pixel à l'original ; les 318 fichiers du corpus de test sont restitués au pixel près. Par exemple, l'étiquette d'expédition de la bannière :
$ 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
C'est exactement ce que zplCloud utilise pour importer du ZPL dans le designer (voir plus bas). Documentation
Compréhension des étiquettes et caviardage RGPD
ZplExtract lit dans le ZPL le destinataire, l'expéditeur, les numéros de suivi avec leurs chiffres de contrôle, le SSCC, le GTIN, les dates et les poids, chacun avec son emplacement et un indice de confiance. Pour l'étiquette ci-dessus, il trouve l'adresse du destinataire avec une confiance de 0,95, le SSCC 340123450000000017 issu de l'AI GS1 (00) avec un chiffre de contrôle valide, le poids et la date. ZplRedact remplace les données personnelles en conservant la mise en page, y compris les commentaires ^FX, les données ^DF/^XF et le contenu des codes-barres 2D, insère des codes-barres factices valides, puis lance une nouvelle recherche : pour cette étiquette, 28 actions, 29 valeurs recherchées, 0 restante. Le traitement repose sur des règles et fonctionne sans réseau ; vérifiez le résultat avant de le partager. Le texte contenu dans les images n'est pas lu. Documentation
GS1 Digital Link et migration Sunrise 2027
ZplGs1Migration.Migrate trouve le GTIN dans un EAN/UPC, un GS1-128, un ITF-14 ou un GS1 DataBar et ajoute dans un espace libre un QR Code avec une URI GS1 Digital Link ou un GS1 DataMatrix, avec sa zone de silence et une pré-vérification Sunrise du résultat. Le numéro de lot et la date de durabilité minimale sont repris du GS1-128 de cette étiquette (sortie abrégée) :
$ 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)
Dans zplCloud, l'outil gratuit Migration Sunrise 2027 fait la même chose dans le navigateur. Il s'agit d'un assistant de migration, pas d'une certification. Documentation
RFID Studio
ZplRfid encode et décode les EPC selon le GS1 EPC Tag Data Standard 2.3 (SGTIN, SSCC, SGLN, GRAI, GIAI et les schémas « plus » de TDS 2.0) et génère les commandes ^RF correspondantes. Le contrôle de cohérence compare le tag à l'étiquette imprimée. Dans cet exemple, le tag recevrait un autre SSCC que celui affiché par le code-barres :
$ 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 exécute les commandes RFID d'une étiquette sur un tag Gen2 simulé, comme le ferait une imprimante RFID. Documentation
Jumeau d'imprimante (Printer Twin)
Cette étiquette s'imprimera-t-elle sur ce modèle ? ZplPrinterTwin.Check compare une étiquette à l'un des 24 profils (dont ZD421, ZD621, ZT411, ZT610, ZQ630 et trois profils génériques) et signale les champs qui dépassent la largeur de la tête d'impression, les options manquantes comme la coupeuse ou le RFID, les limites du firmware, les polices et la mémoire, avec en plus une estimation du temps d'impression. Chaque donnée de profil s'appuie sur une source citée ou est marquée comme inconnue. Voici l'étiquette 4 × 6 pouces ci-dessus sur une imprimante dotée d'une tête de 72 mm (un des 21 constats affiché) :
$ 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
Imprimante chaos et aperçu de la coupeuse
ZplVirtualPrinter écoute sur TCP 9100, rend les jobs reçus et répond à ~HS et ~HQES comme une imprimante. Sur demande, il tombe en panne : fin de papier ou de ruban, tête ouverte, tampon plein, bourrage de la coupeuse, RFID void, déconnexions, timeouts, le tout scripté et reproductible :
printer.Faults.Schedule(ZplFaultKind.PaperOut, ZplFaultTrigger.AfterLabels(3)); // label 4 waits
printer.Faults.Seed = 42; // deterministic random triggers
La simulation de la coupeuse montre où coupe une imprimante équipée d'une coupeuse (^MM, ^PQ, ^CN, ~JK et d'autres) et dessine les coupes dans les aperçus PNG, SVG et PDF, comme ci-dessus : ^MMC avec ^PQ6,3 coupe après les étiquettes 3 et 6. Imprimante chaos · Coupeuse
Testing+ et GitHub Action
Les étiquettes sont du code : testez-les comme du code. Le package ZplCore.Testing fonctionne avec xUnit, NUnit et MSTest :
ZplAssert.Label(zpl)
.NoOverlaps()
.Complies(CompliancePacks.Gs1LogisticLabel)
.Barcode("SSCC").Decodes("(00)376104250021234569").HasGrade(atLeast: 'B')
.And.MatchesSnapshot("pallet");
En cas d'échec, le message nomme l'élément, sa position et la ligne ZPL, avec un lien vers une image où l'élément est encadré. zplcore check exécute les mêmes contrôles sur de nombreux fichiers et produit du JUnit XML, du SARIF et du Markdown. La GitHub Action incluse dans le SDK commente les pull requests avec des images avant/après/différences et liste ce qui a changé. Les images ci-dessus proviennent d'une telle exécution : une modification a réduit le code-barres SSCC de ^BY4 à ^BY3 et changé ses données (sortie abrégée) :
$ 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)
Serveur MCP pour les agents de codage
zplcore-mcp fournit 26 outils via le Model Context Protocol à Claude Code, Claude Desktop, VS Code avec GitHub Copilot et Cursor : rendu, lint, formatage, diff, conformité, scan-proof, caviardage, jumeau d'imprimante, GS1 et RFID, entre autres. Un agent écrit du ZPL, regarde le PNG, lit les diagnostics et corrige l'étiquette en boucle.
claude mcp add zplcore -- zplcore-mcp
Le serveur est conçu pour des entrées non fiables. Il communique uniquement via stdio et n'ouvre aucun port réseau. Chaque appel s'exécute dans son propre processus worker, avec des limites de temps et de mémoire et un environnement vide, sans accès aux fichiers, au réseau, aux imprimantes ni aux variables d'environnement ; sous macOS, un bac à sable du système d'exploitation s'y ajoute. Des tests adversariaux, du fuzzing et un audit IL de l'assembly vérifient le respect de ces règles. Documentation
PDF et SVG vers ZPL natif (Vector-Lift)
Vector-Lift convertit les PDF et SVG de transporteurs et d'ERP en véritable ZPL plutôt qu'en une seule image raster ^GF : le texte en champs ^A0, les codes-barres décodés, régénérés en commandes ^B natives et vérifiés, les lignes et cadres en ^GB, ^GC et ^GE. Chaque étiquette est livrée avec une fidélité mesurée :
$ 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
Le texte est composé en police 0 au lieu de la police d'origine, et le texte qui n'existe que sous forme de contours dans le PDF reste un graphique (pas d'OCR). Dans zplCloud, c'est l'outil gratuit PDF vers ZPL natif qui s'en sert. Documentation
NativeAOT
Le SDK, le package de test, la CLI et le serveur MCP se compilent sans aucun avertissement de trimming ni d'AOT. La CLI et le serveur MCP peuvent être publiés sous forme de programmes natifs qui démarrent sans runtime .NET installé, et un smoke test compare leur sortie à celle de la version JIT, octet par octet et pixel par pixel. Documentation
Ce que cela change pour les utilisateurs de zplCloud
Vous n'avez rien à installer, zplCloud tourne dès aujourd'hui sur zplCore.com :
- Quatre nouveaux outils gratuits : Contrôle de conformité d'étiquette, Barcode Scan-Proof, Migration Sunrise 2027 et PDF vers ZPL natif. Tous les quatre sont aussi disponibles via l'API zplCloud sous
/v1/tools/…. - L'aperçu correspond à l'impression : les aperçus PNG, SVG et PDF rendent le même ZPL que celui envoyé à l'imprimante.
- Un meilleur import dans le designer : l'import de ZPL dans le designer passe désormais par
Label.FromZpl. Sur l'aller-retour ZPL → design → ZPL des 96 modèles en 10 langues, le score moyen est passé de 0,7707 à 0,9998, et le nombre de modèles identiques au pixel près de 26 à 911 sur 960. - Les outils que vous connaissez déjà, comme le Linter ZPL, le Formateur ZPL, ZPL Diff et Vérifier un code-barres, fonctionnent avec le même moteur.
Bientôt disponible : zplCore Server (Docker)
Prochaine étape : nous préparons le moteur sous forme de conteneur prêt à l'emploi doté d'une API REST, avec du ZPL en entrée et un PNG, un PDF ou un rapport de contrôle en sortie. Sont prévus : une image multi-architecture pour linux/amd64 et linux/arm64, distroless, exécutée sans root et avec un système de fichiers en lecture seule, les endpoints /health, /ready et /metrics (Prometheus), une description OpenAPI et des images signées avec SBOM. Lors de notre test NativeAOT sur linux/arm64, le serveur a démarré en 4 ms environ, a rendu sa première étiquette en 11 ms environ, et l'image pesait environ 100 Mo. Ces fonctionnalités sont prévues ; sur zplcore.com, vous pouvez demander à être averti dès que la première version sera prête.
Essayer
- Démo en ligne : zplcore.com/en/demo rend du ZPL et exécute dans le navigateur la pré-vérification de conformité, le scan-proof, la migration GS1, l'extraction avec caviardage et le jumeau d'imprimante.
- Documentation : zplcore.com/en/docs, avec API, CLI, exemples, précision et limites connues.
- Version d'essai : demandez-la via le formulaire de contact sur zplcore.com. L'équipe de développement répond directement et vérifie volontiers vos propres fichiers ZPL et EPL. Les licences s'adressent aux clients professionnels (B2B).
- Sans code : les outils zplCloud gratuits fonctionnent avec le même moteur.
Questions fréquentes
zplCore.com est-il le même moteur que celui utilisé par zplCloud ?
Oui. zplCloud rend les aperçus, les PDF et les résultats des outils avec zplCore.com, et les nouveaux outils appellent les mêmes fonctions que celles du SDK.
zplCore.com nécessite-t-il une connexion Internet ou un pilote d'imprimante ?
Non. La bibliothèque s'exécute dans votre propre processus, hors ligne, sous Windows, Linux et macOS. L'impression passe directement par TCP 9100, le port série, l'USB, le spouleur Windows ou CUPS.
La pré-vérification de conformité et la note de scan sont-elles des certifications ?
Non. La pré-vérification de conformité contrôle le respect de règles publiées, et la note de scan est une pré-vérification numérique sur le modèle des normes ISO/IEC 15415/15416. Aucune des deux ne remplace la validation par un transporteur, une autorité ou votre organisation membre GS1, ni un vérificateur étalonné sur l'étiquette imprimée.
Que ne sait pas encore faire zplCore.com ?
Pharmacode 2D, Response Plus PostMatrix et HIBC selon ISO/IEC 15434 ne sont pas implémentés, faute de spécification publique. Deutsche Post BZL et JAB Code sont expérimentaux. Les polices résidentes de Zebra sont propriétaires et sont remplacées par des polices de substitution calibrées ; si vous avez besoin de glyphes identiques, enregistrez le TTF d'origine. La liste complète figure dans les limites connues.
Dois-je modifier quelque chose dans zplCloud ?
Non. Les designs, modèles, imprimantes et appels d'API restent inchangés.
Zebra et ZPL sont des marques de Zebra Technologies Corporation, GS1 et GS1 Digital Link sont des marques de GS1 AISBL, et Neodynamic, ThermalLabel et ZPLPrinter sont des marques de leurs propriétaires respectifs. Elles sont citées ici à titre purement descriptif.