zplCloud.com CloudToBrowserPrint

Ein lokaler Druckdienst für Windows, macOS, Linux und Raspberry Pi - druckt direkt aus der Cloud mit dem Label-Designer auf Zebra-Drucker im LAN, als Alternative zu CLI/Proxy und Cloud Connect: automatisiert, im Batch und ohne Desktop-Software.

Was ist zplCloud.com CloudToBrowserPrint?

zplCloud2BrowserPrint ist ein kleiner, lokaler HTTP-Dienst (127.0.0.1:9100, HTTPS 9101), den Webseiten per JavaScript ansprechen - ein CloudToBrowserPrint/JSPM-kompatibler Ersatz. Die App läuft auf dem Rechner, an dem der Drucker hängt, und bietet:

  • Geräte-Discovery - installierte Drucker (Windows-Spooler), CUPS-Drucker (Linux/macOS), Netzwerk-Drucker (TCP 9100) und Bluetooth (SPP).
  • Drucken - rohes ZPL, Dateien von URLs und Blobs aus dem Browser (multipart).
  • Konvertierung - PDF, Office (DOC/DOCX/XLS/XLSX via LibreOffice), Bilder (TIF/JPG/PNG/…) und TXT → ZPL (^GF), optional direkt drucken.
  • Barcode-Dekodierung - Bilder → {type, data} (ZBar; macOS: Apple Vision).
  • Bidi-Kommunikation - TCP, Serial (COM/TTY), Bluetooth, Parallel-Port und IPP - session-basiert wie JSPM.
  • Print Server Mode - die komplette Funktionalität läuft zusätzlich über einen SignalR-WebSocket (/hubs/print), ohne Backend.
  • Job-Trace - jeder Vorgang mit Status queued → printing → ok | failed, live per SignalR.

Demo: https://zplcloud.com/cloudtobrowserprint (Testseite im /beta-Design mit Verbindungstyp-Auswahl, Hub-Status, Job-Trace, Loader und Netzwerk-Drucker-Verwaltung).

Installation

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

macOS / Linux / Raspberry Pi (eine Zeile)

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

Unterstützte Plattformen: osx-x64, osx-arm64 (Apple Silicon), linux-x64, linux-arm64 (64-bit Pi OS), linux-arm (32-bit Raspberry Pi). Der Installer legt eine Standard-printers.json an und installiert das HTTPS-Zertifikat automatisch (macOS login-Keychain, Linux NSS-DB für Chrome/Chromium/Firefox - kein sudo nötig); Ü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 und trägt das Verzeichnis in den Benutzer-PATH ein (neue Terminals). Unterstützt win-x64, win-x86 und win-arm64.

Starten

# Standard: http://127.0.0.1:9100 + https://127.0.0.1:9101
zplcloud2print

# Andere Ports (Port-Konflikt?)
zplcloud2print 19200 19201

# HTTPS-Zertifikat in den Trust-Store installieren (Safari ueber https-Seiten)
zplcloud2print --install-cert

# Debug-Ausgabe / Log-Datei
zplcloud2print --debug
zplcloud2print --log           # logs/debug.log neben der Binary
zplcloud2print --log=C:\pfad\debug.log

Beim Start zeigt das Banner Version + Build-Datum und den Debug-/Log-Status. Ist ein Port belegt, nennt die App den haltenden Prozess (Windows: GetExtendedTcpTable, Linux: ss -ltnp, macOS: lsof -nP).

Als Dienst (Restart bei Neustart)

Damit der Druckdienst Neustarts überlebt und sich nach jedem Start automatisch wieder auf 127.0.0.1:9100 registriert, kann er mit einem einzigen Parameter als Systemdienst installiert werden:

# Linux / Raspberry Pi / macOS (als Dienst installieren)
zplcloud2print --service-install
# Windows:
zplcloud2print --service-install

# Deinstallieren
zplcloud2print --service-uninstall

Je nach Betriebssystem wird automatisch der passende Mechanismus verwendet:

SystemMechanismusStart
Linux / Raspberry Pisystemd-Unit zplcloud2print.service (Restart=always, RestartSec=5)beim Boot (braucht sudo, wird automatisch erkannt)
macOSlaunchd LaunchAgent ~/Library/LaunchAgents/com.zplcloud.cloudtobrowserprint.plist (KeepAlive=true)beim Login, kein Admin nötig
Windowsgeplante Aufgabe zplcloud2print (schtasks ONLOGON, /RL LIMITED)beim Login, kein Admin nötig

Status prüfen / Logs:

# Status
Linux/Pi : systemctl status zplcloud2print   |  journalctl -u zplcloud2print -f
macOS    : launchctl list | grep cloudtobrowserprint     |  Log: /tmp/zplcloud2print.log
Windows  : schtasks /Query /TN zplcloud2print   |  Log: %LOCALAPPDATA%\zplcloud2print\logs\debug.log

