web 批量静默打印怎么做?batchPrint 从入门到排坑 柜面连打三张凭证、仓库一次打五张面单、窗口批量补打历史单据——单张printHtml循环调用看似简单实则容易踩并发、顺序、预览混用等坑。本文以 npm 包web-print-pdf的batchPrint为核心说明批量静默打印的正确用法、合并规则与常见错误终端需安装并运行Web打印专家本地客户端。资源链接官网http://webprintpdf.com/客户端下载http://webprintpdf.com/downloadApp/npm 包https://www.npmjs.com/package/web-print-pdfGitHubhttps://github.com/weixiaoyi/web-print-pdf1. 为什么不要自己 for 循环调 printHtml手写循环的问题自己循环batchPrintN 次 WebSocket 往返延迟叠加一次请求服务端编排难以保证 PDF 全部生成后再统一出纸先并行转 PDF再按任务打印预览 / 打印 action 容易混在一批里服务端强制校验 action 一致前端要自己处理部分失败统一错误返回日志在客户端结论批量场景应优先batchPrint而不是for printHtml。2. batchPrint 在架构里的位置业务页 batchPrint(printTaskList, ...) │ WebSocket 一条消息 type: batchPrint ▼ Web打印专家 ├─ 并行各 task → HTML/PDF 生成generatePdf 队列 └─ 串行/并发各 PDF → 打印子进程printPdf 队列 ▼ 本地打印机Windows Spooler / CUPS客户端内部对PDF 生成与打印下发各有一套TaskQueue根据 CPU / 内存动态控制并发避免连点「批量打印」把机器打满。3. 快速上手3.1 最小示例连打两张 HTMLimportwebPrintPdffromweb-print-pdf;constpdfOptions{paperFormat:A4,margin:{top:10px,bottom:10px,left:10px,right:10px},printBackground:true,};constprintOptions{printerName:你的打印机名,// 建议 getPrinterList() 动态获取paperFormat:A4,copies:1,};constextraOptions{action:print};awaitwebPrintPdf.batchPrint([{data:divh1凭证一/h1/div,type:printHtml},{data:divh1凭证二/h1/div,type:printHtml},],pdfOptions,printOptions,extraOptions);3.2 混合类型HTML 远程 PDFawaitwebPrintPdf.batchPrint([{data:div小票 HTML/div,type:printHtml},{data:https://intranet/reports/1001.pdf,type:printPdfByUrl},{data:https://intranet/label.png,type:printImageByUrl},],pdfOptions,printOptions,extraOptions);3.3 支持的 task.typetypedata 含义printHtmlHTML 字符串printHtmlByUrl可访问的报表 URLprintHtmlByBase64Base64 编码的 HTMLprintPdfByUrlPDF 文件 URLprintPdfByBase64Base64 PDFprintImageByUrl图片 URLprintImageByBase64Base64 图片4. 参数合并规则必看调用签名batchPrint(printTaskList,pdfOptions,printOptions,extraOptions)浅合并全局的pdfOptions/printOptions/extraOptions会与每个 task 上的同名字段合并task 级优先。awaitwebPrintPdf.batchPrint([{data:divA/div,type:printHtml,printOptions:{copies:2},// 覆盖全局 copies},{data:divB/div,type:printHtml,printOptions:{printerName:二楼打印机},// 单独指定打印机},],{paperFormat:A4,printBackground:true},// 全局 pdfOptions{paperFormat:A4,copies:1},// 全局 printOptions{action:print,requestTimeout:30});4.1 硬约束action 必须一致合并后所有 task 的extraOptions.action必须相同要么全是print要么全是preview。若一批里既有静默又有预览服务端直接抛错every printTasks extraOptions.action must be equal in printTaskList when after shallow merged!排坑全局extraOptions.action print某个 task 误设action: preview→ 整批失败。4.2 预览模式全局或 task 设action: preview时不会出纸返回printPreviewUrl与pdfs列表供联调版式。5. 业务场景配方5.1 柜面连打「受理单 回执 清单」consttasks[{data:receiptHtml,type:printHtml},{data:ackHtml,type:printHtml},{data:listHtml,type:printHtml},];awaitwebPrintPdf.batchPrint(tasks,pdfOptions,printOptions,{action:print});三份 HTML 建议各自内联样式减少对外部 CSS 依赖。5.2 不同打印机task 级 printOptionsawaitwebPrintPdf.batchPrint([{data:customerCopy,type:printHtml,printOptions:{printerName:前台激光}},{data:archiveCopy,type:printHtml,printOptions:{printerName:办公室 A4}},],pdfOptions,{},extraOptions);5.3 内网 URL 批量带登录态全局extraOptions传 cookie / headerconstextraOptions{action:print,requestTimeout:30,cookies:{SESSION:xxx},httpHeaders:{Authorization:Bearer token},};awaitwebPrintPdf.batchPrint(urls.map((url)({data:url,type:printHtmlByUrl})),pdfOptions,printOptions,extraOptions);6. 排坑清单现象常见原因处理整批报错 action 不一致task 与全局 action 混用统一为print或preview只打了第一张前端循环误用 await 顺序 / 客户端未启动改用 batchPrint确认 Web打印专家在运行后面几张空白HTML 无media print/ 字体缺失内联样式安装字体队列堆积不出纸打印机卡纸、驱动异常见《故障排查手册》08 篇批量很慢单 task 的 URL 超时PDF 队列满调requestTimeout减少单次 batch 数量printerName 报错硬编码开发机名称getPrinterList()动态取6.1 批量大小建议单次520 张较稳妥视 HTML 复杂度与机器配置超大 batch 建议业务侧拆批并在 UI 上显示「打印队列处理中」客户端可通过日志 API 查看 PDF / 打印阶段耗时6.2 不要用 batchPrint 冒充「严格顺序保证」PDF 生成阶段是Promise.all并行打印阶段也是并行触发多个printPdf.print。若业务要求严格先 A 后 B 的物理顺序应在应用层拆成两次调用或与运维确认打印机队列 FIFO 行为。7. 与单张 API 的选型场景推荐 API单张凭证printHtml单张远程 PDFprintPdfByUrl连打多张 / 混合类型batchPrint服务端推任务远程打印 /_printByRawMessage8. 小结批量静默打印请用batchPrint不要手写 for 循环。搞清浅合并与action 一致两条规则能避开大部分联调失败。终端安装Web打印专家前端npm install web-print-pdf即可。更多 API 与参数说明见 npm 文档与客户端内置「运行示例」。