EPLPrinter Web API for Docker

Self-hosted REST API to Convert EPL
to PDF, PNG, ZPL & more!


  Download   Buy

Key Features

  Convert raw EPL to PDF, PNG, JPG, PCX, ZPL (GRF) & PCL
  Preview EPL commands without wasting real labels!
  High Quality & Accuracy EPL Rendering
  EPL Parsing from Raw & Base64 Strings
  Full Barcodes Support
  Docker image for amd64 & arm64, any language via HTTP

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

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

EPLPrinter Web API for Docker allows you to Convert, Preview and Render raw EPL (Zebra/Eltron 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, HP PCL Binary Graphic & EPSON ESC/POS NV Binary Graphic from Any Development Platform and Programming Languages (.NET, Java, PHP, Javascript, Python, Ruby, and more!) with a single HTTP POST.

It ships as a Linux Docker image for amd64 and arm64 that you run on your own servers, Kubernetes cluster or cloud account, so your EPL and label data never leave your infrastructure. It can also convert EPL to ZPL so legacy EPL applications keep printing on ZPL-only Zebra printers. If you prefer an in-process library for .NET, see the EPLPrinter Emulator SDK for .NET.

EPL Virtual Printer EPL Viewer EPL Parser EPL Converter EPL Emulator EPL2PNG EPL2JPG EPL2PCX EPL2GRF EPL2PDF EPL2Image EPL2EPL EPL2FingerPrint EPL2ESCPOS EPL2PCL EPL2ZPL EPL Docker EPL Web API

Quick Start: EPL to PDF in 2 Commands

1. Run the container

docker run -d -p 8080:8080 neodynamic/eplprinterwebapi:3.0.6

# ARM64
docker run -d -p 8080:8080 neodynamic/eplprinterwebapi:3.0.6-arm64

2. POST your EPL, get a PDF

curl -X POST "http://localhost:8080/EPLPrinter" \
     -H "Content-Type: application/json" \
     -H "Accept: application/pdf" \
     -d '{"eplCommands":"N\nq609\nQ203,26\nB26,26,0,UA0,2,2,152,B,\"603679025109\"\nA253,26,0,3,1,1,N,\"SKU 6205518 MFG 6354\"\nP1\n","dpi":203}' \
     --output label.pdf

Change the Accept header to image/png, image/jpeg, application/vnd.zpl, application/vnd.hp-pcl... to get other formats. See samples in Python, Node.js, Java, PHP, C# and more.

Convert EPL to ZPL for ZPL-only Printers

Replacing old EPL printers (like the Zebra/Eltron LP/TLP 2844 series) with ZPL-only models? Request Accept: application/vnd.zpl with "enablePrinting": true and the API returns the label as a ZPL graphic (GRF) ready to send to the printer, so the application that generates the EPL does not need to change. The same works for Honeywell FingerPrint (application/vnd.fingerprint), EPSON ESC/POS (application/vnd.escpos) and HP PCL laser printers (application/vnd.hp-pcl).

curl -X POST "http://localhost:8080/EPLPrinter" \
     -H "Content-Type: application/json" \
     -H "Accept: application/vnd.zpl" \
     -d '{"eplCommands":"N\nq609\nQ203,26\nA253,26,0,3,1,1,N,\"SKU 6205518\"\nP1\n","enablePrinting":true}' \
     --output label.zpl

# send it raw to the ZPL printer (port 9100)
nc 192.168.1.50 9100 < label.zpl

Postman Screenshots

EPL Commands Sample 1
EPL Commands Sample 2
EPL Commands Sample 3

Features at a Glance

 Convert EPL to Images & Docs

Use EPLPrinter Web API for Docker to easily convert EPL commands to PNG, JPG, PDF, PCX, Zebra GRF ASCII hex, Zebra EPL Binary Graphic, Honeywell-Intermec FingerPrint Binary Graphic, HP PCL Binary Graphic & EPSON ESC/POS NV Binary Graphic formats with a single HTTP POST from any programming language.

 Preview EPL Commands

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

 High Accuracy EPL Render

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

 EPL Parsing & Processing

EPLPrinter Web API for Docker receives the EPL commands in the JSON request body as a plain string or as Base64 (useful for commands with non-printable chars, like GW graphics), with a configurable code page / encoding (default 850). Most of the EPL Formatting and Control Commands are supported.

 Barcode Symbologies Support

EPLPrinter 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

EPLPrinter Web API for Docker can be configured to convert EPL 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 EPL Output Rotation

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

 Custom Background Image

EPLPrinter Web API for Docker allows you to render EPL commands on a specified Background Image (in PNG or JPG formats) sent as a Base64 string in the request.

 Watermark & Thumbnails

Stamp a custom watermark image with adjustable opacity on top of the label, and generate thumbnails of the output by specifying their size in pixels.

 Real-Time Clock Commands

The TS (set clock), TD (date) and TT (time) commands are supported, so date and time fields render as on a real printer.

 Rendered Elements Tracing

With JSON output and traceRenderedElements, get the list of rendered EPL elements with their position and size, useful for post-processing.


Download and run EPLPrinter Web API for Docker

EPLPrinter 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/eplprinterwebapi:3.0.6
    ARM
    docker pull neodynamic/eplprinterwebapi:3.0.6-arm64
  • To run the Docker image, please type the following from a Terminal:

    AMD
    docker run -it --rm -p 8080:8080 neodynamic/eplprinterwebapi:3.0.6
    ARM
    docker run -it --rm -p 8080:8080 neodynamic/eplprinterwebapi:3.0.6-arm64

    Special Parameters

    • Auto HTTPS Redirection: By default, HTTPS redirection is enabled. It can be disabled by specifying the following parameter -e "USE_HTTPS_REDIRECTION=false"
    • Swagger UI: By default, Swagger UI is enabled. It can be disabled by specifying the following parameter -e "SWAGGER_UI_ENABLED=false"

Run EPLPrinter WebAPI on a Custom Port

By default, our Docker image exposes port 8080 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, then run the docker image with the following parameters:

    AMD
    docker run -it --rm -p 8080:12345 neodynamic/eplprinterwebapi:3.0.6 -e ASPNETCORE_HTTP_PORTS=12345
    ARM
    docker run -it --rm -p 8080:12345 neodynamic/eplprinterwebapi:3.0.6-arm64 -e ASPNETCORE_HTTP_PORTS=12345
  2. Special case for port 80: If you need to use port 80, then run the docker image with the following parameters:

    AMD
    docker run -it --rm -p 8080:80 neodynamic/eplprinterwebapi:3.0.6 -u root -e ASPNETCORE_HTTP_PORTS=80
    ARM
    docker run -it --rm -p 8080:80 neodynamic/eplprinterwebapi:3.0.6-arm64 -u root -e ASPNETCORE_HTTP_PORTS=80

How To Use It - Basic Sample

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


                    
curl -X POST "http://localhost:8080/EPLPrinter" \
     -H "Accept: image/png" \
     -H "Content-Type: application/json" \
     -d '{"eplCommands":"N\r\nq609\r\nQ203,26\r\nB26,26,0,UA0,2,2,152,B,\"603679025109\"\r\nA253,26,0,3,1,1,N,\"SKU 6205518 MFG 6354\"\r\nA253,56,0,3,1,1,N,\"2XIST TROPICAL BEACH\"\r\nA253,86,0,3,1,1,N,\"STRIPE SQUARE CUT TRUNK\"\r\nA253,116,0,3,1,1,N,\"BRICK\"\r\nA253,146,0,3,1,1,N,\"X-LARGE\"\r\nP1\r\n"}' \
     --output label.png
                        
                

                    
$epl = "N\r\nq609\r\nQ203,26\r\nB26,26,0,UA0,2,2,152,B,\"603679025109\"\r\nA253,26,0,3,1,1,N,\"SKU 6205518 MFG 6354\"\r\nA253,56,0,3,1,1,N,\"2XIST TROPICAL BEACH\"\r\nA253,86,0,3,1,1,N,\"STRIPE SQUARE CUT TRUNK\"\r\nA253,116,0,3,1,1,N,\"BRICK\"\r\nA253,146,0,3,1,1,N,\"X-LARGE\"\r\nP1\r\n";

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

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

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

uri = URI.parse("http://localhost:8080/EPLPrinter")
header = {'Accept' => 'image/png', 'Content-Type' => 'application/json'}

epl = "N\r\nq609\r\nQ203,26\r\nB26,26,0,UA0,2,2,152,B,\"603679025109\"\r\nA253,26,0,3,1,1,N,\"SKU 6205518 MFG 6354\"\r\nA253,56,0,3,1,1,N,\"2XIST TROPICAL BEACH\"\r\nA253,86,0,3,1,1,N,\"STRIPE SQUARE CUT TRUNK\"\r\nA253,116,0,3,1,1,N,\"BRICK\"\r\nA253,146,0,3,1,1,N,\"X-LARGE\"\r\nP1\r\n"

http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri, header)
request.body = {eplCommands: epl}.to_json

