zplCore.comzplCore.com

31Command line, server image & Helm

tools/ZplCli can be packed as a .NET tool (package ZplCore.Cli, command zplcore).

dotnet pack tools/ZplCli -c Release -o nupkg
dotnet tool install -g ZplCore.Cli --add-source nupkg

zplcore render label.zpl -o label.png --dpi 300 --width 100 --height 150   # mm; one image per label
zplcore render label.zpl -o labels.pdf                                       # pdf/tiff/html contain all labels
zplcore render label.epl -f tiff -o out.tif                                  # EPL is detected (or --epl)
zplcore render label.zpl -f svg > label.svg                                  # stdout; "-" reads stdin
zplcore epl2zpl label.epl -o label.zpl
zplcore print label.zpl --host 192.168.1.50 --port 9100
zplcore barcode qrcode "https://example.com" -o qr.svg                       # png/svg/pdf/eps/jpeg/zpl
zplcore validate label.zpl                                                   # exit code 1 on warnings
zplcore format label.zpl -o pretty.zpl --comments                           # one command per line; --minify, --indent n
zplcore diff old.zpl new.zpl -o diff.png --boxes                             # pixel overlay + line diff, exit code 1 if different
zplcore formats

zplcore comply label.zpl --pack gs1-logistic,sunrise                         # compliance pre-check (text/JSON/SARIF)
zplcore verify label.zpl --fail-on mismatch,grade:C                          # scan-proof
zplcore check "labels/**/*.zpl" --verify --layout --format junit             # CI: everything in one run
zplcore import legacy.zpl -o label.json --report                             # ZPL → label model
zplcore extract label.zpl --format json · zplcore redact label.zpl -o out.zpl
zplcore gs1 migrate label.zpl -o label-2d.zpl · zplcore gs1 link "(01)…"
zplcore rfid encode --sscc 340123450000000017 --company-prefix 7 --format zpl
zplcore twin check label.zpl --profile ZD421d-203 · zplcore twin estimate …
zplcore serve --chaos chaos.json --cut-marks                                 # virtual printer with faults
zplcore lift label.pdf -o label.zpl --report                                 # PDF/SVG → native ZPL

More options: --labels 0,2, --flip x|y|xy, --landscape, --no-antialias, --field n=value, --encoding. zplcore --help lists every command; the checking commands are described in the sections Compliance to Vector-Lift.

Server image (distroless), NativeAOT containers, NAS & Helm chart

build/Dockerfile.server publishes samples/WebApiDemo on mcr.microsoft.com/dotnet/aspnet:10.0-azurelinux3.0-distroless (or aspnet:10.0-noble-chiseled-extra): no shell, user app (non-root), port 8080, /health, SQLite demo data in /tmp – runs with --read-only. For NativeAOT containers without the .NET runtime, mcr.microsoft.com/dotnet/runtime-deps:10.0-noble-chiseled-extra serves as the base image (~79–105 MB image size). That turns even an existing NAS (such as a Synology DS923+ via Synology Container Manager) or a Raspberry Pi into a local warehouse label print and rendering server (~90 MiB RAM, 67 ms PNG and 113 ms PDF preview over LAN on a DS923+). deploy/helm/zplcore contains a Deployment, Service and HorizontalPodAutoscaler (default 2–10 replicas, 70 % CPU), probes on /health, app settings via env and a read-only root file system with emptyDir on /tmp.

docker build -f build/Dockerfile.server -t zplcore-server .
docker run --rm --read-only --tmpfs /tmp -p 8080:8080 zplcore-server
curl -X POST 'localhost:8080/api/jobs/preview?format=pdf' -H 'Content-Type: application/json' \
     -d '{"data":[{"trackingNo":"00340000000000000014","name":"Anna Huber","city":"Wien","country":"AT"}]}' -o preview.pdf

helm install labels deploy/helm/zplcore --set image.repository=myregistry/zplcore-server --set image.tag=1.0.0