zplCore.com · High Performance .NET Labelprint Engine

.NET 10 · ZPL II · EPL2 · Barcodes

Render, generate and print labels. With a single library.

zplCore.com is a virtual label printer for .NET: ZPL II and EPL2 become PNG or PDF, labels built from C# objects become ZPL, and 144 barcode symbologies are built in. Runs on Windows, Linux and macOS, with no printer driver.

compatible with ZPL II for Zebra® printers*PNG · PDF · TIFF · PCL · ESC/POSSQL Server · PostgreSQL · MongoDB · EF Core
4×6-inch shipping label with inverted header, routing code, Code 128, Data Matrix, PDF417 and SSCC, rendered with ZplCore
199,000labels/s ZPL generation
144barcode symbologies
1,656automated tests

rendered with zplCore.com · PNG

At a glance

ZPL II & EPL2render and convert
144 symbologiesincluding GS1 validation
PNG · PDF · TIFF · PCLESC/POS · GIF · HTML · EPS
Windows · Linux · macOSno printer driver
.NET 10 · NuGet · CLIDockerfile + Helm chart
1,656 testsautomated
samples/zpl/hero-label.zplExcerpt · 203 dpi · 4×6″
^XA ^CI28 ^PW812 ^LL1218
^FX Header: filled block + ^FR inverted
^FO0,0^GB812,150,150^FS
^FO32,26^A0N,62,62^FR^FDFLINKFRACHT^FS
^FO640,166^GC130,8,B^FS        24h stamp
^FO32,356^A0N,170,140^FD80-B7^FS  Routing, font 0
^FO32,540^GB748,236,4,B,2^FS   rounded
^FO56,598^A0N,44,44^FDJürgen Größmann^FS
^BY3,3,110^FO60,826^BCN,110,Y,N,N^FDZE4711802026DE^FS
^FO40,1000^BXN,7,200^FDZE4711802026DE|80331|B7^FS
^FO220,996^B7N,5,2,4^FDFLINKFRACHT|…^FS
^FO280,1100^BCN,60,Y,N,N^FD>;>800340123450000000018^FS
^XZ
// C#: new ZplRenderer(settings).ProcessCommands(zpl) → PNG

Features

Everything that happens between data and label

Render

ZPL II renderer

Output as PNG, JPEG, WebP, BMP, GIF, PDF, GRF, HTML, EPS, TIFF (CCITT G3/G4, LZW, Deflate, PackBits, multi-page), PCL (mono, grayscale, color) and ESC/POS with NV logos. Stored formats with ^DF/^XF, graphics, barcodes, fonts.

Vector output

Entire labels as vector SVG and PDF: text as glyph outlines, barcodes and boxes as paths, graphics as 1-bit images. Every SVG element carries its position in the ZPL source. Rasterized back, the output matches the PNG (mean 1.000 at a 2-dot tolerance, 126 labels).

EPL2 renderer

EPL2 runs through the same engine. ToZpl() converts existing EPL forms to ZPL.

Diagnostics & source mapping

Structured diagnostics with stable codes. Every rendered element knows its position in the ZPL source and can be exported as JSON. Safety limits for untrusted ZPL.

ZPL optimizer

Shrinks ZPL without changing a single pixel: removes redundant commands and default parameters and recompresses graphics (Hex, ACS, Z64). Verified pixel-identical across the entire reference corpus.

DPI conversion

ZplRescaler converts raw ZPL between 203, 300 and 600 dpi. ZplGraphicEncoder encodes images as Hex, ACS, Z64 or B64 with 5 dithering methods.

Verified accuracy

Automated pixel comparison against printer-accurate reference renderings, averaging 0.974 across 122 test cases. Barcode encoders are verified bit-exact against bwip-js.

Generate & bind

Barcode generator

144 symbologies, from Code 128, GS1 DataBar and QR to MaxiCode, DotCode and Han Xin. Output as PNG, SVG, PDF, EPS or ^GFA. GS1 validation included.

Label model

Text, barcode, table, image, RFID in mm or inches. Expressions with element references, validation, AutoFit, duplex with front and back. Multilingual templates with {t:key} and a culture per print job. Save and load as JSON templates.

Data binding

label.For<T>() binds C# objects, EF Core queries and MongoDB or LiteDB documents via LINQ. Plus JSON (JsonElement) and dynamic records. Streaming with constant memory, asynchronously into Stream and PipeWriter.

Print & operate

Print jobs

Leading label, records, trailing label and a cut after the last label, all in one job. Transport via TCP 9100, serial, USB, the Windows spooler or CUPS. ^MM/^MN/^MT, extended ~HQ status, dry run.

