--kiosk-printing 能不能上生产?先数一下这台机器插了几台打印机
上个月那篇里我留了一句:「专用设备、镜像统一、机器就跑你们一个系统------可以研究 kiosk。」后台陆陆续续有人问怎么配、配了还是弹框怎么办。
这篇说透,顺便说清什么时候别碰。
它到底干了啥
Chromium 的一个命令行开关。加了之后,页面里 window.print() 不弹预览,直接送系统默认打印机,用默认纸、默认方向、默认份数。
注意这半句:送出去就不管了。没有任务号,没有「打了几页」,onafterprint 在静默模式下几乎立刻触发------纸出没出来,它不知道。
所以它解决的只是「不要弹窗」,不是「打印」这件事在业务系统里要的那一整套。
怎么配
Windows 改快捷方式(用户必须从这个快捷方式进):
chrome.exe --kiosk-printing --kiosk https://your-app/print
Edge 一样,换成 msedge.exe。macOS 用 open -a "Google Chrome" --args --kiosk-printing。Linux 写 .desktop,Exec 行带参数,麒麟/UOS 上先 which chromium 确认二进制名。
域环境里一般用组策略推,别让 IT 一台台改。但这里有个容易被忽略的冲突:「强制使用系统默认打印机」「禁用打印预览」这类策略会覆盖命令行行为,同一批机器策略不一样,表现就不一样。验证必须在目标机上做,别拿开发机下结论。
六个上不了生产的理由
| # | 边界 | 真实表现 |
|---|---|---|
| 1 | 只能打默认打印机 | 用户把默认改成「另存为 PDF」,面单就存成文件了 |
| 2 | 没有回执 | 重复点击=重复出纸,财务没法对账 |
| 3 | 不能指定纸张和份数 | 100×150 面单只能靠改系统设置 |
| 4 | 多标签打架 | 同时触发的 print 互相顶掉,批量打印缺单 |
| 5 | 依赖启动方式 | 用户自己点桌面图标打开,参数就没了 |
| 6 | 版本行为会变 | 浏览器自动升级后整批失效,没有降级路径 |
第 6 条最要命。--kiosk-printing 从来不是 Chromium 承诺长期稳定的 API,它是给 kiosk 设备用的启动开关。把核心业务挂在上面,等于挂在实现细节上。
那什么时候它真的够用
四条同时成立:打印机唯一、介质唯一、打错了能重来、没有对账需求。
车间看板、自助机、内部工具打交接单------这些用它零成本,一行参数解决,没必要上客户端。破一条,就该换方案。
换方案长什么样
把「打印」从浏览器里拿出来,交给本机常驻进程:
网页 ──WebSocket──> 本机打印服务 ──> 系统打印队列 ──> 打印机
多出四件 kiosk 永远给不了的东西:按任务指定打印机、按任务指定纸张份数、拿到成功/失败/超时的回执、打印前先预览。
前端调用可以很短:
js
import webPrintPdf from 'web-print-pdf'
await webPrintPdf.printHtml(html,
{ paperFormat: 'A4', printBackground: true },
{ printerName: 'HP LaserJet Pro', scaleMode: 'shrink' },
{ action: 'print', requestTimeout: 20 }
)
打印机名别写死,getPrinterList() 拿一次让用户选,存本地。
同类方案不止一个:QZ Tray、C-Lodop、JSPrintManager,还有 npm 上的 web-print-pdf。形态都是「本机进程 + 前端 SDK」,差在授权方式、系统覆盖、API 风格。
排障
| 现象 | 先查 |
|---|---|
| 加了参数还弹预览 | Chrome 不是从这个快捷方式启动的,chrome://version 看命令行 |
| 打出来是 PDF 文件 | 默认打印机是「Microsoft Print to PDF」 |
| 一张都没出、也没报错 | 静默没回执,去系统打印队列看是不是卡纸/离线 |
| 换台电脑就失效 | 新机器没配快捷方式,或默认打印机不同 |
最后
判断要不要用它,只看一个问题:打印错了,会不会产生需要追溯的后果?
不会 → 用它,一行参数。
会 → 老老实实做本地打印代理,让每张纸都有任务号。
选型不是越重越好,是够用加能兜底。