response = http.request(request)
File.binwrite('label.png', response.body)
                        
                

                    
import requests

epl = "N\r\nq609\r\nQ203,26\r\nB26,26,0,UA0,2,2,152,B,\"603679025109\"\r\nA253,26,0,3,1,1,N,\"SKU 6205518 MFG 6354\"\r\nA253,56,0,3,1,1,N,\"2XIST TROPICAL BEACH\"\r\nA253,86,0,3,1,1,N,\"STRIPE SQUARE CUT TRUNK\"\r\nA253,116,0,3,1,1,N,\"BRICK\"\r\nA253,146,0,3,1,1,N,\"X-LARGE\"\r\nP1\r\n"

response = requests.post(
    "http://localhost:8080/EPLPrinter",
    json={"eplCommands": epl},
    headers={"Accept": "image/png"}
)

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

                    
use LWP::UserAgent;
use JSON::PP;

my $epl = "N\r\nq609\r\nQ203,26\r\nB26,26,0,UA0,2,2,152,B,\"603679025109\"\r\nA253,26,0,3,1,1,N,\"SKU 6205518 MFG 6354\"\r\nA253,56,0,3,1,1,N,\"2XIST TROPICAL BEACH\"\r\nA253,86,0,3,1,1,N,\"STRIPE SQUARE CUT TRUNK\"\r\nA253,116,0,3,1,1,N,\"BRICK\"\r\nA253,146,0,3,1,1,N,\"X-LARGE\"\r\nP1\r\n";