Virtual printer

ZplVirtualPrinter listens on TCP 9100 and renders incoming print jobs. Test without hardware.

Command line

The zpl dotnet tool renders, converts EPL to ZPL, prints, generates barcodes and validates.

TrueType fonts

TTF fonts go into printer memory via ~DY or are printed as graphics (PrintAsGraphic).

World scripts

HarfBuzz shaping and bidi for Arabic, Hebrew, Thai, Indic scripts and CJK.

One package instead of four

One NuGet package for four jobs

Many .NET teams buy several SDKs just for labels: a ZPL emulator, an EPL emulator, a label designer and a barcode library. zplCore.com covers ZPL rendering, EPL rendering, label design and barcode generation in a single assembly.

Use caseTypicallyzplCore.com
ZPL → PNG/PDF previewZPL emulator SDKZplRenderer
EPL2 → image, EPL → ZPL migrationEPL emulator SDKEplRenderer · ToZpl()
Design labels in code, bind data, printLabel designer SDKLabels.Label · PrintJobTemplate
Barcodes as image/vector, GS1 validationBarcode SDKBarcodes.Barcode · Gs1

Switching from another SDK? zplCore.com is not a 1:1 copy of other vendors' APIs and does not have every feature. Send us your ZPL files and requirements, and we will check coverage before you buy (see also known limitations).

Performance

Fast enough for the 6 p.m. shipping cutoff

Every number is measured, not estimated: release build, .NET 10, Apple M3 Max (10 performance + 4 efficiency cores). The benchmarks ship with the repository.

199,000labels/s ZPLstored format, 100,000 labels in one job (LiteDB → file: 0.50 s)
5,022PNG renderings/s10 threads, render + PNG, 9.2× vs. 1 thread
24.8 s100,000 PNG previewsparallel on 14 cores, 4,033 labels/s (sequential 3.4 min)
1Mlabels without a leakmemory stays flat, GC heap 2–3 MB

One print job: leading label + 100,000 shipping labels + trailing label, cut only after the last label. 14 cores, samples/PerfTest.

ScenarioTimeLabels/sSizeMemory (heap)
Objects → ZPL, stored format (^DF/^XF)0.73 s136,00014.7 MB24 MB
Objects → ZPL, full format per label0.39 s256,00029.1 MB24 MB
EF Core / SQLite AsAsyncEnumerable() → file0.57 s176,00014.7 MB29 MB
LiteDB query → file0.50 s202,00014.7 MB64 MB
PNG preview, sequential (799 × 480 px, grayscale)3.4 min49018.2 MB / 2,00084 MB
PNG preview, parallel (14 cores)24.8 s4,03317.1 MB / 2,000106 MB

ZPL generation is practically free and streams with constant memory. The stored format halves the data sent to the printer (14.7 instead of 29.1 MB).

Methodology

Release build, .NET 10, Apple M3 Max with 10 performance and 4 efficiency cores. Every measurement can be reproduced with a single command.

# 100,000-label print job
dotnet run -c Release --project samples/PerfTest -- 100000
# Thread scaling (label|text|barcode|box|empty)
dotnet run -c Release --project samples/RenderBench -- 150 scale

Platform & cloud

Runs wherever your backend runs

Verified

Windows · Linux · macOS

A single .NET 10 assembly built on SkiaSharp and HarfBuzz. 1,656 automated tests pass on Windows 11, macOS and Linux. No printer driver and no GUI required.

Cloud

Containers

Tested in the .NET images for Debian and Azure Linux 3.0, including the minimal distroless image. No extra system packages required; the NuGet package ships the native libraries.

Sample

Minimal API sample

ASP.NET Core sample with streaming endpoints, a bounded queue (Channel + BackgroundService) and parallel workers.

Data sources

Any data source that delivers C# objects

Data binding works with any IEnumerable<T>, IQueryable<T> or IAsyncEnumerable<T>. Filtering and sorting run in the database, and the labels are streamed. That means every EF Core provider and every database driver with LINQ support works.

Anything C# can read

via EF Core, official .NET drivers or your own objects

  • Microsoft SQL Server
  • Azure SQL
  • PostgreSQL
  • MySQL
  • MariaDB
  • Oracle
  • SQLite
  • MongoDB
  • Azure Cosmos DB
  • SAP HANA
  • IBM Db2 / Informix
  • Couchbase
  • Firebird
  • Amazon DynamoDB
  • RavenDB
  • Elasticsearch
  • OpenSearch
  • LiteDB
  • Dapper / ADO.NET
  • Entity Framework Core
  • C# objects / LINQ
  • JSON

