EPLServer for Windows, macOS & Linux

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

Key Features

  Convert raw EPL to PNG, JPG, PCX & PDF
  Print & Preview EPL commands without wasting real labels!
  High Quality & Accuracy EPL Rendering
  Forward EPL rendering to any other servers and services
  Rest HTTP POST & Raw TCP Socket

Zebra and EPL are registered trademarks of ZIH Corp.
EPLServer
is not made by or endorsed by Zebra.


EPL Server/Service EPL Viewer EPL Parser EPL Converter EPL Redirect Print EPL2PNG EPL2JPG EPL2PCX EPL2PDF EPL2Image

Convert, Preview & Render EPL commands

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)!

Features at a Glance

 EPLServer Service/Daemon

EPLServer installs as a local service/daemon. You can send raw EPL commands from any software, application or service for file conversion or output forwarding.

 HTTP POST

Through a JSON payload, you can specify the EPL commands, the DPI/Resolution, the Default Label Size, the Default Encoding (Code Page), and more... to the EPLServer REST endpoint. Ideal for application integration.

 Raw TCP Socket

Just open a socket and write EPL or JSON directly and get the output rendering ready for printing redirection.

 High Accuracy EPL Render

EPLServer renders EPL commands generating high quality output by reproducing built-in and resident EPL fonts for texts and barcodes with high accuracy. Custom Zebra Intellifont is also supported!

 Convert EPL to Images & Docs

Use EPLServer to easily convert EPL commands to PNG, JPG, PCX & PDF. Just specify the Write To File action in the Settings web UI tab (eplserver --settings) or through a JSON payload.

 Forward EPL Rendering

Use EPLServer to easily forward the EPL output rendering to any other server/service. Just specify the Forward action in the Settings web UI tab (eplserver --settings) or through a JSON payload.

 Barcode Symbologies Support

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

 Colored Label Simulation

EPLServer can be configured to convert and print 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.

 On-Premise Licensing

EPLServer is licensed for Private On-Premise environments. License is available for individual Windows, macOS & Linux devices or for Corporate-wide.

Quick Developer Guide

EPLServer listens on a single TCP port 48321 and accepts EPL commands in two ways:

  • HTTP POST — Send a JSON payload to a REST endpoint. Best for application integration.
  • Raw TCP socket — Open a socket and write EPL or JSON directly. Best for printer emulation and legacy tools.

You can check the port currently in use under the Settings web UI tab (eplserver --settings), or run eplserver --port from the command line.

1 — Sending EPL via HTTP (REST API)

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
💡 The /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.

JSON Payload Reference

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).

{ "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", "eplCommandsCodePage": 850, "isEplCommandsBase64": false, "dpi": 203, "labelWidthInchUnit": 4, "labelHeightInchUnit": 6, "forceLabelWidth": false, "forceLabelHeight": false, "antiAlias": true, "labelBackColorHex": "#ffffff", "ribbonColorHex": "#000000", "action": "writetofile", "fileFolder": "{Temp}/label_{Ticks}", "fileFormat": "PNG", "forwardTo": "" }
FieldTypeDefaultDescription
eplCommandsstringEPL II command string. Required.
eplCommandsCodePagenumber850Code page used to encode the EPL string (e.g. 850, 1252, 65001 for UTF-8).
isZplCommandsBase64boolfalseSet to true if eplCommands is Base64-encoded.
dpinumber203Label printer DPI (203 or 300 are typical values).
labelWidthInchUnitnumber4Label width in inches.
labelHeightInchUnitnumber6Label height in inches.
forceLabelWidthboolfalseForce the rendered output to exactly the specified width.
forceLabelHeightboolfalseForce the rendered output to exactly the specified height.
antiAliasboolfalseEnable anti-aliasing for smoother output.
labelBackColorHexstring#ffffffLabel background color as a hex string (e.g. #ffffff).
ribbonColorHexstring#000000Ribbon/ink color as a hex string.
compressionQualitynumber100JPEG/PNG compression quality (1–100).
actionstringwritetofilewritetofile saves output to disk; forward POSTs output to forwardTo.
fileFolderstring{Temp}/label_{Ticks}Output folder path. Supports {ServiceData}, {Temp}, {Ticks} placeholders.
fileFormatstringPNGOutput format: PNG, JPG, PDF, PCX, PCL, GRF, EPL, FP, NV.
forwardTostring"Webhook URL to POST the rendered output to when action is forward.