Features für alle Plattformen

FeatureWindowsmacOSRaspberry Pi (arm)Linux x64
PDF → ZPL (^GF)✅ PDFium✅ PDFium✅ PDFium✅ PDFium
Bilder (TIF/JPG/PNG/GIF/…) → ZPL✅ FreeImage✅ FreeImage✅ FreeImage✅ FreeImage
Office (DOC/DOCX/XLS/XLSX) → PDF → ZPL✅ LibreOffice✅ LibreOffice✅ LibreOffice✅ LibreOffice
Barcode-Dekodierung✅ ZBar✅ Apple Vision✅ ZBar✅ ZBar
Drucken: installierte Drucker (Spooler)✅ winspool
Drucken: CUPSlp -d … -o raw
Drucken: Netzwerk (raw TCP 9100)
Drucken: Bluetooth (SPP)
Bidi: Serial (COM/TTY)
Bidi: Parallel-Port (LPT)
IPP (RFC 2911)
HTTPS-Zertifikat (Trust-Store)✅ Store✅ Keychain✅ NSS✅ NSS
Als Dienst (Restart)✅ schtasks✅ launchd✅ systemd✅ systemd

Alle Plattformen sind mit echter Hardware verifiziert (Windows, macOS arm64, Raspberry Pi armhf, Linux x64).

HTTP-API (lokal)

EndpunktMethodeBeschreibung
/available?types=…GETGeräteliste; Typen-Filter network,usb,driver,cups,bluetooth (BT-Scan nur auf Anforderung).
/writePOSTSenden: {device, data} | {device, url} | multipart json+blob.
/readPOSTVom Drucker lesen (Netzwerk/BT mit Rückkanal).
/convertPOSTDatei → ZPL; mit device + action:"print" = konvertieren + drucken.
/printPOSTMehrere Jobs in einem Request: {jobs:[{device, data|url}]}.
/decodePOSTBild → {barcodes:[{type,data}]}.
/comm/tcp · /comm/serial/… · /comm/bt/… · /comm/parallelPOSTBidi-Kommunikation (session-basiert, wie JSPM).
/ippPOSTIPP-Druckjob (RFC 2911).
/jobs · /jobs/{id}GETJob-Trace (Status, Bytes, Fehler, Zeiten).
/config/printersGETKonfigurierte Netzwerk-Drucker (printers.json).
/config/printersPOSTNetzwerk-Drucker hinzufügen: {host, port?, name?}{ok, message, printers}.
/config/printers/removePOSTNetzwerk-Drucker entfernen (Host oder Name): {hostOrName}{ok, message, printers}.
/hubs/printSignalRPrint Server Mode: komplette Funktionalität über WebSocket, Live-Job-Trace.

Web-Client (zplcloud2print.min.js)

Ein JS-File (minifiziert, SignalR eingebettet) mit Promise-API. Einbinden und loslegen:

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

  // Geräte laden (Verbindungstypen filterbar)
  bp.getDevices(['network','driver']).then(function (devices) {
    var d = devices[0];
    // Drucken (ZPL / URL / Blob)
    return d.send('^XA^FO50,50^A0N,40^FDHello^FS^XZ');
    // d.sendUrl(url);  d.sendFile(blob);  d.convert(blob, {dpi:203});
  });

  // Netzwerk-Drucker in printers.json verwalten (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 Mode (SignalR-WebSocket direkt zur App)
  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 bei Portkonflikten: ?zbpPort=19200 in der Seiten-URL. onPendingChange(cb) liefert Loader-Status für laufende Operationen.

Konfiguration (printers.json)

Der Installer legt beim Installieren eine Standard-printers.json an (Live-Reload, jede Änderung wird sofort übernommen): Netzwerk-Drucker, allowedOrigins (Sites-Manager, 403 sonst; localhost/file:///curl immer erlaubt), Proxy-Einstellungen und optionale Watcher. Netzwerk-Drucker lassen sich bequem über die Demo (Abschnitt 6), die JS-API (addNetworkPrinter/removeNetworkPrinter) oder die Konsole (--add-printer/--remove-printer) verwalten.

  • Windows: %LOCALAPPDATA%\zplcloud2print\printers.json (neben der Binary)
  • macOS: ~/Library/Application Support/zplcloud2print/printers.json
  • Linux / Raspberry Pi: ~/.config/zplcloud2print/printers.json (bzw. $XDG_CONFIG_HOME)

Die App liest zuerst eine printers.json neben der Binary, sonst den Benutzer-Ordner. Beim Start zeigt das Banner den effektiven Pfad.

{
  "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 }
}