「浏览器静默打印 PDF」是百度里很常见的搜法:手里已经有 PDF(报表引擎、后端生成、OSS 链接),还想一点就出纸、少弹窗、打到指定机。
很多人先试:浏览器打开 PDF → Ctrl+P;或window.open(pdfUrl)再 print。框还在,默认机还是财务那台,仓管照样骂。
PDF 已经有了,缺的是「出纸通道」
分清两件事:
| 你已有的 | 你还要的 |
|---|---|
| PDF 文件 / URL / Base64 | 打到某台物理打印机 |
| 服务端渲染好的版式 | 不弹预览、可批量 |
浏览器打开 PDF 再打印,走的是阅读器/浏览器打印流程,不是静默。
前端用 jsPDF 再生成一份,也解决不了「指定工位打印机」。
生产里怎么做
出纸电脑装本机打印客户端,页面把 PDF 地址或 Base64 推过去,由客户端提交系统打印队列。
npminstallweb-print-pdfURL 方式(报表已落库 / 有可访问链接)
importwebPrintPdffrom'web-print-pdf'awaitwebPrintPdf.printPdfByUrl(pdfUrl,{},// pdfOptions 按需要;很多场景可空{printerName:'仓库-面单机',copies:1},{action:'print',requestTimeout:20})Base64 方式(接口直接返回文件流)
awaitwebPrintPdf.printPdfByBase64(pdfBase64,{},{printerName:'仓库-面单机',copies:1},{action:'print'})联调先preview,确认页数和方向,再改静默。
现场最容易挂的点
客户端访问不到 PDF 地址
登录态、Cookie、内网域名、HTTPS 证书,随便一个没通就失败。别假设「浏览器能开,客户端也能开」——进程不同。还在用默认打印机
名字写进工位配置,用getPrinterList()抄真实名称。把静默打印塞进服务器
机房里的 Node/K8s 够不着柜台 USB 口。PDF 可以在服务端生成,出纸仍在工位客户端。
和「浏览器里打印网页」别混
要打的是当前页面 HTML,用printHtml。
要打的是现成 PDF,用printPdfByUrl/printPdfByBase64。
两条链路参数不同,别一套代码硬套。
收束
浏览器静默打印 PDF,关键不是再找一个前端 PDF 库,而是:PDF 生成归后端/报表,静默出纸归本机客户端。页面 JS 只负责把文件交给客户端。
包名搜web-print-pdf。本文不放链接。