搜「js静默打印」,很多人期待一行 print() 就出纸。现实是:纯浏览器 JavaScript 调打印机,几乎一定会弹预览框;要无预览、指定机、连打,得换架构。
本文按「先讲清楚边界,再给最小代码」写,方便直接发技术社区。包名用 web-print-pdf,不放外链。
先对齐:JS 静默打印到底指什么
业务常要三件事同时成立:
- 不弹浏览器打印对话框
- 能指定打印机名字
- 能控纸张、份数,最好还能排队连打
只做到「点按钮 → 弹出打印框」------那叫 window.print,不是静默。
只做到「生成 PDF 下载」------那叫文件导出,也不是出纸。
为什么 JS alone 做不到
浏览器安全模型禁止网页脚本偷偷驱动本地打印机。window.print() 会进入系统/浏览器打印流程,让用户可取消、可改机。第三方库若底层还是这条通道,装再多也绕不过确认框。
在 setTimeout、fetch 回调里强行 print(),还可能被当成非用户手势直接拦截。所以「控制台偶发成功、业务高峰偶发失败」很常见。
结论一句话:真正的 JS 静默打印 = 页面里的 JS + 本机常驻的打印服务。
最小可跑通写法
工位电脑安装并启动配套客户端后,前端:
bash
npm install web-print-pdf
js
import webPrintPdf from 'web-print-pdf'
export async function silentPrint(html, printerName) {
// 联调建议先 action: 'preview'
return webPrintPdf.printHtml(
html,
{
paperFormat: 'A4',
printBackground: true,
margin: { top: '8mm', bottom: '8mm', left: '8mm', right: '8mm' },
},
{ printerName, copies: 1 },
{ action: 'print', requestTimeout: 15 }
)
}
打印机名字用 webPrintPdf.utils.getPrinterList() 抄,别手打猜。
打印前可先 getConnectStatus(),客户端没开就别硬打。
已有后端 PDF 的:
js
await webPrintPdf.printPdfByUrl(
pdfUrl,
{},
{ printerName: '仓内激光', copies: 1 },
{ action: 'print' }
)
注意:客户端要能访问到这个 URL;鉴权、内网域名、HTTPS 混用现场容易栽。
上线前三分钟检查
- 客户端开机自启了没有
printerName和系统里显示的名字是否一字不差- 联调用过
preview再改print没有
收束
搜「js静默打印」时,别再在纯前端死磕 silent 参数。把权限放到本机客户端,页面只负责提交 HTML/PDF 任务------这才是能交付的 JS 静默打印。
包名搜 web-print-pdf。本文不放链接。