ZPLPrinter Web API for Docker

REST API to Convert, Preview & Render ZPL to PNG, JPG & PDF!

  Download   Buy

Key Features

  Convert raw ZPL to PNG, JPG, PCX, GRF & PDF
  Preview ZPL commands without wasting real labels!
  High Quality & Accuracy ZPL Rendering
  ZPL Parsing from Raw & Base64 Strings
  International Text & Barcodes Support

Zebra and ZPL are registered trademarks of ZIH Corp.
ZPLPrinter Web API for Docker
is not made by or endorsed by Zebra.

Convert, Preview & Render ZPL commands to PNG, JPG & PDF from Docker!

ZPLPrinter Web API for Docker allows you to Convert, Preview and Render raw ZPL (Zebra Programming Language) commands to well known image and document formats like PNG, JPG, PDF, PCX, Zebra GRF ASCII hex, Zebra EPL Binary Graphic, Honeywell-Intermec FingerPrint Binary Graphic, EPSON ESC/POS NV Binary Graphic & HP PCL Binary Graphic from Any Development Platform and Programming Languages (.NET, Java, PHP, Javascript, Python, Ruby, and more!)

ZPL Virtual Printer ZPL Viewer ZPL Parser ZPL Converter ZPL Emulator ZPL2PNG ZPL2JPG ZPL2PCX ZPL2GRF ZPL2PDF ZPL2Image ZPL2EPL ZPL2FingerPrint ZPL2ESCPOS ZPL2PCL ZPL Docker ZPL Web API

Postman Screenshots

ZPL Commands Sample 1
ZPL Commands Sample 2
ZPL Commands Sample 3
ZPL Commands Sample 4

Features at a Glance

 Convert ZPL to Images & Docs

Use ZPLPrinter Web API for Docker to easily convert ZPL commands to PNG, JPG, PDF, PCX, Zebra GRF ASCII hex, Zebra EPL Binary Graphic, Honeywell-Intermec FingerPrint Binary Graphic, EPSON ESC/POS NV Binary Graphic & HP PCL Binary Graphic formats by writing simple C# or VB.NET code.

 Preview ZPL Commands

Need to test ZPL commands and don't have a real Zebra printer device? No problem! Use ZPLPrinter Web API for Docker to preview ZPL commands without wasting any single label!

 High Accuracy ZPL Render

ZPLPrinter Web API for Docker renders ZPL commands generating high quality output by reproducing built-in and resident ZPL fonts for texts and barcodes with high accuracy.

 ZPL Parsing & Processing

ZPLPrinter Web API for Docker can parse ZPL commands from a .NET string, .NET Stream or physical file. It can detect UTF-8 encoding automatically. Most of the ZPL Formatting and Control Commands are supported.

 International Text Support

ZPLPrinter Web API for Docker can render ZPL commands for international text including Latin, EMEA, Asian and RTL languages like German, French, Italian, Spanish, Portuguese, Swedish, Danish, Polish, Cyrillic, Greek, Chinese, Japanese, Korean, Arabic, Hebrew, and more. Custom Font Files are also supported!

 Barcode Symbologies Support

ZPLPrinter Web API for Docker can generate most of the linear (1D), postal, composite, stacked and 2D barcodes shipped with real Zebra printer devices.

 Colored Label Simulation

ZPLPrinter Web API for Docker can be configured to convert ZPL to PNG, JPG & PDF formats simulating a color ribbon (for label items) and a background color label. Black & White 1bpp is also supported through PCX format.

 Custom ZPL Output Rotation

Besides ZPL rotation command, ZPLPrinter Web API for Docker can be configured to rotate ZPL outputs to 90, 180 & 270 clockwise degrees.

 Custom Background Image

ZPLPrinter Web API for Docker allows you to render ZPL commands on a specified Background Image (in PNG or JPG formats) which can be set from a system file path, URL, Base64 string or a binary buffer (Byte Array).

Overview

Designed by following some of the REST principles, ZPLPrinter Web API for Docker responds to a simple HTTP POST by specifying the ZPL commands and printer settings through a JSON object in the request body, returning the output rendering in the image or document format specified through the Accept header.

Help Doc Topics


Download and run ZPLPrinter Web API for Docker

ZPLPrinter Web API for Docker is available at Docker Hub registry.

  • To pull/download the Docker image, please type the following from a Terminal:

    AMD
    docker pull neodynamic/zplprinterwebapi:5.0.10
    ARM
    docker pull neodynamic/zplprinterwebapi:5.0.10-arm64
  • To run the Docker image, please type the following from a Terminal:

    AMD
    docker run -it --rm -p 8080:80 neodynamic/zplprinterwebapi:5.0.10
    ARM
    docker run -it --rm -p 8080:80 neodynamic/zplprinterwebapi:5.0.10-arm64

Run ZPLPrinter WebAPI on a Custom Port

