CloudToBrowserPrint

zplcloud2print: lokaler HTTP/HTTPS-Druckdienst (127.0.0.1:9100 / 9101) für Windows, macOS, Linux und Raspberry Pi. Webseiten rufen ihn per JavaScript auf, um Drucker zu finden und ZPL, Dateien und URLs zu drucken. JSPM-kompatibles Request-Modell.

Funktionen

  • Geräteerkennung - Windows-Spooler, CUPS (Linux/macOS), Netzwerk (TCP 9100), Bluetooth SPP.
  • Drucken - Roh-ZPL, URLs, Blobs aus dem Browser (multipart); mehrere Jobs je Request.
  • Konvertierung - PDF, Office (DOC/DOCX/XLS/XLSX über LibreOffice), Bilder (TIF/JPG/PNG/GIF/…) und TXT → ZPL (^GF), optional direkt drucken.
  • Barcode-Decoding - Bild → {type, data} (ZBar; macOS: Apple Vision).
  • Bidi - TCP, seriell (COM/TTY), Bluetooth, Parallelport (LPT), IPP (RFC 2911); sessionbasiert.
  • Print-Server-Modus - alle Funktionen über einen SignalR-WebSocket (/hubs/print) ohne HTTP-Polling.
  • Job-Trace - jede Operation mit queued → printing → ok | failed, Bytes, Fehlern, Zeiten; live per SignalR.

Demo-Seite: zplcloud.com/cloudtobrowserprint (Verbindungsarten, Hub-Status, Job-Trace, Netzwerkdrucker-Verwaltung).

Installation

Der Installer erkennt Betriebssystem und Architektur und lädt das Binary von https://zplcloud.com/downloads/.

macOS / Linux / Raspberry Pi

curl -fsSL https://zplcloud.com/install-cloudtobrowserprint.sh | sh
# oder: wget -qO- https://zplcloud.com/install-cloudtobrowserprint.sh | sh
zplcloud2print --version

Ziele: osx-x64, osx-arm64, linux-x64, linux-arm64, linux-arm. Der Installer schreibt eine Standard-printers.json und installiert das HTTPS-Zertifikat (macOS Login-Keychain; Linux NSS-DB für Chrome/Chromium/Firefox; ohne sudo). Überspringen mit ZPLCLOUD_NO_CERT=1.

Windows (PowerShell, ohne Admin)

irm https://zplcloud.com/install-cloudtobrowserprint-pshell | iex
zplcloud2print --version

Installiert nach %LOCALAPPDATA%\zplcloud2print\zplcloud2print.exe, ergänzt das Verzeichnis im Benutzer-PATH. Ziele: win-x64, win-x86, win-arm64.

Start

zplcloud2print                     # http://127.0.0.1:9100 + https://127.0.0.1:9101
zplcloud2print 19200 19201         # andere Ports
zplcloud2print --install-cert      # HTTPS-Zertifikat in den Trust Store (Safari auf https-Seiten)
zplcloud2print --debug             # Debug-Ausgabe
zplcloud2print --log               # logs/debug.log neben dem Binary
zplcloud2print --log=C:\pfad\debug.log
zplcloud2print --add-printer 192.168.1.50:9100 ZD421
zplcloud2print --remove-printer ZD421

Das Start-Banner zeigt Version, Build-Datum, Debug-/Log-Status und den wirksamen printers.json-Pfad. Ist ein Port belegt, wird der haltende Prozess benannt (Windows GetExtendedTcpTable, Linux ss -ltnp, macOS lsof -nP).

Dienstmodus

zplcloud2print --service-install
zplcloud2print --service-uninstall
SystemMechanismusStart
Linux / Raspberry Pisystemd-Unit zplcloud2print.service (Restart=always, RestartSec=5)beim Booten (sudo nötig, wird automatisch erkannt)
macOSlaunchd LaunchAgent ~/Library/LaunchAgents/com.zplcloud.cloudtobrowserprint.plist (KeepAlive=true)beim Login, ohne Admin
Windowsgeplante Aufgabe zplcloud2print (schtasks ONLOGON, /RL LIMITED)beim Login, ohne Admin
# Status / Logs
Linux/Pi : systemctl status zplcloud2print   |  journalctl -u zplcloud2print -f
macOS    : launchctl list | grep cloudtobrowserprint   |  /tmp/zplcloud2print.log
Windows  : schtasks /Query /TN zplcloud2print          |  %LOCALAPPDATA%\zplcloud2print\logs\debug.log

Plattform-Matrix