HTTP Examples

  • Windows PowerShell — render to PNG and save to disk
    $epl = @" N q609 Q203,26 B26,26,0,UA0,2,2,152,B,"603679025109" A253,26,0,3,1,1,N,"SKU 6205518 MFG 6354" A253,56,0,3,1,1,N,"2XIST TROPICAL BEACH" A253,86,0,3,1,1,N,"STRIPE SQUARE CUT TRUNK" A253,116,0,3,1,1,N,"BRICK" A253,146,0,3,1,1,N,"X-LARGE" P1 "@ $body = @{ eplCommands = $epl dpi = 203 labelWidthInchUnit = 4 labelHeightInchUnit= 6 action = "writetofile" fileFormat = "PNG" fileFolder = "{Temp}/labels" } | ConvertTo-Json Invoke-RestMethod -Method Post ` -Uri "http://localhost:48321/render" ` -ContentType "application/json" ` -Body $body ` -OutFile "label.png"
  • Windows PowerShell — receive raw bytes from /render
    $epl = @" N q609 Q203,26 B26,26,0,UA0,2,2,152,B,"603679025109" A253,26,0,3,1,1,N,"SKU 6205518 MFG 6354" A253,56,0,3,1,1,N,"2XIST TROPICAL BEACH" A253,86,0,3,1,1,N,"STRIPE SQUARE CUT TRUNK" A253,116,0,3,1,1,N,"BRICK" A253,146,0,3,1,1,N,"X-LARGE" P1 "@ $body = @{ eplCommands = $epl dpi = 203 labelWidthInchUnit = 4 labelHeightInchUnit= 6 fileFormat = "PNG" } | ConvertTo-Json Invoke-RestMethod -Method Post ` -Uri "http://localhost:48321/render" ` -ContentType "application/json" ` -Body $body ` -OutFile "label.png"
  • macOS / Linux curl — render to PNG (binary output)
    curl -s -X POST "http://localhost:48321/render" \ -H "Content-Type: application/json" \ -d '{ "eplCommands": "N q609 Q203,26 B26,26,0,UA0,2,2,152,B,\"603679025109\" A253,26,0,3,1,1,N,\"SKU 6205518 MFG 6354\" A253,56,0,3,1,1,N,\"2XIST TROPICAL BEACH\" A253,86,0,3,1,1,N,\"STRIPE SQUARE CUT TRUNK\" A253,116,0,3,1,1,N,\"BRICK\" A253,146,0,3,1,1,N,\"X-LARGE\" P1", "dpi": 203, "labelWidthInchUnit": 4, "labelHeightInchUnit": 6, "fileFormat": "PNG" }' \ -o label.png
  • macOS / Linux curl — render to PDF and save to a folder
    curl -s -X POST "http://localhost:48321/render" \ -H "Content-Type: application/json" \ -d '{ "eplCommands": "N q609 Q203,26 B26,26,0,UA0,2,2,152,B,\"603679025109\" A253,26,0,3,1,1,N,\"SKU 6205518 MFG 6354\" A253,56,0,3,1,1,N,\"2XIST TROPICAL BEACH\" A253,86,0,3,1,1,N,\"STRIPE SQUARE CUT TRUNK\" A253,116,0,3,1,1,N,\"BRICK\" A253,146,0,3,1,1,N,\"X-LARGE\" P1", "dpi": 203, "labelWidthInchUnit": 4, "labelHeightInchUnit": 6, "fileFormat": "PDF" }' \ -o label.pdf
  • macOS / Linux curl — forward rendered output to a webhook
    curl -s -X POST http://localhost:48321/render \ -H "Content-Type: application/json" \ -d '{ "eplCommands": "N q609 Q203,26 B26,26,0,UA0,2,2,152,B,\"603679025109\" A253,26,0,3,1,1,N,\"SKU 6205518 MFG 6354\" A253,56,0,3,1,1,N,\"2XIST TROPICAL BEACH\" A253,86,0,3,1,1,N,\"STRIPE SQUARE CUT TRUNK\" A253,116,0,3,1,1,N,\"BRICK\" A253,146,0,3,1,1,N,\"X-LARGE\" P1", "fileFormat": "PNG", "action": "forward", "forwardTo": "https://my.server.com/label-webhook" }'