By default, our Docker image exposes ports 80 and 443 only. If you want to expose and use another different port, then do the following.

  1. Let's suppose you want to use port 12345. Create a new Dockerfile and edit it by pasting the following content:

                                    
    FROM neodynamic/zplprinterwebapi:5.0.10
    EXPOSE 12345
                                    
                                
  2. Save that file and then build it...
    docker build -t neodynamic/my_custom_zplprinterwebapi:5.0.10 .
  3. Now run the new custom Docker image with the following params:
    docker run -it --rm -p 12345:12345 -e "ASPNETCORE_URLS=http://+:12345" neodynamic/my_custom_zplprinterwebapi:5.0.10

How To Use It - Basic Sample

The following source code invokes the ZPLPrinter Web API for Docker to generate a PNG image for the specified ZPL Commands. For more advanced settings please refer to the ZPLPrintJob JSON Object


                    
curl -X POST "http://localhost:8080/ZPLPrinter" \
     -H  "Accept: image/png" \
     -H  "Content-Type: application/json" \
     -d "{\"zplCommands\":\"^XA^FO30,40^ADN,36,20^FDHello World^FS^FO30,80^BY4^B3N,,200^FD12345678^FS^XZ\"}" \
     --output label.png
                        
                

                    
$data = array(
  'zplCommands' => '^XA^FO30,40^ADN,36,20^FDHello World^FS^FO30,80^BY4^B3N,,200^FD12345678^FS^XZ'
);

$options = array(
  'http' => array(
    'method'  => 'POST',
    'content' => json_encode( $data ),
    'header' =>  "Content-Type: application/json\r\n" .
                "Accept: image/png\r\n"
    )
);

$context  = stream_context_create( $options );
$url = 'http://localhost:8080/ZPLPrinter';
$response = file_get_contents( $url, false, $context );
file_put_contents('label.png', $response);
                        
                

                    
require 'net/http'
require 'uri'
require 'json'

uri = URI.parse("http://localhost:8080/ZPLPrinter")

header = {'Accept':'image/png', 'Content-Type': 'application/json'}

data = {zplCommands: '^XA^FO30,40^ADN,36,20^FDHello World^FS^FO30,80^BY4^B3N,,200^FD12345678^FS^XZ'}

http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri, header)
request.body = data.to_json

response = http.request(request)

open('/tmp/label.png', 'wb' ) { |file|
    file.write(response.body)
}
                        
                

                    
import requests
import json

url = "http://localhost:8080/ZPLPrinter"

jsondata = json.dumps( {"zplCommands": "^XA^FO30,40^ADN,36,20^FDHello World^FS^FO30,80^BY4^B3N,,200^FD12345678^FS^XZ"} )

headers = {
    'content-type': "application/json",
    'accept': "image/png"
    }

response = requests.request("POST", url, data=jsondata, headers=headers)

if response.status_code == 200:
    with open("label.png", 'wb') as f:
        f.write(response.content)

                        
                

                    
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $server_endpoint = "http://localhost:8080/ZPLPrinter";
my $req = HTTP::Request->new(POST => $server_endpoint);
$req->header('content-type' => 'application/json');
$req->header('accept' => 'image/png');

my $post_data = '{ "zplCommands" : "^XA^FO30,40^ADN,36,20^FDHello World^FS^FO30,80^BY4^B3N,,200^FD12345678^FS^XZ" }';

$req->content($post_data);

my $resp = $ua->request($req);
open FILEHANDLE, ">label.png";
print FILEHANDLE $resp->{_content};
close FILEHANDLE;
                        
                

                    
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://localhost:8080/ZPLPrinter");
 
String json = "{\"zplCommands\" : \"^XA^FO30,40^ADN,36,20^FDHello World^FS^FO30,80^BY4^B3N,,200^FD12345678^FS^XZ\"}";
StringEntity entity = new StringEntity(json);
httpPost.setEntity(entity);
httpPost.setHeader("Accept", "image/png");
httpPost.setHeader("Content-type", "application/json");
 
CloseableHttpResponse response = client.execute(httpPost);
HttpEntity entity = response.getEntity();
if (entity != null) {
    try (FileOutputStream outstream = new FileOutputStream(new File("label.png"))) {
        entity.writeTo(outstream);
    }
}
client.close();     
                        
                

                    
string DATA = "{\"zplCommands\" : \"^XA^FO30,40^ADN,36,20^FDHello World^FS^FO30,80^BY4^B3N,,200^FD12345678^FS^XZ\"}";

var request = (HttpWebRequest)WebRequest.Create("http://localhost:8080/ZPLPrinter");
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = DATA.Length;
request.Accept = "image/png";

using (var requestWriter = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII)){
    requestWriter.Write(DATA);
}

var webResponse = request.GetResponse();
using (var stream = webResponse.GetResponseStream())
using (var fileStream = File.OpenWrite("label.png"))
{
    var bytes = new byte[4096];
    var read=0;
    do
    {
        if (stream == null) {continue;}
        read = stream.Read(bytes, 0, bytes.Length);
        fileStream.Write(bytes, 0, read);
    } while (read != 0);
}

                        
                

                    
var data = JSON.stringify({
    "zplCommands": "^XA^FO30,40^ADN,36,20^FDHello World^FS^FO30,80^BY4^B3N,,200^FD12345678^FS^XZ"
});

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
    if (this.readyState === 4) {
    console.log(this.responseText);
    }
});

