zplCloud.com CloudToBrowserPrint
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)
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)
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
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:
Je nach Betriebssystem wird automatisch der passende Mechanismus verwendet:
| System | Mechanismus | Start |
|---|---|---|
| Linux / Raspberry Pi | systemd-Unit zplcloud2print.service (Restart=always, RestartSec=5) | beim Boot (braucht sudo, wird automatisch erkannt) |
| macOS | launchd LaunchAgent ~/Library/LaunchAgents/com.zplcloud.cloudtobrowserprint.plist (KeepAlive=true) | beim Login, kein Admin nötig |
| Windows | geplante Aufgabe zplcloud2print (schtasks ONLOGON, /RL LIMITED) | beim Login, kein Admin nötig |
Status prüfen / Logs:
Features für alle Plattformen
| Feature | Windows | macOS | Raspberry 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: CUPS | – | ✅ lp -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)
| Endpunkt | Methode | Beschreibung |
|---|---|---|
| /available?types=… | GET | Geräteliste; Typen-Filter network,usb,driver,cups,bluetooth (BT-Scan nur auf Anforderung). |
| /write | POST | Senden: {device, data} | {device, url} | multipart json+blob. |
| /read | POST | Vom Drucker lesen (Netzwerk/BT mit Rückkanal). |
| /convert | POST | Datei → ZPL; mit device + action:"print" = konvertieren + drucken. |
| POST | Mehrere Jobs in einem Request: {jobs:[{device, data|url}]}. | |
| /decode | POST | Bild → {barcodes:[{type,data}]}. |
| /comm/tcp · /comm/serial/… · /comm/bt/… · /comm/parallel | POST | Bidi-Kommunikation (session-basiert, wie JSPM). |
| /ipp | POST | IPP-Druckjob (RFC 2911). |
| /jobs · /jobs/{id} | GET | Job-Trace (Status, Bytes, Fehler, Zeiten). |
| /config/printers | GET | Konfigurierte Netzwerk-Drucker (printers.json). |
| /config/printers | POST | Netzwerk-Drucker hinzufügen: {host, port?, name?} → {ok, message, printers}. |
| /config/printers/remove | POST | Netzwerk-Drucker entfernen (Host oder Name): {hostOrName} → {ok, message, printers}. |
| /hubs/print | SignalR | Print 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:
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.