my $ua  = LWP::UserAgent->new;
my $req = HTTP::Request->new(POST => "http://localhost:8080/EPLPrinter");
$req->header('Content-Type' => 'application/json');
$req->header('Accept' => 'image/png');
$req->content(encode_json({ eplCommands => $epl }));

my $resp = $ua->request($req);
open(my $fh, '>:raw', 'label.png');
print $fh $resp->content;
close($fh);
                        
                

                    
// EPL escaped for JSON by hand (no extra dependencies): \r\n and \" stay escaped inside the JSON string
String json = "{\"eplCommands\":\"N\\r\\nq609\\r\\nQ203,26\\r\\nB26,26,0,UA0,2,2,152,B,\\\"603679025109\\\"\\r\\nA253,26,0,3,1,1,N,\\\"SKU 6205518 MFG 6354\\\"\\r\\nA253,56,0,3,1,1,N,\\\"2XIST TROPICAL BEACH\\\"\\r\\nA253,86,0,3,1,1,N,\\\"STRIPE SQUARE CUT TRUNK\\\"\\r\\nA253,116,0,3,1,1,N,\\\"BRICK\\\"\\r\\nA253,146,0,3,1,1,N,\\\"X-LARGE\\\"\\r\\nP1\\r\\n\"}";

CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://localhost:8080/EPLPrinter");
httpPost.setEntity(new StringEntity(json, ContentType.APPLICATION_JSON));
httpPost.setHeader("Accept", "image/png");

CloseableHttpResponse response = client.execute(httpPost);
HttpEntity result = response.getEntity();
if (result != null) {
    try (FileOutputStream out = new FileOutputStream(new File("label.png"))) {
        result.writeTo(out);
    }
}
client.close();
                        
                

                    
using var http = new HttpClient();