xhr.open("POST", "http://localhost:8080/ZPLPrinter");
xhr.setRequestHeader("content-type", "application/json");
xhr.setRequestHeader("accept", "image/png");

xhr.send(data);
                        
                

                    
var request = require('request');
 
var headers = {
    'Accept': 'image/png',
    'Content-Type': 'application/json'
}
 
var options = {
    url: 'http://localhost:8080/ZPLPrinter',
    method: 'POST',
    headers: headers,
    json: {"zplCommands": "^XA^FO30,40^ADN,36,20^FDHello World^FS^FO30,80^BY4^B3N,,200^FD12345678^FS^XZ"}
}
 
request(options, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body);
    }
})
                        
                

The Accept Header

The desired output rendering format must be specified through the Accept header. The supported formats are the following:

Accept Description
image/png Returns the first rendered label in PNG format. If the specified commands generate more than one label, then you should specify image/png+json or image/png+zip values instead.
image/jpeg Returns the first rendered label in JPEG/JPG format. If the specified commands generate more than one label, then you should specify image/jpeg+json or image/jpeg+zip values instead.
application/pdf Returns all the rendered labels as a single PDF document. The PDF file will contain as many pages as rendered labels.
image/vnd.zbrush.pcx Returns the first rendered label in PCX format. If the specified commands generate more than one label, then you should specify image/vnd.zbrush.pcx+json or image/vnd.zbrush.pcx+zip values instead.
application/vnd.zpl Returns the first rendered label in Zebra GRF ASCII Hex format. If the specified commands generate more than one label, then you should specify application/vnd.zpl+json or application/vnd.zpl+zip values instead.
application/vnd.epl Returns the first rendered label in Zebra EPL Binary Graphic format. If the specified commands generate more than one label, then you should specify application/vnd.zpl+json or application/vnd.zpl+zip values instead.
application/vnd.fingerprint Returns the first rendered label in Honeywell-Intermec FingerPrint Binary format. If the specified commands generate more than one label, then you should specify application/vnd.fingerprint+json or application/vnd.fingerprint+zip values instead.
application/vnd.escpos Returns the first rendered label in EPSON ESC/POS NV Binary format. If the specified commands generate more than one label, then you should specify application/vnd.escpos+json or application/vnd.escpos+zip values instead.
application/vnd.hp-pcl Returns the first rendered label in HP PCL Binary format. If the specified commands generate more than one label, then you should specify application/vnd.hp-pcl+json or application/vnd.hp-pcl+zip values instead.
image/png+json Returns all the rendered labels as a JSON Array containing each label in Base64 PNG Data URI scheme. The returned JSON Object will have this structure: {labels:["data:image/png;base64,<BASE64-STRING>", "data:image/png;base64,<BASE64-STRING>", ... ]}
image/jpeg+json Returns all the rendered labels as a JSON Array containing each label in Base64 JPEG Data URI scheme. The returned JSON Object will have this structure: {labels:["data:image/jpeg;base64,<BASE64-STRING>", "data:image/jpeg;base64,<BASE64-STRING>", ... ]}
application/pdf+json Returns all the rendered labels as a JSON Array containing a single PDF in Base64 Data URI scheme. The PDF file will contain as many pages as rendered labels. The returned JSON Object will have this structure: {labels:["data:application/pdf;base64,<BASE64-STRING>"]}
image/vnd.zbrush.pcx+json Returns all the rendered labels as a JSON Array containing each label in Base64 PCX Data URI scheme. {labels:["data:image/vnd.zbrush.pcx;base64,<BASE64-STRING>", "data:image/vnd.zbrush.pcx;base64,<BASE64-STRING>", ... ]}
application/vnd.zpl+json Returns all the rendered labels as a JSON Array containing each label in Base64 Zebra GRF ASCII Hex Data URI scheme. The returned JSON Object will have this structure: {labels:["data:application/vnd.zpl;base64,<BASE64-STRING>", "data:application/vnd.zpl;base64,<BASE64-STRING>", ... ]}
application/vnd.epl+json Returns all the rendered labels as a JSON Array containing each label in Base64 Zebra EPL Binary Graphic Data URI scheme. The returned JSON Object will have this structure: {labels:["data:application/vnd.epl;base64,<BASE64-STRING>", "data:application/vnd.epl;base64,<BASE64-STRING>", ... ]}
application/vnd.fingerprint+json Returns all the rendered labels as a JSON Array containing each label in Base64 Honeywell-Intermec FingerPrint Binary Data URI scheme. The returned JSON Object will have this structure: {labels:["data:application/vnd.fingerprint;base64,<BASE64-STRING>", "data:application/vnd.fingerprint;base64,<BASE64-STRING>", ... ]}
application/vnd.escpos+json Returns all the rendered labels as a JSON Array containing each label in Base64 EPSON ESC/POS NV Binary Data URI scheme. The returned JSON Object will have this structure: {labels:["data:application/vnd.escpos;base64,<BASE64-STRING>", "data:application/vnd.escpos;base64,<BASE64-STRING>", ... ]}
application/vnd.hp-pcl+json Returns all the rendered labels as a JSON Array containing each label in Base64 HP PCL Binary Data URI scheme. The returned JSON Object will have this structure: {labels:["data:application/vnd.hp-pcl;base64,<BASE64-STRING>", "data:application/vnd.hp-pcl;base64,<BASE64-STRING>", ... ]}
image/png+zip Returns all the rendered labels as a ZIP file containing each label in PNG format. Each file name is named to Label_01.png, Label_02.png, etc.
image/jpeg+zip Returns all the rendered labels as a ZIP file containing each label in JPEG/JPG format. Each file name is named to Label_01.jpg, Label_02.jpg, etc.
application/pdf+zip Returns all the rendered labels as a ZIP file containing a single PDF. The PDF file will contain as many pages as rendered labels. Label_01.pdf
image/vnd.zbrush.pcx+zip Returns all the rendered labels as a ZIP file containing each label in PCX format. Each file name is named to Label_01.pcx, Label_02.pcx, etc.
application/vnd.zpl+zip Returns all the rendered labels as a ZIP file containing each label in Zebra GRF ASCII Hex format. Each file name is named to Label_01.grf, Label_02.grf, etc.
application/vnd.epl+zip Returns all the rendered labels as a ZIP file containing each label in Zebra EPL Binary Graphic format. Each file name is named to Label_01.epl, Label_02.epl, etc.
application/vnd.fingerprint+zip Returns all the rendered labels as a ZIP file containing each label in Honeywell-Intermec FingerPrint Binary format. Each file name is named to Label_01.fp, Label_02.fp, etc.
application/vnd.escpos+zip Returns all the rendered labels as a ZIP file containing each label in EPSON ESC/POS NV Binary format. Each file name is named to Label_01.nv, Label_02.nv, etc.
application/vnd.hp-pcl+zip Returns all the rendered labels as a ZIP file containing each label in HP PCL Binary format. Each file name is named to Label_01.pcl, Label_02.pcl, etc.

