zplCore.com · High Performance .NET Labelprint Engine
.NET 10 · ZPL II · EPL2 · Barcodes
Etiketten rendern, erzeugen und drucken. Mit einer einzigen Bibliothek.
zplCore.com ist ein virtueller Etikettendrucker für .NET: ZPL II und EPL2 werden zu PNG oder PDF, Etiketten aus C#-Objekten werden zu ZPL, und 144 Barcode-Symbologien sind eingebaut. Läuft unter Windows, Linux und macOS, ohne Druckertreiber.

gerendert mit zplCore.com · PNG
Auf einen Blick
^XA ^CI28 ^PW812 ^LL1218 ^FX Kopf: gefüllter Block + ^FR invertiert ^FO0,0^GB812,150,150^FS ^FO32,26^A0N,62,62^FR^FDFLINKFRACHT^FS ^FO640,166^GC130,8,B^FS 24h-Stempel ^FO32,356^A0N,170,140^FD80-B7^FS Routing, Font 0 ^FO32,540^GB748,236,4,B,2^FS abgerundet ^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
Funktionen
Alles, was zwischen Daten und Etikett passiert
Rendern
ZPL-II-Renderer
Ausgabe als PNG, JPEG, WebP, BMP, GIF, PDF, GRF, HTML, EPS, TIFF (CCITT G3/G4, LZW, Deflate, PackBits, mehrseitig), PCL (mono, grau, farbig) und ESC/POS mit NV-Logos. Gespeicherte Formate mit ^DF/^XF, Grafiken, Barcodes, Fonts.
Vektor-Ausgabe
Ganze Labels als SVG und PDF in Vektorform: Text als Glyphen-Umrisse, Barcodes und Rahmen als Pfade, Grafiken als 1-Bit-Bilder. Jedes SVG-Element trägt seine Position im ZPL-Quelltext. Rückgerastert stimmt die Ausgabe mit dem PNG überein (Mittelwert 1,000 bei 2 Dots Toleranz, 126 Labels).
EPL2-Renderer
EPL2 läuft durch dieselbe Engine. ToZpl() konvertiert bestehende EPL-Formulare nach ZPL.
Diagnose & Quellbezug
Strukturierte Diagnosen mit stabilen Codes. Jedes gerenderte Element kennt seine Position im ZPL-Quelltext und lässt sich als JSON ausgeben. Schutzgrenzen für fremdes ZPL.
ZPL-Optimierer
Verkleinert ZPL ohne Pixeländerung: entfernt redundante Befehle und Standardparameter und komprimiert Grafiken neu (Hex, ACS, Z64). Pixelgleich geprüft am gesamten Referenzkorpus.
DPI-Umrechnung
ZplRescaler rechnet Roh-ZPL zwischen 203, 300 und 600 dpi um. ZplGraphicEncoder kodiert Bilder als Hex, ACS, Z64 oder B64 mit 5 Dithering-Verfahren.
Geprüfte Genauigkeit
Automatisierter Pixelvergleich gegen druckergenaue Referenzrenderings, im Mittel 0,974 über 122 Testfälle. Barcode-Encoder sind bit-genau gegen bwip-js geprüft.
Erzeugen & Binden
Barcode-Generator
144 Symbologien, von Code 128 über GS1 DataBar und QR bis MaxiCode, DotCode und Han Xin. Ausgabe als PNG, SVG, PDF, EPS oder ^GFA. GS1-Validierung inklusive.
Label-Modell
Text, Barcode, Tabelle, Bild, RFID in mm oder Zoll. Ausdrücke mit Element-Referenzen, Validierung, AutoFit, Duplex mit Vorder- und Rückseite. Mehrsprachige Vorlagen mit {t:key} und Kultur pro Druckauftrag. Speichern und Laden als JSON-Vorlage.
Datenbindung
label.For<T>() bindet C#-Objekte, EF-Core-Abfragen und MongoDB- oder LiteDB-Dokumente per LINQ. Dazu JSON (JsonElement) und dynamische Datensätze. Streaming mit konstantem Speicher, asynchron in Stream und PipeWriter.
Drucken & Betrieb
Druckaufträge
Start-Label, Datensätze, End-Label und Schnitt nach dem letzten Etikett in einem Job. Transport über TCP 9100, seriell, USB, Windows-Spooler oder CUPS. ^MM/^MN/^MT, erweiterter ~HQ-Status, Probelauf.
Virtueller Drucker
ZplVirtualPrinter lauscht auf TCP 9100 und rendert eingehende Druckjobs. Testen ohne Hardware.
Kommandozeile
Das zpl-dotnet-Tool rendert, konvertiert EPL nach ZPL, druckt, erzeugt Barcodes und validiert.
TrueType-Fonts
TTF-Schriften gehen über ~DY in den Druckerspeicher oder werden als Grafik gedruckt (PrintAsGraphic).
Weltschriften
HarfBuzz-Shaping und Bidi für Arabisch, Hebräisch, Thai, indische Schriften und CJK.
Ein Paket statt vier
Ein NuGet-Paket für vier Aufgaben
Viele .NET-Teams kaufen für Etiketten gleich mehrere SDKs: einen ZPL-Emulator, einen EPL-Emulator, einen Label-Designer und eine Barcode-Bibliothek. zplCore.com übernimmt ZPL-Rendering, EPL-Rendering, Label-Design und Barcode-Erzeugung in einer Assembly.
| Einsatzfall | Üblicherweise | zplCore.com |
|---|---|---|
| ZPL → PNG/PDF-Vorschau | ZPL-Emulator-SDK | ZplRenderer |
| EPL2 → Bild, EPL → ZPL-Migration | EPL-Emulator-SDK | EplRenderer · ToZpl() |
| Etiketten im Code entwerfen, Daten binden, drucken | Label-Designer-SDK | Labels.Label · PrintJobTemplate |
| Barcodes als Bild/Vektor, GS1-Prüfung | Barcode-SDK | Barcodes.Barcode · Gs1 |
Sie wechseln von einem anderen SDK? zplCore.com ist keine 1:1-Kopie fremder APIs und hat nicht jede Funktion. Schicken Sie uns Ihre ZPL-Dateien und Anforderungen, dann prüfen wir die Abdeckung vor dem Kauf (siehe auch bekannte Grenzen).
Performance
Schnell genug für den Versandschluss um 18 Uhr
Alle Zahlen sind gemessen, nicht geschätzt: Release-Build, .NET 10, Apple M3 Max (10 Performance- + 4 Effizienzkerne). Die Benchmarks liegen im Repository bei.
Ein Druckauftrag: Start-Label + 100.000 Sendungs-Labels + End-Label, Schnitt nur nach dem letzten Label. 14 Kerne, samples/PerfTest.
| Szenario | Zeit | Labels/s | Größe | Speicher (Heap) |
|---|---|---|---|---|
Objekte → ZPL, gespeichertes Format (^DF/^XF) | 0,73 s | 136.000 | 14,7 MB | 24 MB |
| Objekte → ZPL, volles Format je Label | 0,39 s | 256.000 | 29,1 MB | 24 MB |
EF Core / SQLite AsAsyncEnumerable() → Datei | 0,57 s | 176.000 | 14,7 MB | 29 MB |
| LiteDB-Query → Datei | 0,50 s | 202.000 | 14,7 MB | 64 MB |
| PNG-Vorschau sequenziell (799 × 480 px, Graustufen) | 3,4 min | 490 | 18,2 MB / 2.000 | 84 MB |
| PNG-Vorschau parallel (14 Kerne) | 24,8 s | 4.033 | 17,1 MB / 2.000 | 106 MB |
Die ZPL-Erzeugung ist praktisch kostenlos und streamt mit konstantem Speicher. Das gespeicherte Format halbiert die Datenmenge zum Drucker (14,7 statt 29,1 MB).
ASP.NET-Core-Minimal-API aus samples/WebApiDemo: 14 Kerne, Server-GC, 14 Worker, Label 100 × 60 mm bei 203 dpi. Client und Server im selben Prozess.
| Szenario | Labels/s | MB/s | p50 | p95 | GC-Heap |
|---|---|---|---|---|---|
| JSON-Payload → ZPL | |||||
| 1.000 Datensätze/Request | 62.857 | 20,3 | 16,2 ms | 16,7 ms | 178 MB |
| 10.000 Datensätze/Request | 112.484 | 36,4 | 76,1 ms | 136,9 ms | 183 MB |
| 100.000 Datensätze/Request | 186.572 | 60,5 | 527,5 ms | 565,2 ms | 414 MB |
| DB-Streaming → ZPL | |||||
| 10.000 Datensätze | 151.744 | 49,1 | 69,6 ms | 73,1 ms | 361 MB |
| 100.000 Datensätze | 199.102 | 64,6 | 504,3 ms | 505,2 ms | 372 MB |
| Gleichzeitige Clients | |||||
| JSON 1k, 1 Client | 196.112 | 63,4 | 4,8 ms | 8,6 ms | 404 MB |
| JSON 1k, 4 Clients | 240.453 | 77,7 | 16,4 ms | 21,7 ms | 404 MB |
| JSON 1k, 16 Clients | 155.344 | 50,2 | 100,8 ms | 120,8 ms | 419 MB |
| DB 10k, 4 Clients | 215.699 | 69,7 | 186,2 ms | 202,4 ms | 395 MB |
| DB 10k, 16 Clients | 179.860 | 58,2 | 878,0 ms | 907,6 ms | 408 MB |
| Vorschau (50 Labels/Request) | |||||
| PDF, 1 Client | 583 | 5,0 | 87,0 ms | 94,0 ms | 267 MB |
| PNG (zip), 1 Client | 484 | 4,6 | 108,3 ms | 108,7 ms | 269 MB |
| PDF, 14 Clients | 5.085 | 43,5 | 131,8 ms | 154,4 ms | 472 MB |
| PNG (zip), 14 Clients | 3.995 | 38,1 | 162,0 ms | 188,1 ms | 473 MB |
| Job-Queue (alle Jobs gleichzeitig eingereicht, Latenz inkl. Wartezeit) | |||||
| 256 × JSON 1k → ZPL (153 Jobs/s) | 153.438 | 49,6 | 98,8 ms | 365,5 ms | 885 MB |
| 64 × DB 10k → ZPL (18,6 Jobs/s) | 186.361 | 60,3 | 2.236,5 ms | 3.411,1 ms | 828 MB |
| 64 × JSON 50 → PDF (104 Jobs/s) | 5.396 | 46,2 | 345,2 ms | 445,6 ms | 467 MB |
Die ZPL-Erzeugung sättigt bei 199.000 Labels/s (ab 4 parallelen Requests), weitere Clients erhöhen nur die Latenz. Rendern kostet 40× mehr und skaliert mit den Kernen.
Rendern + PNG
Labels/s · Faktor ggü. 1 ThreadVorher (heller Balken): 499 → 1.826/s, maximal 4,5× bei 8 Threads.
Nur Text
Labels/s · Faktor ggü. 1 ThreadVorher wurde Text mit mehr Threads langsamer (0,6× bei 8 Threads), weil Skias Glyph-Cache global sperrt.
Gemessen mit RenderBench -- 150 scale auf dem M3 Max. Glyphen landen einmal pro Schrift und Größe in einem sperrfreien Cache, so entfallen die globalen Sperren von SkiaSharp.
Pro Label 100 × 60 mm bei 203 dpi. Graustufen- bzw. 1-Bit-PNG statt RGBA, direkt gezeichnete ^GB-Rahmen, sperrfreier Glyph-Cache.
| Messung | Vorher | Jetzt | Verbesserung |
|---|---|---|---|
| Rendern zu Bitmap | 1,28 ms | 0,39 ms | −70 % |
| Rendern + PNG | 8,19 ms | 1,86 ms | −77 % |
| PNG-Größe | 18 KB | 9 KB | −50 % |
| 100.000 Vorschauen sequenziell | 14,5 min | 3,4 min | −77 % |
| 100.000 Vorschauen parallel | 2,2 min | 25 s | −81 % |
| Rendern + PNG, 10 Threads | 1.826/s | 5.022/s | 2,8× |
| Nur Text, 8 Threads | 3.162/s | 42.434/s | 13,4× |
| Arbeitslast | Labels | Speicher |
|---|---|---|
| Dauertest, kleine Labels, parallel | 1.000.000 | RSS 128–138 MB · GC-Heap 2–3 MB |
| Dauertest, 4 × 6″-PNGs, 14 Threads | 1.000.000 | RSS 438–481 MB |
| ZPL-Streaming aus Objekten | 100.000 | Heap 24 MB |
| Streaming aus EF Core / SQLite in eine ZPL-Datei | 100.000 | Heap 29 MB |
| Streaming aus LiteDB in eine ZPL-Datei | 100.000 | Heap 64 MB |
Methodik
Release-Build, .NET 10, Apple M3 Max mit 10 Performance- und 4 Effizienzkernen. Alle Messungen lassen sich mit einem Befehl wiederholen.
# 100.000-Label-Druckauftrag dotnet run -c Release --project samples/PerfTest -- 100000 # Thread-Skalierung (label|text|barcode|box|empty) dotnet run -c Release --project samples/RenderBench -- 150 scale
Plattform & Cloud
Läuft dort, wo Ihr Backend läuft
Windows · Linux · macOS
Eine .NET-10-Assembly auf Basis von SkiaSharp und HarfBuzz. 1.656 automatisierte Tests laufen auf Windows 11, macOS und Linux grün. Kein Druckertreiber und kein GUI nötig.
Container
Getestet in den .NET-Images für Debian und Azure Linux 3.0, auch im minimalen Distroless-Image. Keine zusätzlichen Systempakete nötig, die nativen Bibliotheken bringt das NuGet-Paket mit.
Minimal-API-Beispiel
ASP.NET-Core-Beispiel mit Streaming-Endpunkten, einer begrenzten Queue (Channel + BackgroundService) und parallelen Workern.
Datenquellen
Jede Datenquelle, die C#-Objekte liefert
Die Datenbindung arbeitet mit jedem IEnumerable<T>, IQueryable<T> oder IAsyncEnumerable<T>. Filter und Sortierung laufen in der Datenbank, die Etiketten werden gestreamt. Damit funktionieren alle EF-Core-Provider und jeder Datenbank-Treiber mit LINQ.
Alles, was C# lesen kann
über EF Core, offizielle .NET-Treiber oder eigene Objekte
- 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#-Objekte / LINQ
- JSON
Docker & Kubernetes
Dockerfile und Helm-Chart im Lieferumfang
- Alle Tests laufen grün in den offiziellen .NET-10-Container-Images für Debian und Azure Linux 3.0.
Dockerfile.serverim Lieferumfang: Distroless-Image, läuft ohne Root-Rechte, mit/health-Endpunkt.- Helm-Chart für Kubernetes im Lieferumfang. Das Image bauen Sie selbst, es liegt in keiner öffentlichen Registry.
- Keine zusätzlichen Systempakete nötig, die nativen Bibliotheken bringt das NuGet-Paket mit.
- Zustandslos pro Renderer: Ein Webdienst skaliert horizontal.
- Asynchrones ASP.NET-Core-Minimal-API-Beispiel mit Job-Queue (199.000 Labels/s ZPL-Erzeugung auf einem 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"]
kind: Deployment spec: replicas: 2 template: spec: containers: - name: label-api resources: requests: { cpu: 500m, memory: 512Mi } limits: { cpu: "1", memory: 1Gi } readinessProbe: httpGet: { path: /health, port: 8080 } --- kind: HorizontalPodAutoscaler spec: metrics: - type: Resource resource: name: cpu target: { type: Utilization, averageUtilization: 70 }
Weltschriften
Arabisch, Chinesisch, Hindi, Koreanisch, Japanisch, Russisch: korrekt geformt
TrueType-Schrift in den Druckerspeicher laden oder als Grafik drucken. Diese Ausgaben stammen direkt aus der Engine.










Code
Drei Zeilen bis zur Vorschau
var renderer = new ZplRenderer(new ZplRenderSettings { Dpi = 203 }.WithLabelSizeMm(100, 150)); List<byte[]> pngs = renderer.ProcessCommands( "^XA^FO50,50^A0N,40,40^FDHallo Welt^FS^BY2^FO50,120^BCN,80^FD12345^FS^XZ"); renderer.Settings.OutputFormat = ZplOutputFormat.Pdf; File.WriteAllBytes("preview.pdf", renderer.ProcessFile("labels.zpl")[0]);
using ZplCore.Labels; var job = PrintJobTemplate.FromFiles("templates/leading.json", "templates/shipping.json", "templates/trailing.json"); job.JobName = "Tour 7"; job.KeyField = "TrackingNo"; // erster/letzter Schlüssel auf dem End-Label job.CutAfterLastLabel = true; // Schnitt nur nach dem letzten Label job.StoredFormatName = "R:SHIP.ZPL"; // Vorlage einmal, danach nur Feldwerte string zpl = job.For<Shipment>().ToZpl(db.Shipments.Where(s => !s.Printed).Take(50).ToList()); File.WriteAllText("job.zpl", zpl); // 52 Labels in EINER Datei
# samples/WebApiDemo – ASP.NET Core Minimal API dotnet run -c Release --project samples/WebApiDemo # 50.000 Sendungen aus EF Core/SQLite als ZPL streamen curl 'localhost:5080/api/jobs/db/zpl?country=AT&take=50000' -o at.zpl # PDF-Vorschau aus JSON-Datensätzen curl -X POST 'localhost:5080/api/jobs/preview?format=pdf' -H 'Content-Type: application/json' -d @records.json -o preview.pdf # Asynchron über die Queue: 202 Accepted, 429 wenn voll curl -X POST localhost:5080/api/queue -H 'Content-Type: application/json' -d '{"db":{"country":"AT","take":20000},"output":"zpl"}'
var epl = new EplRenderer(new ZplRenderSettings { Dpi = 203 }); List<byte[]> labels = epl.ProcessFile("label.epl"); string zpl = epl.ToZpl(File.ReadAllText("label.epl")); // EPL-Formulare nach ZPL migrieren var bc = new ZplCore.Barcodes.Barcode { Symbology = ZplCore.Barcodes.Symbology.Gs1_128, Code = "(01)09521234543213(10)LOT42", Unit = ZplCore.Barcodes.BarcodeUnit.Millimeter, BarWidth = 0.33, BarHeight = 20, }; File.WriteAllText("gs1.svg", bc.ToSvg());
Preise
Perpetual-Lizenz, ohne Laufzeitgebühren
Developer
pro Entwickler, einmalig
- interne Nutzung
- unbegrenzte eigene Server & Container
- 12 Monate Updates
- E-Mail-Support (2 Werktage)
Team
bis 5 Entwickler, einmalig
- alles aus Developer
- Support innerhalb 1 Werktag
- 12 Monate Updates
OEM / SaaS
bis 5 Entwickler, einmalig
- lizenzgebührenfreie Weitergabe in Ihren Produkten
- Betrieb als SaaS-/Serverdienst
- 12 Monate Updates + Support
Enterprise
auf Anfrage
- unbegrenzte Entwickler
- OEM inklusive
- individuelle EULA, Priority Support
Preise netto zzgl. USt. Verlängerung von Updates & Support: 40 % des Listenpreises pro Jahr. Ohne Verlängerung dürfen Sie die zuletzt erhaltene Version unbegrenzt weiter nutzen. Auf Wunsch gibt es ein Jahresabo.
FAQ
Häufige Fragen
Wie wird lizenziert?
Pro Entwickler, der mit zplCore.com programmiert. Produktions-, Test- und Build-Server zählen nicht als Entwickler. Die Lizenz ist dauerhaft (perpetual) und enthält 12 Monate Updates.
Kann ich zplCore.com lizenzgebührenfrei weitergeben?
Ja, ab der OEM-/SaaS-Lizenz in Ihren eigenen Anwendungen und Diensten. Ausgenommen ist ein Weiterverkauf als eigenständiges Entwickler-SDK.
Wie sieht der Support aus?
E-Mail-Support durch das Entwicklerteam. Die Reaktionszeit hängt von der Lizenzstufe ab. Bugfixes kommen mit den regulären Updates.
Enthält zplCore.com fremden Code anderer Hersteller?
zplCore.com ist eine unabhängige Implementierung auf Basis der öffentlichen ZPL-II-Spezifikation und der Symbologie-Standards. Sie enthält keinen Code anderer kommerzieller Anbieter. Verwendete Open-Source-Komponenten (z. B. aus BWIPP/bwip-js und zint, MIT- bzw. BSD-Lizenz) sind in THIRD-PARTY-NOTICES.md dokumentiert.
Was kann zplCore.com (noch) nicht?
Nicht umgesetzt sind Pharmacode 2D, Response Plus PostMatrix und HIBC nach ISO/IEC 15434, für die es keine öffentliche Spezifikation gibt. Deutsche Post BZL und JABCode sind experimentell. Die proprietären residenten Zebra-Fonts werden durch DejaVu ersetzt. Wer identische Metriken braucht, registriert die Original-TTF. Bei der QR-Maskenwahl weicht die Ausgabe von Zebra ab, die Codes bleiben lesbar. Label-Vorlagen gibt es nur als JSON.
Kann ich vor dem Kauf testen?
Ja. Schreiben Sie uns, dann senden wir Ihnen eine Testversion. Gern prüfen wir auch Ihre eigenen ZPL-/EPL-Dateien.
Lassen Sie uns über Ihre Etiketten sprechen
Testversion, Angebot oder Migrationscheck: Schicken Sie uns eine kurze Nachricht.