2 — Sending EPL via Raw TCP Socket

EPLServer listens on the same port for raw TCP connections. You can write either:

  • Plain EPL commands (e.g. ^XA...^XZ) — the server uses the settings from the Settings web UI tab (eplserver --settings).
  • A complete JSON payload — the server parses it and applies any overrides before rendering.

This mode is compatible with any tool or language that can open a TCP socket: Zebra printers, legacy applications, scripts, etc.

💡 This is the same mechanism used when you install EPLServer as a Standard TCP/IP printer port on Windows — the print spooler sends the raw EPL stream directly over this socket.

Raw Socket Examples

  • Windows PowerShell — send raw EPL over TCP
    $epl = @" N q609 Q203,26 B26,26,0,UA0,2,2,152,B,"603679025109" A253,26,0,3,1,1,N,"SKU 6205518 MFG 6354" A253,56,0,3,1,1,N,"2XIST TROPICAL BEACH" A253,86,0,3,1,1,N,"STRIPE SQUARE CUT TRUNK" A253,116,0,3,1,1,N,"BRICK" A253,146,0,3,1,1,N,"X-LARGE" P1 "@ $port = 48321 $enc = [System.Text.Encoding]::GetEncoding(850) $client = New-Object System.Net.Sockets.TcpClient("127.0.0.1", $port) $stream = $client.GetStream() $bytes = $enc.GetBytes($epl) $stream.Write($bytes, 0, $bytes.Length) $stream.Flush() $stream.Close() $client.Close()
  • Windows PowerShell — send JSON payload over TCP
    $epl = @" N q609 Q203,26 B26,26,0,UA0,2,2,152,B,"603679025109" A253,26,0,3,1,1,N,"SKU 6205518 MFG 6354" A253,56,0,3,1,1,N,"2XIST TROPICAL BEACH" A253,86,0,3,1,1,N,"STRIPE SQUARE CUT TRUNK" A253,116,0,3,1,1,N,"BRICK" A253,146,0,3,1,1,N,"X-LARGE" P1 "@ $json = @{ eplCommands = $epl dpi = 203 labelWidthInchUnit = 4 labelHeightInchUnit= 6 fileFormat = "PDF" action = "writetofile" fileFolder = "{Temp}/labels" } | ConvertTo-Json -Compress $port = 48321 $enc = [System.Text.Encoding]::UTF8 $client = New-Object System.Net.Sockets.TcpClient("127.0.0.1", $port) $stream = $client.GetStream() $bytes = $enc.GetBytes($json) $stream.Write($bytes, 0, $bytes.Length) $stream.Flush() $stream.Close() $client.Close()
  • macOS / Linux nc (netcat) — send raw EPL
    #!/bin/bash PORT="48321" nc -w 2 127.0.0.1 "$PORT" << 'EOF' N q609 Q203,26 B26,26,0,UA0,2,2,152,B,"603679025109" A253,26,0,3,1,1,N,"SKU 6205518 MFG 6354" A253,56,0,3,1,1,N,"2XIST TROPICAL BEACH" A253,86,0,3,1,1,N,"STRIPE SQUARE CUT TRUNK" A253,116,0,3,1,1,N,"BRICK" A253,146,0,3,1,1,N,"X-LARGE" P1 EOF
  • macOS / Linux nc (netcat) — send a JSON payload from a file
    # Create payload.json first, then: nc 127.0.0.1 48321 < payload.json
  • Linux bash /dev/tcp — no extra tools needed
    #!/bin/bash PORT="48321" 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' exec 3>"/dev/tcp/127.0.0.1/$PORT" printf "%s" "$EPL" >&3 exec 3>&-