string epl = "N\r\nq609\r\nQ203,26\r\nB26,26,0,UA0,2,2,152,B,\"603679025109\"\r\nA253,26,0,3,1,1,N,\"SKU 6205518 MFG 6354\"\r\nA253,56,0,3,1,1,N,\"2XIST TROPICAL BEACH\"\r\nA253,86,0,3,1,1,N,\"STRIPE SQUARE CUT TRUNK\"\r\nA253,116,0,3,1,1,N,\"BRICK\"\r\nA253,146,0,3,1,1,N,\"X-LARGE\"\r\nP1\r\n";
string json = JsonSerializer.Serialize(new { eplCommands = epl });

var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:8080/EPLPrinter")
{
    Content = new StringContent(json, Encoding.UTF8, "application/json")
};
request.Headers.Accept.ParseAdd("image/png");

var response = await http.SendAsync(request);
response.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync("label.png", await response.Content.ReadAsByteArrayAsync());
                        
                

                    
// Browser (inside a <script type="module">): render the label in an img element
const epl = "N\r\nq609\r\nQ203,26\r\nB26,26,0,UA0,2,2,152,B,\"603679025109\"\r\nA253,26,0,3,1,1,N,\"SKU 6205518 MFG 6354\"\r\nA253,56,0,3,1,1,N,\"2XIST TROPICAL BEACH\"\r\nA253,86,0,3,1,1,N,\"STRIPE SQUARE CUT TRUNK\"\r\nA253,116,0,3,1,1,N,\"BRICK\"\r\nA253,146,0,3,1,1,N,\"X-LARGE\"\r\nP1\r\n";

const response = await fetch("http://localhost:8080/EPLPrinter", {
    method: "POST",
    headers: { "Content-Type": "application/json", "Accept": "image/png" },
    body: JSON.stringify({ eplCommands: epl })
});
const blob = await response.blob();
document.getElementById("label").src = URL.createObjectURL(blob);
                        
                

                    
// Node.js 18+ (built-in fetch). Save as convert.mjs (ES module, top-level await)
import fs from "fs";
const epl = "N\r\nq609\r\nQ203,26\r\nB26,26,0,UA0,2,2,152,B,\"603679025109\"\r\nA253,26,0,3,1,1,N,\"SKU 6205518 MFG 6354\"\r\nA253,56,0,3,1,1,N,\"2XIST TROPICAL BEACH\"\r\nA253,86,0,3,1,1,N,\"STRIPE SQUARE CUT TRUNK\"\r\nA253,116,0,3,1,1,N,\"BRICK\"\r\nA253,146,0,3,1,1,N,\"X-LARGE\"\r\nP1\r\n";

const response = await fetch("http://localhost:8080/EPLPrinter", {
    method: "POST",
    headers: { "Content-Type": "application/json", "Accept": "image/png" },
    body: JSON.stringify({ eplCommands: epl })
});
fs.writeFileSync("label.png", Buffer.from(await response.arrayBuffer()));
                        
                

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.epl+json or application/vnd.epl+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.

The EPLPrintJob Object

The EPLPrintJob is the JSON Object sent in the body of POST /EPLPrinter. It specifies the EPL commands (the only required property) and the printer settings like DPI, label size, colors, background and watermark images and output options.

