EPLPrinter Web API for Docker
Key Features
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.
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
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, likeGW 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 andtraceRenderedElements, get the list of rendered EPL elements with their position and size, useful for post-processing.
Overview
Designed by following some of the REST principles, EPLPrinter Web API for Docker responds to a simple HTTP POST by specifying the EPL 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 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:
AMDdocker pull neodynamic/eplprinterwebapi:3.0.6ARMdocker pull neodynamic/eplprinterwebapi:3.0.6-arm64To run the Docker image, please type the following from a Terminal:
AMDdocker run -it --rm -p 8080:8080 neodynamic/eplprinterwebapi:3.0.6ARMdocker 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"
- Auto HTTPS Redirection: By default, HTTPS redirection is enabled. It can be disabled by specifying the following parameter
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.
- Let's suppose you want to use port
12345, then run the docker image with the following parameters:
AMDdocker run -it --rm -p 8080:12345 neodynamic/eplprinterwebapi:3.0.6 -e ASPNETCORE_HTTP_PORTS=12345ARMdocker run -it --rm -p 8080:12345 neodynamic/eplprinterwebapi:3.0.6-arm64 -e ASPNETCORE_HTTP_PORTS=12345 - Special case for port
80: If you need to use port80, then run the docker image with the following parameters:
AMDdocker run -it --rm -p 8080:80 neodynamic/eplprinterwebapi:3.0.6 -u root -e ASPNETCORE_HTTP_PORTS=80ARMdocker 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
}
| Property | Type | Default | Description |
|---|---|---|---|
dpi | integer | 203 | The 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 REQUIRED | string | The 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). | |
eplCommandsCodePage | integer | 850 | The 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 |
isEplCommandsBase64 | boolean | false | Whether the specified EPL Commands string is in Base64 format. Useful for EPL commands containing non-readable/printable chars. Default is false. |
renderOutputRotation | integer | The rotation for the output rendering process. Default is 0 (None). Valid values are: 0 (None), 90 (Clockwise), 180, 270 (Clockwise). | |
antiAlias | boolean | true | Whether anti-aliasing rendering is enabled. Default is true. |
labelWidthInchUnit | number | 4 | The default label width in Inch units. Default is 4in. |
labelHeightInchUnit | number | 6 | The default label height in Inch units. Default is 6in. |
labelBackColorHex | string | The label's background color in hex notation. Default is #fff (White). | |
ribbonColorHex | string | The label's ribbon color in hex notation. Default is #000 (Black). | |
backgroundImageBase64 | string | The label's custom background image from a string in Base64 format. Image format must be PNG or JPG. | |
watermarkImageBase64 | string | The label's watermark image from a string in Base64 format. Image format must be PNG or JPG. | |
watermarkOpacity | integer | The label's watermark image opacity level. Values range from 0 to 100. Default is 50. | |
thumbnailSizePixelUnit | integer | 0 | The thumbnail size for the output rendering in Pixel unit. Default is 0 (zero) which means thumbnail generation is disabled. |
pdfMetadataAuthor | string | The PDF Metadata Author attribute. | |
pdfMetadataCreator | string | The PDF Metadata Creator attribute. | |
pdfMetadataProducer | string | The PDF Metadata Producer attribute. | |
pdfMetadataSubject | string | The PDF Metadata Subject attribute. | |
pdfMetadataTitle | string | The PDF Metadata Title attribute. | |
forceLabelHeight | boolean | false | Whether the LabelHeight property value must override the Q command. Default is false. |
forceLabelWidth | boolean | false | Whether the LabelWidth property value must override the q command. Default is false. |
invertColors | boolean | false | Whether to invert the colors of the output image. Default is false. |
compressionQuality | integer | 100 | The compression quality level to use for the output image. Values range from 0 to 100. |
traceRenderedElements | boolean | false | Whether to trace the EPL elements rendered based on the EPL commands to be processed. Only available for JSON output. Default is false. |
enablePrinting | boolean | false | Whether 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.
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 Text | Latin resident fonts 1, 2, 3, 4, 5, 6, and 7 | |
| B - Linear Bar Code | Code 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 Code | Aztec, 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:
AMDEvaluation 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:
| Edition | Best for | How you use it | Platforms |
|---|---|---|---|
| EPLPrinter Emulator SDK for .NET | .NET apps (C#, VB.NET) | In-process library: convert, preview and print from code | Windows, Linux, macOS (.NET Standard 2.0) |
| EPLPrinter Web API for Docker | Any language, servers and cloud | REST API in a Docker container | Linux container (amd64 & arm64) |
| Virtual EPL Printer Driver | Desktop users and apps that print to a Zebra printer | Installed printer: save EPL as PDF/PNG or print it on any other printer | Windows, macOS |
| EPLServer | Background integration and legacy apps | Local service: HTTP POST + raw TCP; save to disk or forward to a webhook | Windows 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
80is no longer the default port. Changed to port8080. This change now allows non-root users. - Fixed! Updated all third-party libs and dependencies that are free of known vulnerabilities.