3a — Windows Virtual Printer Setup

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.

  1. Open Devices and Printers:
    • Windows 11 / 10 Right-click Start → SettingsBluetooth & devicesPrinters & scanners
    • Windows 8 / 7 Start → Control PanelHardware and SoundDevices and Printers
  2. Click Add a printerThe printer that I want isn't listed.
  3. Select Add a local printer or network printer with manual settingsNext.
  4. Select Create a new port, choose Standard TCP/IP PortNext.
  5. Enter:
    • Host Name or IP Address: 127.0.0.1
    • Port Name: any name you like, e.g. EPLServer_local
    • Uncheck Query the printer and automatically select the driver to use
  6. When prompted for a driver, choose any Generic / Text Only driver.
  7. After the port is created, open its PropertiesPorts tab → select the port → Configure Port and set the Port Number to match the value returned by EPLServer.exe --port.
  8. Click Finish. The new printer will now forward all print jobs to EPLServer.

3b — Linux: CUPS Virtual Printer Setup

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.

  • Debian/Ubuntu: sudo apt install cups
  • Fedora/RHEL: sudo dnf install cups
  • Start: sudo systemctl start cups

Option A — Command line (recommended)

Run the following as a user with lpadmin privileges (or prefix with sudo):

Linux Terminal
# 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.

Option B — CUPS web interface

  1. Open http://localhost:631 in a browser.
  2. Go to Administration Add Printer.
  3. Select AppSocket/HP JetDirect and click Continue.
  4. Set the connection URI to:
    socket://127.0.0.1:48321
  5. Give it a name (e.g. EPLServer), click Continue.
  6. Under Make choose Raw, under Model choose Raw Queue (en).
  7. Click . Done.

3c — macOS: Printers & Scanners Setup

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.

Option A — Terminal (fastest)

macOS 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.

Option B — System Settings GUI

  1. Open System Settings (macOS Ventura 13+) or System Preferences (macOS Monterey 12 and earlier) Printers & Scanners.
  2. Click the (Add Printer) button.
  3. In the Add Printer dialog, click the IP tab ( globe icon).
  4. Fill in the fields:
    • Address: 127.0.0.1
    • Protocol: HP Jetdirect - Socket
    • Queue: leave blank
    • Name: EPLServer (or any name you like)
    • Use / Driver: select 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.
  5. Click . The printer appears in the list.
  6. Important: right-click (or Control-click) the new printer in the list and choose Show Printers in Finder to verify the queue name, then match it to the port configured in EPLServer which can be obtained through 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.

4 — Command-Line Interface (CLI)

Run eplserver from a terminal with the following flags:

CommandDescription
eplserverStart the background service (normal mode).
eplserver --settingsOpen the Settings page in the default browser.
eplserver --logsOpen the Logs page in the default browser.
eplserver --portPrint the port EPLServer is currently listening on.
eplserver --device-idPrint the unique Device ID for this installation (used for licensing).
eplserver --healthCheck 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 --docShow the doc page in the default browser.
eplserver --helpShow this summary in the console.
On Windows the service can be registered as a Windows Service via sc or the Services MMC snap-in, so it starts automatically at boot without any user logged in.
On macOS / Linux use launchd or systemd respectively — EPLServer natively supports UseSystemd().

EPL Commands Support

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.

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 Virtual EPL Printer Driver 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