{
  "eplCommands": "N\r\nq609\r\nQ203,26\r\nA253,26,0,3,1,1,N,\"SKU 6205518\"\r\nP1\r\n",
  "dpi": 203,
  "labelWidthInchUnit": 3,
  "labelHeightInchUnit": 1,
  "renderOutputRotation": 0,
  "enablePrinting": false
}
PropertyTypeDefaultDescription
dpiinteger203The printer resolution in DPI (Dots per inch) value. Valid values are: 152 (6 dpmm), 203 (8 dpmm), 300 (12 dpmm) or 600 (24 dpmm).
eplCommands REQUIREDstringThe EPL commands to be processed. The string containing the EPL commands is converted to an array of bytes prior processing it. That conversion will use CodePage or Encoding 850 (Latin Character Set).
eplCommandsCodePageinteger850The Encoding or CodePage of the EPL string content. Default is CodePage 850 (Latin Character Set). Valid CodePage numbers are listed here github.com/neodynamic/EPL-Printer-Web-API-Docker
isEplCommandsBase64booleanfalseWhether the specified EPL Commands string is in Base64 format. Useful for EPL commands containing non-readable/printable chars. Default is false.
renderOutputRotationintegerThe rotation for the output rendering process. Default is 0 (None). Valid values are: 0 (None), 90 (Clockwise), 180, 270 (Clockwise).
antiAliasbooleantrueWhether anti-aliasing rendering is enabled. Default is true.
labelWidthInchUnitnumber4The default label width in Inch units. Default is 4in.
labelHeightInchUnitnumber6The default label height in Inch units. Default is 6in.
labelBackColorHexstringThe label's background color in hex notation. Default is #fff (White).
ribbonColorHexstringThe label's ribbon color in hex notation. Default is #000 (Black).
backgroundImageBase64stringThe label's custom background image from a string in Base64 format. Image format must be PNG or JPG.
watermarkImageBase64stringThe label's watermark image from a string in Base64 format. Image format must be PNG or JPG.
watermarkOpacityintegerThe label's watermark image opacity level. Values range from 0 to 100. Default is 50.
thumbnailSizePixelUnitinteger0The thumbnail size for the output rendering in Pixel unit. Default is 0 (zero) which means thumbnail generation is disabled.
pdfMetadataAuthorstringThe PDF Metadata Author attribute.
pdfMetadataCreatorstringThe PDF Metadata Creator attribute.
pdfMetadataProducerstringThe PDF Metadata Producer attribute.
pdfMetadataSubjectstringThe PDF Metadata Subject attribute.
pdfMetadataTitlestringThe PDF Metadata Title attribute.
forceLabelHeightbooleanfalseWhether the LabelHeight property value must override the Q command. Default is false.
forceLabelWidthbooleanfalseWhether the LabelWidth property value must override the q command. Default is false.
invertColorsbooleanfalseWhether to invert the colors of the output image. Default is false.
compressionQualityinteger100The compression quality level to use for the output image. Values range from 0 to 100.
traceRenderedElementsbooleanfalseWhether to trace the EPL elements rendered based on the EPL commands to be processed. Only available for JSON output. Default is false.
enablePrintingbooleanfalseWhether the output rendering should be formatted for printing scenarios. Default is false.

Errors

Successful requests return HTTP 200 with the output in the format requested by the Accept header. If an error occurs while processing the EPLPrintJob, the API returns HTTP 500 with a ProblemDetails JSON object:

{
  "type": "string",
  "title": "string",
  "status": 500,
  "detail": "string",
  "instance": "string"
}

If you get this error with valid EPL, please contact our support team.


Web API Doc

Interactive OpenAPI reference. The same swagger.json is used by the Swagger UI built into the container (enabled by default). All request properties are also listed in The EPLPrintJob Object.


EPL Commands Support

EPLPrinter Web API rendering engine supports most of the EPL formatting and control commands. The following table lists the supported commands. 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 EPLPrinter Web API leverages on its own barcode encoder. However, this does not mean that the rendered barcodes will not be readable at all.
Status EPL Command Notes
A - ASCII TextLatin resident fonts 1, 2, 3, 4, 5, 6, and 7
B - Linear Bar CodeCode 39, Code 93, Code 128, UCC Serial Shipping Container, Codabar, EAN 8-13, German Post Code, Interleaved 2 of 5, Postnet, Planet, UCC/EAN 128, UPC A-E, Plessey, MSI
b - 2D Bar CodeAztec, Data Matrix, MaxiCode, PDF417, and QR Code
C - Counter
FE - End Form Store
FK - Delete Form
FR - Retrieve Form
FS - Store Form
GG - Print Graphics
GK - Delete Graphics
GM - Store Graphics
GW - Direct Graphic Write
LE - Line Draw Exclusive OR
LO - Line Draw Black
LS - Line Draw Diagonal
LW - Line Draw White
N - Clear Image Buffer
P - Print
q - Set Label Width
Q - Set Form Length
R - Set Reference Point
TD - Date Recall & Format Layout
TS - Set Real Time Clock
TT - Time Recall & Format Layout
V - Define Variable
X - Box Draw
Z - Print Direction
^@ - Reset Printer
? - Download Variables