Web API Doc


ZPL Commands Support

ZPLPrinter Web API for Docker supports most of the ZPL formatting and control commands. The following table lists the supported commands as well as the ones which are under work. Not listed or unsupported commands will be skipped in the parsing stage.

IMPORTANT NOTE
Barcode symbols, particularly 2D-type like QR Code, Data Matrix, Aztec Code, Maxicode..., might look different to the one printed by a real printer because ZPLPrinter Web API for Docker leverages on its own barcode encoder. However, this does not mean that the rendered barcodes will not be readable at all.
Status ZPL Command Comments
^A Scalable/Bitmapped Font
^A@ Use Font Name to Call Font.FNT extension is not supported
^B0 Aztec Bar Code ParametersECICs and Structured Appended format are not supported
^B1 Code 11 Bar Code
^B2 Interleaved 2 of 5 Bar Code
^B3 Code 39 Bar Code
^B4 Code 49Starting mode is not supported
^B5 Planet Code bar code
^B7 PDF417 Bar Code
^B8 EAN-8 Bar Code
^B9 UPC-E Bar Code
^BA Code 93 Bar Code
^BB CodablockCodablock-F supported only
^BC Code 128 Bar Code (Subsets A, B, and C)
^BD UPS MaxiCode Bar Code
^BE EAN-13 Bar Code
^BF MicroPDF417 Bar Code
^BI Industrial 2 of 5 Bar Codes
^BJ Standard 2 of 5 Bar Code
^BK ANSI Codabar Bar Code
^BL LOGMARS Bar Code
^BM MSI Bar Code
^BO Aztec Bar Code ParametersECICs and Structured Appended format are not supported
^BP Plessey Bar Code
^BQ QR Code Bar CodeModel 1 and Data Encoding Switches are not supported
^BR GS1 Databar
^BS UPC/EAN Extensions
^BT TLC39
^BU UPC-A Bar Code
^BX Data Matrix Bar CodeQuality Level < 200 is not supported
^BY Bar Code Field Default
^BZ POSTAL Bar Code
^CC Change Caret
^CD Change Delimiter
^CF Change Alphanumeric Default Font
^CI Change International Font/EncodingCharacter remapping is not supported
^CT Change Tilde
^CW Font Identifier
~DB Download Bitmap Font
^DF Download Format
~DG Download Graphics
~DU Download Unbounded TrueType Font
~DY Download ObjectsAR-compressed format and bitmap, .pcx, .nrd, .pac, .wml, .htm, .get extensions are not supported
~EG Erase Download Graphics
^FA Field Allocate
^FB Field Block
^FC Field Clock
^FD Field Data
^FH Field Hexadecimal Indicator
^FM Multiple Field Origin Locations
^FN Field Number
^FO Field Origin
^FP Field Parameter
^FR Field Reverse Print
^FS Field Separator
^FT Field Typeset
^FV Field Variable
^FW Field Orientation
^FX Comment
^GB Graphic Box
^GC Graphic Circle
^GD Graphic Diagonal Line
^GE Graphic Ellipse
^GF Graphic Field
^GS Graphic Symbol
^ID Object Delete
^IL Image Load
^IM Image Move
^IS Image Save
~JR Power On Reset
^LH Label Home
^LL Label Length
^LR Label Reverse Print
^LS Label Shift
^LT Label Top
^MC Map Clear
^MU Set Units of Measurement
^PA Advanced Text Properties
^PM Printing Mirror Image of Label
^PO Print Orientation
^PQ Print Quantity
^PW Print Width
^RF Read or Write RFID FormatOnly Write mode is supported
^RQ Quick Write EPC Data and Passwords
^SF Serialization Field
^SL Set Mode and Language (for Real-Time Clock)
^SN Serialization Data
^SO Set Offset (for Real-Time Clock)
^ST Set Date and Time (for Real-Time Clock)
^TB Text Blocks
^TO Transfer Object
~WC Print Configuration Label
^XA Start Format
^XF Recall Format
^XG Recall Graphic
^XZ End Format
^WF Encode AFI or DSFID Byte
^WT Write (Encode) Tag