FunktionWindowsmacOSRaspberry Pi (arm)Linux x64
PDF → ZPL (^GF)PDFiumPDFiumPDFiumPDFium
Bilder (TIF/JPG/PNG/GIF/…) → ZPLFreeImageFreeImageFreeImageFreeImage
Office (DOC/DOCX/XLS/XLSX) → PDF → ZPLLibreOfficeLibreOfficeLibreOfficeLibreOffice
Barcode-DecodingZBarApple VisionZBarZBar
Druck: installierte Drucker (Spooler)winspool
Druck: CUPSlp -d … -o raw
Druck: Netzwerk (Raw TCP 9100)
Druck: Bluetooth (SPP)
Bidi: seriell (COM/TTY)
Bidi: Parallelport (LPT)
IPP (RFC 2911)
HTTPS-Zertifikat (Trust Store)StoreKeychainNSSNSS
Dienstmodusschtaskslaunchdsystemdsystemd

Auf echter Hardware geprüft: Windows, macOS arm64, Raspberry Pi armhf, Linux x64.

HTTP-API (lokal)

EndpunktMethodeBeschreibung
/available?types=…GETGeräteliste; Filter network,usb,driver,cups,bluetooth (BT-Scan nur auf Anfrage).
/writePOSTSenden: {device, data} | {device, url} | multipart json + blob.
/readPOSTVom Drucker lesen (Netzwerk/BT mit Rückkanal).
/convertPOSTDatei → ZPL; mit device + action:"print" = konvertieren und drucken.
/printPOSTMehrere Jobs: {jobs:[{device, data|url}]}.
/decodePOSTBild → {barcodes:[{type,data}]}.
/comm/tcp · /comm/serial/… · /comm/bt/… · /comm/parallelPOSTBidi-Sessions.
/ippPOSTIPP-Druckjob (RFC 2911).
/jobs · /jobs/{id}GETJob-Trace (Status, Bytes, Fehler, Zeiten).
/config/printersGETKonfigurierte Netzwerkdrucker (printers.json).
/config/printersPOSTHinzufügen: {host, port?, name?}{ok, message, printers}.
/config/printers/removePOSTEntfernen per Host oder Name: {hostOrName}{ok, message, printers}.
/hubs/printSignalRPrint-Server-Modus: alle Funktionen über WebSocket, Live-Job-Trace.

Web-Client (zplcloud2print.min.js)

Eine minifizierte Datei, SignalR eingebettet, Promise-API.

<script src="https://zplcloud.com/cloudtobrowserprint/zplcloud2print.min.js"></script>
<script>
  var bp = window.zplcloud2BrowserPrint;

  bp.getDevices(['network','driver']).then(function (devices) {
    var d = devices[0];
    return d.send('^XA^FO50,50^A0N,40^FDHello^FS^XZ');   // Roh-ZPL
    // d.sendUrl(url);  d.sendFile(blob);  d.convert(blob, {dpi:203});
  });

  // printers.json (Live-Reload)
  bp.addNetworkPrinter('192.168.1.50', 9100, 'ZD421').then(console.log);  // {ok, message, printers}
  bp.getNetworkPrinters().then(console.log);                              // [{host, port, name}]
  bp.removeNetworkPrinter('192.168.1.50');                               // Host oder Name

  // Print-Server-Modus (SignalR)
  bp.hub.connect({ port: 9100 }).then(function () {
    bp.hub.onJobResult = function (id, ok, error) { console.log(id, ok, error); };
    return bp.hub.getDevices(['network']);
  });
</script>

Port-Override: ?zbpPort=19200 in der Seiten-URL. onPendingChange(cb) meldet laufende Operationen (Loader-Status).

printers.json

Wird zuerst neben dem Binary gelesen, sonst im Benutzerordner; Änderungen werden live übernommen. Enthält Netzwerkdrucker, allowedOrigins (andere Origins erhalten 403; localhost, file:// und curl sind immer erlaubt), Proxy-Einstellungen und optionale Watcher.

  • Windows: %LOCALAPPDATA%\zplcloud2print\printers.json
  • macOS: ~/Library/Application Support/zplcloud2print/printers.json
  • Linux / Raspberry Pi: ~/.config/zplcloud2print/printers.json (oder $XDG_CONFIG_HOME)
{
  "networkPrinters": [{ "host": "192.168.1.50", "port": 9100, "name": "ZD421" }],
  "allowedOrigins": ["https://zplcloud.com"],
  "printJobsWatcher": { "enabled": false, "command": "… {printer} {document} {id}", "pollIntervalMs": 2000 },
  "printersWatcher": { "enabled": false, "pollIntervalMs": 3000 }
}