Licensing

On-Premise - Full Deployment Control

EPLPrinter 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 EPLPrinter 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 follows:

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

 Evaluation Mode

The Trial Version of EPLPrinter 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 1, 2, 3, 4, 5, 6 and 7) 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.

Which EPL Edition Do I Need?

The same EPL rendering engine is available in four editions:

EditionBest forHow you use itPlatforms
EPLPrinter Emulator SDK for .NET.NET apps (C#, VB.NET)In-process library: convert, preview and print from codeWindows, Linux, macOS (.NET Standard 2.0)
EPLPrinter Web API for DockerAny language, servers and cloudREST API in a Docker containerLinux container (amd64 & arm64)
Virtual EPL Printer DriverDesktop users and apps that print to a Zebra printerInstalled printer: save EPL as PDF/PNG or print it on any other printerWindows, macOS
EPLServerBackground integration and legacy appsLocal service: HTTP POST + raw TCP; save to disk or forward to a webhookWindows x64, Linux x64 & ARM64, macOS (Apple Silicon & Intel)

EPLPrinter Web API FAQ

How do I convert EPL to PDF with a REST API?
Run the container with docker run -p 8080:8080 neodynamic/eplprinterwebapi:3.0.6, then POST a JSON body like {"eplCommands":"N\nq609\n...P1\n"} to http://localhost:8080/EPLPrinter with the header Accept: application/pdf. The response is the PDF, with one page per label.
How do I convert EPL to ZPL to print on a ZPL-only Zebra printer?
Request Accept: application/vnd.zpl with enablePrinting set to true. The API returns the label as a ZPL graphic (GRF) formatted for printing, which you can send raw to the ZPL printer, for example to port 9100. Legacy applications that generate EPL keep working on newer ZPL printers without changing their label code. See the example.
Is it a self-hosted alternative to online EPL viewers?
Yes. EPLPrinter Web API runs as a Docker container on your own servers or cloud account, so labels with customer or shipping data never leave your infrastructure and there is no dependency on an external web service.
Which programming languages can I use?
Any language that can send an HTTP POST with JSON: Python, Node.js, JavaScript, Java, PHP, C#, Ruby, Perl, Go or curl. There is no SDK to install.
Which output formats are supported?
PNG, JPG, PDF and PCX, plus printer formats: Zebra GRF ASCII hex (ZPL), Zebra EPL binary graphic, Honeywell-Intermec FingerPrint, EPSON ESC/POS NV and HP PCL. The format is chosen with the Accept header.
How are multiple labels returned?
PDF returns all labels in one multipage file. For PNG, JPG, PCX and the printer formats, use the +json Accept variant to get a JSON array of Base64 data URIs, or the +zip variant to get a ZIP with one file per label. The plain variant returns only the first label.
Does it run on ARM64?
Yes. Images are published for amd64 (neodynamic/eplprinterwebapi:3.0.6) and arm64 (neodynamic/eplprinterwebapi:3.0.6-arm64).
Why does my rendered label look scaled or cut off?
The dpi value (152, 203, 300 or 600) must match the resolution the EPL was designed for, and the label size should match the q (label width) and Q (form length) commands. Use forceLabelWidth and forceLabelHeight to override q and Q.
What are the limitations of the evaluation version?
The trial is fully functional and does not expire, but it adds a TRIAL stamp to the output and replaces characters above byte value 127 with an X when resident fonts are used. See Evaluation Mode.

 Latest Release: v3.0.6 2026-01-26

  • CRITICAL Fixed! Port 80 is no longer the default port. Changed to port 8080. This change now allows non-root users.
  • Fixed! Updated all third-party libs and dependencies that are free of known vulnerabilities.

Full change log (all versions since v1.0) →