Virtual Receipt Printer for Dev and Testing
Pick a virtual thermal printer by job: print-to-PDF for proofing, online renderers, port-9100 emulators, or a network digital twin for integration work.
Published 2026-07-24 · Updated 2026-09-21 · For developers →
A virtual receipt printer is software that stands in for a thermal printer: your app "prints," and instead of paper you get an image, a PDF, a browser preview, or a fully simulated device on the network. Which kind you need depends entirely on the question you're trying to answer — "does this receipt look right?" needs a renderer, while "does my point-of-sale handle a paper jam?" needs something that can fake the jam.
This guide covers the whole range, from print-to-PDF drivers to a network digital twin, and ends with a decision table so you can pick in thirty seconds.
The four jobs people hire a virtual printer for
"Virtual receipt printer" means at least four different things depending on who's searching:
- Proofing a design. A designer or product manager wants to see a receipt — logo, spacing, totals — without owning a printer.
- Developing print code. A developer is generating ESC/POS commands and wants fast visual feedback while iterating.
- QA and troubleshooting. A tester wants to reproduce what happens when the printer misbehaves: out of paper, cover open, unplugged.
- Automated testing (CI). A team wants the build to fail if printing breaks — with no printer within a mile of the build server.
Each job has a different right answer. Working through them simplest-first:
Print-to-PDF and print-to-image drivers
If your application prints through the operating system's normal print dialog (a browser page, a desktop POS using OS drivers), the built-in Microsoft Print to PDF on Windows or Save as PDF on macOS is a perfectly good virtual printer. Commercial virtual printer drivers go further — capturing output as PNG/JPEG, watermarking, auto-saving to a folder — and you can usually configure a custom paper size around 80 mm wide to approximate receipt stock.
- Good for: design proofs, archiving what would have printed, demoing receipt layouts in documents.
- The catch: real receipt printing in POS systems mostly doesn't go through OS print drivers. It sends raw ESC/POS bytes straight to the printer over TCP or USB. A PDF driver never sees those bytes, so this route tests nothing about an actual POS integration. There are also iPad and Android apps that render sample receipts — same category, same limitation.
If your print path is raw ESC/POS, keep reading.
Online receipt renderers
virtual-printer.online is a hosted page where you send ESC/POS data and see the rendered receipt. Zero install, so it's the fastest possible answer to "what do these bytes draw?" The related receiptline project takes the opposite approach — a markdown-like receipt language with an open-source renderer — which is pleasant if you control both ends.
- Good for: one-off checks, sharing a rendered receipt with a teammate, learning ESC/POS.
- The catch: your application can't connect to a web page as if it were a printer. Nothing about your transport, timeouts, or error handling is exercised.
Developer-grade ESC/POS emulators
The next step up: open-source emulators that listen on TCP port 9100 — the port real network receipt printers use — and render whatever your app sends. Point your POS at your laptop's IP and print.
- EscPosEmulator (roydejong): desktop app, receipt appears in a window. The standard choice for interactive development.
- escpos-netprinter: runs in Docker, renders jobs to HTML — the most automatable renderer.
- escpresso: renders received jobs in a browser preview.
Now your app's real network code path runs, and that's genuine progress over a PDF driver. What these still can't do: talk back. Real printers answer status queries (DLE EOT — explained here) telling the POS about paper, cover, and errors, and real printers fail in ways your software must handle. The renderers accept bytes and stay silent. The full comparison — including exactly which emulator does what — is in the ESC/POS emulator guide.
- Good for: iterating on receipt layout against your real print path.
- The catch: one-directional. No status, no faults, mostly GUI apps that don't fit CI.
A network digital twin
A digital twin provides a software test target for selected device behavior: network requests, status replies and injected faults. It lets your application exercise those paths without a printer, but it cannot reproduce every hardware failure or establish compatibility with a physical installation.
The Proxy Nodes twin requires access to the developer workspace; it is not a standalone public download or published npm package. Request evaluation access before planning a trial or CI dependency. With that checkout and its dependencies installed, run from the workspace root using its pinned Node and pnpm versions:
pnpm sim --host 127.0.0.1 --no-mdns --no-beacon
# Local-only test: HTTP :8080, raw ESC/POS :9100, interactive fault consoleThis command binds only to your computer and disables discovery. For a LAN discovery test, use an approved test network and the default bind/discovery settings instead. The simulator does not enforce the device's API authentication.
From another terminal, read its simulated state:
curl -s localhost:8080/status # printer, drawer, scanner state as JSON
printf '\x10\x04\x01' | nc -w 1 localhost 9100 | od -An -tx1
# DLE EOT 1: one simulated status byte, printed in hexWhat you get:
- Raw ESC/POS on TCP
:9100like any network printer — includingDLE EOTstatus replies that stay consistent with the simulated state. Inject a paper-out and the status byte changes exactly as the spec says it should. - The printing side of the Proxy Nodes HTTP API:
POST /print,GET /status, a live SSE stream atGET /events,GET/PUT /config,POST /drawer/kick,POST /raw, andGET /peers— validated by the same schema Nodeware 1.2.55 answers with on a physical node. It also answersGETandDELETE /scans,GET /scaleandGET /devices/unknownin the device's shapes, though its scan log never records a rejected read and/devices/unknownalways reports nothing present. Not every node route is there: it has no/bootlog,/network,/composeor/restart, and it does not enforceapiMode. - Optional mDNS announcement (
_proxynodes._tcp) for testing discovery on a multicast-capable test network. The local-only command above disables it. - The peripherals around the printer, not just the printer: a cash drawer, a barcode scanner and a scale you drive from the console, so their events reach your app.
- A fault-injection console: type
paper out,cover open, orofflineand the virtual hardware breaks on command. Typeweight 1.25orscan 0123456789and the scale and scanner produce data.
The offline command changes the simulated node's online state; it does not shut its
HTTP or TCP listeners. Test connection refusal, dropped sockets and timeouts separately.
Paper and cover faults exercise the modeled printer response, not USB disconnection,
brownouts, jams or real cutter behavior.
Conformance assertions can run against the twin and a physical node. Passing the twin checks only the behaviors exercised in software; rerun applicable checks on the exact firmware, printer and cable/power setup before deployment. The twin omits some routes, does not enforce API authentication, and does not deliver configured webhooks. Simulator scope and access describes those boundaries.
Which do you need?
| You are... | Your question | Use |
|---|---|---|
| Designer / PM proofing a receipt | "Does this layout look right?" | Print-to-PDF/image driver, or virtual-printer.online if you have raw bytes |
| Developer writing ESC/POS | "What do my bytes draw?" | EscPosEmulator or escpresso for interactive work; escpos-netprinter in Docker |
| Developer building a POS integration | "Does my app talk to a printer correctly — including status?" | A digital twin on your LAN; verify DLE EOT handling against it |
| QA engineer | "What happens on paper-out / cover-open / network loss?" | A twin with fault injection — scripted, repeatable, no cable-yanking |
| Team lead who wants CI coverage | "Will the build fail if printing breaks?" | Byte-level golden tests + a twin running as a CI service — full recipes in testing receipt printing in CI |
Two rules of thumb fall out of the table:
- If the output is for human eyes, a renderer is enough. Don't stand up a network service to check a logo.
- If the output is for a machine — your POS, your error handler, your retry logic — you need a virtual printer that can answer back and misbehave. A test double that never fails only proves your code works on days when nothing goes wrong.
The trap in the middle
The common failure mode is stopping at level two: the team eyeballs receipts against a renderer, ships, and discovers in production that nobody ever tested what the app does when the printer stops answering. Status handling and fault paths are where "printer offline" support tickets come from — test them with a tool that can produce those states on command.
For the wider context of how apps drive receipt printers in the first place — raw TCP, vendor SDKs, local HTTP APIs — see the receipt printer API guide, and browse the rest of the developer guides.
Frequently asked questions
- Is there a free virtual receipt printer?
- Yes, several. Print-to-PDF drivers are built into Windows and macOS; virtual-printer.online renders ESC/POS in the browser; EscPosEmulator, escpos-netprinter, and escpresso are open source; the Proxy Nodes digital twin requires developer-workspace evaluation access. Request access on /simulator before relying on pnpm sim; it is not a public package install.
- Can I use a print-to-PDF driver to test POS receipt printing?
- Only if your app prints through the OS print system. Most POS software sends raw ESC/POS bytes over TCP or USB, which never touches the OS driver stack — so a PDF driver tests nothing about that path. Use a port-9100 emulator or a digital twin instead.
- What's the difference between a virtual printer and a printer emulator?
- Usage overlaps, but 'virtual printer' usually means anything that captures print output (including PDF drivers), while 'emulator' implies imitating a specific printer protocol like ESC/POS. A digital twin goes furthest: it imitates the device's network behavior, status replies, and failure modes, so the same tests run against software and hardware.
- Can I proof an 80 mm receipt with a print-to-PDF driver?
- For layout, yes — set a custom paper size about 80 mm wide and print through the OS dialog. It shows spacing and wrapping, not how a thermal head renders an image or where the cutter lands, so confirm the final design on a real printer.
- Do I need a virtual printer if my app only prints through the browser dialog?
- Then a PDF driver is the whole answer — your app never sends raw ESC/POS, so there is no socket, status reply or fault path to exercise. The network tools on this page matter only once your code talks to a printer directly.
- Does the twin behave exactly like the hardware?
- For the printing surface it is held to the same contract: the twin and the physical node share one schema, and conformance specs run against either target. It is not a complete copy: omitted routes, unenforced API authentication, undelivered webhooks and simulated peripheral state limit what it can prove. Its offline toggle does not disconnect the listeners. Test actual networking, USB, power, cutting and paper behavior on hardware.
Related reading
- ESC/POS Emulator: Print Without a PrinterESC/POS emulators compared: which render receipts, which listen on port 9100, and the one that answers DLE EOT status and fakes paper-out on demand.
- Test Receipt Printing in CI — No HardwareHow to put receipt printing under CI: golden-file byte tests, decoded snapshots, a printer service in the pipeline, injected faults, and conformance runs.
- Receipt Printer API: the Complete GuideEvery way software prints receipts in 2026 — ESC/POS, port 9100, vendor SDKs, cloud relays — and how a local HTTP API on the LAN compares.