EPLServer for Windows, macOS & Linux installs as a local service/daemon and allows you to Convert, Preview and Render raw EPL (Eltron/Zebra Programming Language) commands to well known image and document formats like PNG, JPG, PCX & PDF. It also can be configured to forward the EPL output rendering to any other server/services (webhook)!
eplserver --settings) or through a JSON payload.
eplserver --settings) or through a JSON payload.
EPLServer listens on a single TCP port 48321 and accepts EPL commands in two ways:
You can check the port currently in use under the Settings web UI tab (eplserver --settings), or run eplserver --port from the command line.
EPLServer exposes two HTTP endpoints on the same port used by the web interface.
| Endpoint | Method | Body | Response |
|---|---|---|---|
/render |
POST | JSON payload (see below) | Rendered image/PDF binary (or ZIP for multi-label jobs) |
/render |
POST | JSON payload with "action": "writetofile" |
Saves the output to disk; same binary response |
/render |
POST | JSON payload with "action": "forward" |
Forwards output to the URL in forwardTo; same binary response |
/render endpoint always returns the rendered bytes directly to the caller.
The action field controls whether the output is also saved to disk or forwarded — it does not suppress the HTTP response.
Send Content-Type: application/json with a body like the example below. All fields are optional and fall back to the values configured in the Settings web UI tab (eplserver --settings).
| Field | Type | Default | Description |
|---|---|---|---|
eplCommands | string | — | EPL II command string. Required. |
eplCommandsCodePage | number | 850 | Code page used to encode the EPL string (e.g. 850, 1252, 65001 for UTF-8). |
isZplCommandsBase64 | bool | false | Set to true if eplCommands is Base64-encoded. |
dpi | number | 203 | Label printer DPI (203 or 300 are typical values). |
labelWidthInchUnit | number | 4 | Label width in inches. |
labelHeightInchUnit | number | 6 | Label height in inches. |
forceLabelWidth | bool | false | Force the rendered output to exactly the specified width. |
forceLabelHeight | bool | false | Force the rendered output to exactly the specified height. |
antiAlias | bool | false | Enable anti-aliasing for smoother output. |
labelBackColorHex | string | #ffffff | Label background color as a hex string (e.g. #ffffff). |
ribbonColorHex | string | #000000 | Ribbon/ink color as a hex string. |
compressionQuality | number | 100 | JPEG/PNG compression quality (1–100). |
action | string | writetofile | writetofile saves output to disk; forward POSTs output to forwardTo. |
fileFolder | string | {Temp}/label_{Ticks} | Output folder path. Supports {ServiceData}, {Temp}, {Ticks} placeholders. |
fileFormat | string | PNG | Output format: PNG, JPG, PDF, PCX, PCL, GRF, EPL, FP, NV. |
forwardTo | string | " | Webhook URL to POST the rendered output to when action is forward. |
EPLServer listens on the same port for raw TCP connections. You can write either:
^XA...^XZ) — the server uses the settings from the Settings web UI tab (eplserver --settings).This mode is compatible with any tool or language that can open a TCP socket: Zebra printers, legacy applications, scripts, etc.
On Windows you can configure EPLServer as a Standard TCP/IP printer port. Any application that prints to this virtual printer will have its EPL stream captured and processed by EPLServer automatically.
127.0.0.1EPLServer_localEPLServer.exe --port.
On Linux you can add EPLServer as a raw CUPS printer. Any application that prints to it will have its EPL stream sent directly to EPLServer over a socket connection.
Tip: CUPS must be installed and running.
sudo apt install cupssudo dnf install cupssudo systemctl start cupsRun the following as a user with lpadmin privileges (or prefix with sudo):
# Add the printer — replace 48321 with the port shown by eplserver --port
lpadmin -p EPLServer \
-E \
-v socket://127.0.0.1:48321 \
-m raw \
-D "EPLServer virtual EPL printer" \
-L "localhost"
# Set it as the system default (optional)
lpoptions -d EPLServer
The -m raw flag tells CUPS to forward the print data unmodified — no driver translation occurs,
so EPL commands reach EPLServer exactly as sent by the application.
socket://127.0.0.1:48321
EPLServer), click Continue.macOS uses CUPS under the hood, so the same raw socket approach works. You can add EPLServer either through the Printers & Scanners System Settings panel or from the Terminal.
# Replace 48321 with the port shown by eplserver --port
lpadmin -p EPLServer \
-E \
-v socket://127.0.0.1:48321 \
-m raw \
-D "EPLServer virtual EPL printer"
# Set as default printer (optional)
lpoptions -d EPLServer
Note: On macOS Ventura and later, lpadmin may require full disk access for the terminal app, or you can prefix with sudo.
If the command is not found, install the Xcode Command Line Tools: xcode-select --install.
127.0.0.1HP Jetdirect - SocketEPLServer (or any name you like)Generic PostScript Printer or AirPrint — then immediately change it to Select Software… Generic Generic PostScript Printer. The driver is irrelevant because CUPS will use the raw queue.eplserver --port.
Note: macOS may display a driver warning because it expects a PostScript or AirPrint device. This is harmless — EPLServer receives the raw bytes before any driver conversion takes place when the queue is set to raw via Terminal.
If you use the GUI-only route, test with a small EPL print job and check the Logs tab to confirm EPLServer received the data.
Run eplserver from a terminal with the following flags:
| Command | Description |
|---|---|
eplserver | Start the background service (normal mode). |
eplserver --settings | Open the Settings page in the default browser. |
eplserver --logs | Open the Logs page in the default browser. |
eplserver --port | Print the port EPLServer is currently listening on. |
eplserver --device-id | Print the unique Device ID for this installation (used for licensing). |
eplserver --health | Check whether the service is running. Exits with code 0 (OK) or 1 (FAIL). |
eplserver --set-port <port> | Change the listening port (hot-reload if running) |
eplserver --set-license <key> | Set the license key (hot-reload if running) |
eplserver --doc | Show the doc page in the default browser. |
eplserver --help | Show this summary in the console. |
sc or the Services MMC snap-in, so it starts automatically at boot without any user logged in.launchd or systemd respectively — EPLServer natively supports UseSystemd().
EPLServer 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.
| 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 |