Docker & Kubernetes

Dockerfile and Helm chart included

  • All tests pass in the official .NET 10 container images for Debian and Azure Linux 3.0.
  • Dockerfile.server included: distroless image, runs without root privileges, with a /health endpoint.
  • Helm chart for Kubernetes included. You build the image yourself; it is not published to any public registry.
  • No extra system packages required; the NuGet package ships the native libraries.
  • Stateless per renderer: a web service scales horizontally.
  • Asynchronous ASP.NET Core minimal API sample with a job queue (199,000 labels/s ZPL generation on a Mac).
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish samples/WebApiDemo -c Release -o /app

FROM mcr.microsoft.com/dotnet/aspnet:10.0-azurelinux3.0-distroless
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet","WebApiDemo.dll"]

World scripts

Arabic, Chinese, Hindi, Korean, Japanese, Russian: shaped correctly

Load a TrueType font into printer memory or print it as graphics. These outputs come straight from the engine.

Arabic label, rendered with ZplCore
Arabic (TTF)
Chinese label – rendered with zplCore.com
Chinese (TTF)
Hindi label – rendered with zplCore.com
Hindi (TTF)
Korean label – rendered with zplCore.com
Korean (TTF)
Japanese label – rendered with zplCore.com
Japanese (TTF)
Russian label (Cyrillic)
Russian (TTF)
Shipping label, rendered from ZPL
Shipping label from ZPL
EPL2 label – rendered with zplCore.com
EPL2 rendering
MaxiCode – rendered with zplCore.com
MaxiCode
Data Matrix – rendered with zplCore.com
Data Matrix

Code

Three lines to a preview

var renderer = new ZplRenderer(new ZplRenderSettings { Dpi = 203 }.WithLabelSizeMm(100, 150));
List<byte[]> pngs = renderer.ProcessCommands(
    "^XA^FO50,50^A0N,40,40^FDHello World^FS^BY2^FO50,120^BCN,80^FD12345^FS^XZ");
renderer.Settings.OutputFormat = ZplOutputFormat.Pdf;
File.WriteAllBytes("preview.pdf", renderer.ProcessFile("labels.zpl")[0]);

Pricing

Perpetual license, no runtime fees

Developer

€990

per developer, one-time

  • internal use
  • unlimited own servers & containers
  • 12 months of updates
  • email support (2 business days)
Request a trial
Recommended

Team

€2,900

up to 5 developers, one-time

  • everything in Developer
  • support within 1 business day
  • 12 months of updates
Request a trial

OEM / SaaS

€5,900

up to 5 developers, one-time

  • royalty-free redistribution in your products
  • operation as a SaaS / server service
  • 12 months of updates + support
Request a quote

Enterprise

from €12,000

on request

  • unlimited developers
  • OEM included
  • custom EULA, priority support
Get in touch

Prices are net, plus VAT. Renewal of updates & support: 40% of the list price per year. Without renewal, you may keep using the last version you received indefinitely. An annual subscription is available on request.

FAQ

Frequently asked questions

How is it licensed?

Per developer who writes code with zplCore.com. Production, test and build servers do not count as developers. The license is perpetual and includes 12 months of updates.

Can I redistribute zplCore.com royalty-free?

Yes, from the OEM / SaaS license upward, within your own applications and services. Reselling it as a standalone developer SDK is excluded.

What does support look like?

Email support directly from the development team. Response time depends on the license tier. Bug fixes ship with the regular updates.

Does zplCore.com contain code from other vendors?

zplCore.com is an independent implementation based on the public ZPL II specification and the symbology standards. It contains no code from other commercial vendors. Open-source components it uses (e.g. from BWIPP/bwip-js and zint, under MIT and BSD licenses respectively) are documented in THIRD-PARTY-NOTICES.md.

What can't zplCore.com do (yet)?

Pharmacode 2D, Response Plus PostMatrix and HIBC per ISO/IEC 15434 are not implemented, as no public specification exists for them. Deutsche Post BZL and JABCode are experimental. The proprietary resident Zebra fonts are replaced by DejaVu. If you need identical metrics, register the original TTF. QR mask selection differs from Zebra's output, but the codes remain readable. Label templates are available as JSON only.

Can I try it before buying?

Yes. Write to us and we will send you a trial version. We are also happy to check your own ZPL/EPL files.

Let's talk about your labels

Trial version, quote or migration check: just send us a short message.

support@zplcore.com