Licensing

On-Premise - Full Deployment Control

ZPLPrinter Web API is licensed for Private On-Premise environments giving you full control on the infrastructure where our product will run on. Please refer to Licensing model and prices...

 License Registration

When you buy a commercial license of ZPLPrinter Web API for Docker, you are provided with license information (LicenseOwner & LicenseKey) to register the product. The license information must be specified to the Docker image as environment variables as folows:

AMD
docker run -it --rm -e "LICENSE_OWNER=YOUR-COMPANY-NAME" -e "LICENSE_KEY=YOUR_KEY" -p 8080:80 neodynamic/zplprinterwebapi:5.0.10
ARM
docker run -it --rm -e "LICENSE_OWNER=YOUR-COMPANY-NAME" -e "LICENSE_KEY=YOUR_KEY" -p 8080:80 neodynamic/zplprinterwebapi:5.0.10-arm64

 Evaluation Mode

The Trial Version of ZPLPrinter Web API for Docker is fully functional and has no expiry date. However, while in TRIAL mode, the output rendering has the following limitations:


  • Any text that uses the Resident fonts (i.e. font names A, B, C, D, E, F, G, GS, H, 0-zero, P, Q, R, S, T U, V and TT0003M_) any chars which byte value is greater than dec 127 (hex 7F) will be replaced by an X. If you want to see how a text will look like before purchasing a license then contact our support team.
  • A TRIAL stamp will be rendered at the top of the rendering output.

 Change Log

  • 5.0.10 2024-11-13
    • Fixed! ^FM command handling.

  • 5.0.9 2024-09-11
    • Fixed! Text offset for ^FB command when center text alignment is specified.
    • Fixed! Text overlap for ^FB command.

  • 5.0.8 2024-08-01
    • Fixed! Use QR Code ECC M if it is not specified by the ^BQ command.

  • 5.0.7 2024-05-31
    • Fixed! ^BC command with UCC check digit enabled but invalid data to encode was not rendered.

  • 5.0.6 2024-04-26
    • Fixed! ^GF command ASCII encoding when parsing non well formatted image data.

  • 5.0.5 2024-04-24
    • Fixed! Added HTTP Response Headers for security.

  • 5.0.4 2024-03-04
    • Fixed! ^BC command was not rendered under some special cases.

  • 5.0.3 2024-03-01
    • Fixed! ^BC command (Code 128 CharSet C) was not rendered under some special cases.

  • 5.0.2 2024-01-02
    • New! Added Rotation, Justification and IsReverse props for rendered ZPLElement.
    • Fixed! ^CF command should set the default font size even if the specified font does not exist.

  • 5.0.1 2023-11-23
    • Fixed! Text size and location rendering.

  • 5.0 2023-11-20
    • New! Added XML-Enabled ZPL Formats support.
    • New! Added HP PCL Binary output format rendering. This allows converting ZPL commands to HP PCL graphic format.
    • New! Added EnableGraphicsCache prop to allow the ^GF commands output rendering to be cached.
    • New! Added EnablePrinting prop to format the output rendering commands for printing scenarios.
    • Improved! ^BR command rendering when DataBar Expanded is specified.
    • Improved! EAN / UPC barcode commands rendering.

  • 4.0.8 2023-11-13
    • Fixed! Field Hexadecimal Indicator processing.

  • 4.0.7 2023-08-30
    • Fixed! ISO-8859-2 Latin-2 Eastern European missing chars when ZPL Font 0 is specified.

  • 4.0.6 2023-08-07
    • Fixed! Text vertical offset under some specific scenarios.

  • 4.0.5 2023-07-03
    • Fixed! ^BC custom font size settings.
    • Fixed! Text field rotation when CF is involved.

  • 4.0.4 2023-05-24
    • Fixed! Rendering location vertical offset for Linear 1D barcode 180 degrees rotation.

  • 4.0.3 2023-05-10
    • Fixed! Code 128 barcode rendering.

  • 4.0.2 2023-03-28
    • Fixed! Human readable text scaling for ^BC command.
    • Improved! PDF generation performance.

  • 4.0.1 2023-03-22
    • Fixed! Applied search priority on the different internal drives for ^XG, ^IM and ^XF commands.

  • 4.0 2023-03-09
    • New! Added support for ~DB (Download Bitmap Font) command.
    • New! Added invertColors property to reverse the pixel colors of the output image.
    • New! Added compressionQuality property to specify the compression quality level of the output image (JPG/JPEG format only).
    • New! Added traceRenderedElements property. It will return the list of ZPL commands that are rendered including the location and size. Available for JSON outputs only.
    • New! Automatic PNG output optimization reducing the file/stream size.
    • New! Added support for ^BQ command's Mask parameter.

  • 3.0.20 2023-02-22
    • Fixed! Y-offset when text contains acute accent.
    • Fixed! Y-offset when barcode human readable text is empty.
    • Fixed! ^BC data encoding.

  • 3.0.19 2023-01-17
    • Fixed! Text block size which affected text alignment.

  • 3.0.18 2022-12-30
    • Fixed! Big numbers parsing under counters scenarios.
    • Fixed! Rendering logic when ^FN, ^SN or ^SF are involved in the same label format.
    • Fixed! Many font size rendering releated issues.

  • 3.0.17 2022-12-20
    • Fixed! Spaces in some ZPL commands params might invalidate the parsing.
    • Fixed! Ignore dashes when GS1 128 with AI (00) is encoded.
    • Fixed! GS1-128 (UCC/EAN-128) human readable text font type.
    • Fixed! Default font size specified through ^CF command was ignored.
    • Fixed! Barcode rotation for ^BC command when a custom font setting is specified.

  • 3.0.16 2022-12-06
    • New! Support for ^BC command with custom font settings.
    • Fixed! ^BC command data parsing.
    • Fixed! ^SN command which ignored any content other than digits.

  • 3.0.15 2022-10-27
    • Fixed! ^FN command was not correctly handled.
    • Fixed! EAN/UPC barcode rendering location.
    • Fixed! ^FB text offset when bitmap resident font is used.

  • 3.0.14 2022-10-10
    • Fixed! Allow Base64 images with invalid padding.
    • Fixed! ^FT horizontal offset for ^FB text block when using `R` rotation param in ^A command.

  • 3.0.13 2022-09-21
    • Fixed! CRC calc and validation when Z64 image format is specified.

  • 3.0.12 2022-08-31
    • Fixed! Field text block rendering location when rotating 90 and 270 degrees.
    • Fixed! ^FO, ^FT, ^FW commands when specifying right alignment.
    • Fixed! Print orientation command rotates labels incorrectly.
    • Fixed! ^ST invalid date handling.

  • 3.0.11 2022-07-22
    • Fixed! font height issue in some special cases

  • 3.0.10 2022-07-04
    • Fixed! ^A command offset rendering location

  • 3.0.9 2022-06-27
    • Fixed! ^FB rotated size and rendering location.
    • Fixed! ^FO and ^FT negative invalid X & Y param values.

  • 3.0.8 2022-06-24
    • Fixed! Maxicode rendering location.

  • 3.0.7 2022-06-01
    • Fixed! Aztec Code and QR Code module size range validation.
    • Fixed! Honoring the Zebra bug "^BY Command Parameter Causes a Position Shift of the QR Code Barcode".

  • 3.0.6 2022-05-12
    • New! Added support for ^FA Field Allocate command.
    • Fixed! ^FB text rendering and params values range validation when parsing.

  • 3.0.5 2022-04-20
    • Fixed! ^SN default value parsing.
    • Fixed! Font D & A vertical offset for text boxes commands.

  • 3.0.4 2022-03-18
    • Fixed! ^BC barcode rendering. Space char was not ignored when `D` mode was specified.

  • 3.0.3 2022-03-11
    • CRITICAL Fixed! QR Code Auto Encoding - Wrong Numeric Data Bits calculation.
    • Fixed! Aztec Code runes encoding.

  • 3.0.2 2022-03-07
    • Fixed! ^BX Data Matrix text encoding.

  • 3.0.1 2022-03-02
    • Fixed! At sign glyph size of Font 0.
    • Fixed! ^GB command rendering when stroke thickness is bigger than available rect size.
    • Fixed! Text offset when chars scaling is involved.

  • 3.0 2022-02-15
    • New! Support for ^FM Multiple Field Origin Locations command.
    • New! Support for ^FC Field Clock command.
    • New! Support for ^SL Set Mode and Language (for Real-Time Clock) command.
    • New! Support for ^SO Set Offset (for Real-Time Clock) command.
    • New! Support for ^ST Set Date and Time (for Real-Time Clock) command.
    • New! Added Zebra EPL Binary output format rendering. This allows converting ZPL commands to Zebra's EPL graphic format.
    • New! Added Honeywell-Intermec FingerPrint Binary output format rendering. This allows converting ZPL commands to FingerPrint graphic format.
    • New! Added EPSON ESC/POS NV Binary output format rendering. This allows converting ZPL commands to ESC/POS graphic format.
    • Improved! QR Code Auto Encoding.

  • 2.0.32 2022-02-03
    • Fixed! ^FO right justification param value was ignored.

  • 2.0.31 2022-01-24
    • Fixed! Font scaling when resident scalable fonts are involved.
    • Fixed! Font scaling for rotated text.

  • 2.0.30 2021-12-23
    • Fixed! Handled invalid graphic extension for ^XG and ^IL commands.
    • Fixed! Graphic rendering location when ^FT command is used.
    • Fixed! Text rendering offset when rotation is specified in the ^A command.
    • Fixed! Barcode not rendered when '00' is the application identifier and data to encode has 20 digits.

  • 2.0.29 2021-11-13
    • Fixed! Offset text location for ^FB and ^A commands when using Button Up orientation.
    • Fixed! ^BY wide bar to narrow bar width ratio.

  • 2.0.28 2021-10-31
    • Fixed! Offset text location for ^FB command when using Button Up orientation.

  • 2.0.27 2021-10-14
    • Fixed! ^BY param validation for wide bar to narrow bar width ratio.

  • 2.0.26 2021-10-01
    • Fixed! ^FN commands was not handled if they were inside a format without using ^DF and ^XF commands.
    • Fixed! Better support for commands that are not specified in the expected order.
    • Fixed! Resident scalable font size rendering when Height and Width params are the same.
    • Fixed! Justification param parsing for ^FO, ^FT, and ^FW commands.
    • Fixed! Invalid rotation param in ^FW command.
    • Fixed! Removed leading and trailing spaces for each text lines when rendering ^FB command.

  • 2.0.25 2021-09-22
    • Fixed! QR Code was not rendered due to the previous update.

  • 2.0.24 2021-09-15
    • Fixed! Auto encoding of UTF-8 (Unicode) text into QR Code.

  • 2.0.23 2021-09-06
    • Fixed! Linear barcode bar ratio parsing.

  • 2.0.22 2021-08-13
    • Fixed! Text fitting inside text boxes.
    • Fixed! Horizontal offset for rotated text.

  • 2.0.21 2021-08-12
    • Fixed! Disabled adding hyphen/dash char when word wrapping needs to be applied.
    • Fixed! Ignore invalid QR Code Mode param.

  • 2.0.20 2021-08-11
    • New! Added Metrics endpoint /metrics
    • Fixed! Offset text location for some special cases.
    • Fixed! Escaped breakline for text boxes was not handled correctly.
    • Fixed! Line spacing for bitmap resident fonts in text boxes.
    • Fixed! Font scaling in text boxes.
    • Fixed! Breaklines were ignored if they were separated by empty strings in text boxes.

  • 2.0.19 2021-08-09
    • Fixed! Text size when specifying scalable font with same Width and Height.
    • Fixed! Handling case senstive fonts and graphics name.
    • Fixed! PDF417 aspect ratio when no columns nor rows are specified.

  • 2.0.18 2021-07-28
    • Fixed! Removed background color in barcodes.

  • 2.0.17 2021-07-27
    • Fixed! ^BQ QR Code offset rendering location.

  • 2.0.16 2021-07-20
    • Fixed! ^BC data encoding when certain Code 128 invocation characters are specified.

  • 2.0.15 2021-07-06
    • Fixed! Empty ^FD command was invalidating the next rendering command if any.

  • 2.0.14 2021-06-02
    • Fixed! Barcode location when rotated orientation (clockwise 90 degrees) is specified.
    • Fixed! Rect rounded corner was not rendered if specified.
    • Fixed! Field Orientation auto-justification param.

  • 2.0.13 2021-04-14
    • Fixed! Bug in graphic-related commands.
    • Fixed! Bug when parsing invalid chars in ^FD command.

  • 2.0.12 2021-03-31
    • Fixed! Added some missing Latin1 chars to Resident Font D.

  • 2.0.11 2021-03-11
    • Fixed! ^LL param value less than 832 dots was ignored.
    • Fixed! Shapes were not rendered if stroke thickness param was zero.

  • 2.0.10 2021-03-10
    • Fixed! Support for CORS.

  • 2.0.9 2021-03-06
    • New! Added Health Check endpoint /health
    • Fixed! DataMatrix automatic Unicode chars encoding.
    • Fixed! DataMatrix rotation.
    • Fixed! Code 39 auto upper-case conversion.
    • Fixed! Skip invalid Code 128 encoding chars.
    • Fixed! Resident scalable fonts stretching.
    • Fixed! Text location with Rotated and Bottom Up orientations.
    • Fixed! Image/Graphic location when ^FT command is involved.
    • Fixed! Multiline text rendering for ^FB & ^TB commands.
    • Fixed! ^GB, ^GC, ^GE, ^GD param validation and default values.
    • Fixed! ^CW not taken effect with cached fonts.

  • 2.0.8 2021-02-20
    • Fixed! Field reverse was not working as expected when data field was empty.

  • 2.0.7 2021-02-15
    • Fixed! Bug when text wrapping is required.

  • 2.0.6 2021-02-10
    • Fixed! Default value params where not used for invalid or out of range values.

  • 2.0.5 2021-02-09
    • Fixed! CRC validation for graphic commands.

  • 2.0.4 2021-02-05
    • Fixed! Horizontal Tab char was ignored when parsing.

  • 2.0.3 2021-01-30
  • 2.0.2 2020-12-09
    • Fixed! Text rendering location for some special cases.
    • Fixed! Barcode default boolean values parsing.

  • 2.0.1 2020-12-04
    • Fixed! CRC validation for PNG Base64 image encoding.

  • 2.0 2020-12-02
    • New! Support for ^SF Serialization Field command.
    • New! Support for ^SN Serialization Data command supporting replication copies.
    • New! Support for ^PQ Print Quantity command.
    • New! Support for ^TO Transfer Object command.
    • New! Support for ^BT TLC-39 Barcode command.
    • New! Support for ^BB Codablock Barcode command.
    • New! Support for ^B4 Code 49 Barcode command.
    • New! Support for drawing RFID image on labels where ^RF, ^RQ, ^WF, or ^WT commands might be present. It can be disable through the drawRFID property.
    • New! Added support for watermark image (in PNG or JPG formats) through the watermarkImageBase64 and watermarkOpacity properties.
    • Improved! RTL text rendering when mixed with non-RTL text.

  • 1.5.17 2020-11-27
    • Fixed! ^CF command was not correctly parsed.

  • 1.5.16 2020-10-23
    • Fixed! GS1-128 (UCC/EAN-128) barcodes rendered as Code128 instead.

  • 1.5.15 2020-10-20
    • Fixed! ^BY command when issued more than once inside a single label.
    • Fixed! ^LL command when issued more than once inside a single label.
    • Fixed! ^BC command does not render barcode is missing start subset is missing.
    • Fixed! ^GF & ^DY parsing when binary data is specified.

  • 1.5.14 2020-10-08
    • Fixed! In some cases, text being cut off under Linux.
    • Improved! Ignore invalid command prefix char (caret by default) duplication.

  • 1.5.13 2020-09-16
    • Fixed! Allowed invalid ^A command params where orientation value is not appended to the font name.

  • 1.5.12 2020-09-15
    • Fixed! Error "Index was outside the bounds of the array" when processing ^GF command.

  • 1.5.11 2020-09-14
    • Fixed! Auto-convert invalid negative number when parsing command params.

  • 1.5.10 2020-09-05
    • Fixed! Concurrency issue - Error: An item with the same key has already been added.

  • 1.5.9 2020-08-28
    • Fixed! Blank label is generated when no printable commands are present.
    • Fixed! ^DF and ^XF commands were not correctly processed.

  • 1.5.8 2020-08-25
    • Fixed! Wrong dash char in Font 0

  • 1.5.7 2020-08-24
    • Fixed! ^FT command was not correctly handled when X or Y param is zero.

  • 1.5.6 2020-08-21
    • Fixed! System.NullReferenceException when PDF output rendering is specified.

  • 1.5.5 2020-08-20
    • Fixed! Font rendering issues.

  • 1.5.4 2020-08-19
    • New! Added forceLabelWidth & forceLabelHeight settings that when true, the ^PW and ^LL commands are ignored and the LabelWidth and LabelHeight properties values are used instead.
    • Fixed! Wrong char substitution when a scalable font is involved.
    • Improved! Memory usage management.

  • 1.5.3 2020-08-17
    • Fixed! Shapes like Rects were not correctly rendered when FT location command was involved.
    • Fixed! Data-related commands param was trimmed ignoring any existing leading and trailing spaces.

  • 1.5.2 2020-06-10
    • Fixed! Trimming commands' params to avoid invalid parsing.

  • 1.5.1 2020-04-13
    • Fixed! Some ^CI encodings were not correctly handled.
    • Fixed! Wrong data encoding for EAN & UPC barcodes.
    • Fixed! Wrong rendering position for rotated EAN & UPC barcodes.
    • Improved! MaxiCode barcode rendering for 8dpmm (203dpi) and 12dpmm (300dpi) resolutions.

  • 1.5 2020-04-03
    • Fixed! Bug in integer command parameters parsing when decimal point is found.
    • Fixed! Case-sensitive resource names involving fonts, graphics/images and formats.

  • 1.4 2020-04-01
    • Fixed! Bug when parsing ~DG command containing graphic in ASCII format.
    • Fixed! Bug when parsing ~DU command.
    • Fixed! Font name resolving when no file extension is provided to ^A@ command.

  • 1.3 2020-03-10
    • Fixed! Added missing Turkish chars to ZPL Font 0.
    • Fixed! Barcode with human readable text at the bottom was not correctly rendered when ^FT command is involved.
    • Fixed! UPS MaxiCode barcode rendered size.
    • Fixed! Backslash char (Hex 5C) mapped to the correct char depending on ^CI encoding.
    • Fixed! In some cases, Aztec Code barcode symbol is not fully rendered.

  • 1.2 2020-03-03
    • Fixed! ^CC, ^CT and ^CD commands were not correctly handled.
    • Fixed! Applied filter to numeric based barcodes to ignore invalid data.

  • 1.1 2020-02-06
    • Fixed! Codabar (^BK) data encoding.
    • Fixed! Wrong text rendering when specifying right text alignment for Field Block (^FB).

  • 1.0 2020-01-21
    • New! Initial release.