很多单位是 Windows 工位 + 统信 UOS / 银河麒麟笔记本 混用,但业务只愿意维护一套前端打印代码。
这篇说明:两种桌面打印栈不同,为何仍可用同一个 npm 包 web-print-pdf 对接 Web打印专家 ,并在统信、麒麟、Windows 上实现网页静默打印。
两套系统,一种前端写法
| Windows | 统信 UOS / 银河麒麟 | |
|---|---|---|
| 系统打印 | Print Spooler | CUPS |
| 静默关键 | 本机客户端调 spooler | 本机客户端调 lp |
浏览器 print() |
必弹窗 | 同样无法真正静默 |
| 前端接入 | web-print-pdf |
web-print-pdf(同一包) |
业务 Web 不必 if (统信) { ... } else { ... }:差异由用户本机安装的 Web打印专家 消化。
web-print-pdf 是什么
面向浏览器 / Vue / React / Angular 的 JavaScript 打印库:
- 把 HTML、URL、Base64(HTML / PDF / 图片)交给本机客户端
- 经 WebSocket 下发静默打印任务(默认
ws://127.0.0.1:16794) - 不需要业务后端参与打印链路
与 Print.js(只能调浏览器打印框)、jsPDF(只生成文件、不驱动打印机)不同,web-print-pdf 面向生产环境静默出纸。
包地址与官网(HTTPS)
| 资源 | 地址 |
|---|---|
| npm 包 | https://www.npmjs.com/package/web-print-pdf |
| GitHub 源码 | https://github.com/weixiaoyi/web-print-pdf |
| 官网 | https://webprintpdf.com/ |
| 客户端下载 | https://webprintpdf.com/downloadApp/ |
bash
npm install web-print-pdf
每台终端需安装 Web打印专家 并保持运行;官网下载页:https://webprintpdf.com/downloadApp/
跨平台示例:同一段代码,三处运行
以下在 Windows、统信 UOS、银河麒麟 上写法相同;仅 printerName 需填当前系统里的队列名。
javascript
import webPrintPdf from "web-print-pdf";
const pdfOptions = { paperFormat: "A4" };
const printOptions = {
printerName: "办公室激光", // Windows:设置里的名称;国产桌面:lpstat -a 中的队列
paperFormat: "A4",
copies: 1,
};
const extraOptions = { action: "print" };
// 场景 A:页面内 HTML
await webPrintPdf.printHtml("<div>......</div>", pdfOptions, printOptions, extraOptions);
// 场景 B:服务端生成的 PDF
await webPrintPdf.printPdfByUrl("https://intranet/form.pdf", pdfOptions, printOptions, extraOptions);
// 场景 C:打开某个可打印 URL 再转 PDF 打
await webPrintPdf.printHtmlByUrl("https://intranet/report/printView", pdfOptions, printOptions, {
...extraOptions,
requestTimeout: 30,
});
Vue 3 中(与客户端示例工程一致)
javascript
import webPrintPdf from "web-print-pdf";
async function handlePrint() {
const res = await webPrintPdf.printHtml(
document.getElementById("print-area").innerHTML,
{ paperFormat: "A4" },
{ paperFormat: "A4" },
{ action: "print" }
);
console.log("print result", res);
}
批量 + 远程(政务 / 金融常见)
javascript
// 批量
await webPrintPdf.batchPrint(
[
{ data: "<div>回单 1</div>", type: "printHtml" },
{ data: "https://intranet/ticket2.pdf", type: "printPdfByUrl" },
],
{ paperFormat: "A4" },
{ paperFormat: "A4" },
{ action: "print" }
);
// 远程:WebSocket 收到服务端推送后
await webPrintPdf._printByRawMessage(messageJson);
更多参数(水印 watermark、页码 pageNumber、双面 duplexMode、预览 action: "preview")见 npm README:https://www.npmjs.com/package/web-print-pdf
统信 / 麒麟侧特别注意
- CUPS 先就绪 :
lpstat -r显示 scheduler 运行中 - 队列名一致 :
printerName与打印设置里完全一致 - HTML 先转 PDF:静默链路多为 HTML → PDF → CUPS,注意中文字体
- 专网:组件首次下载可走内网镜像(与 Windows 同一运维思路)
Windows 侧特别注意
- 杀毒白名单:360 等可能拦截无界面打印进程(客户端「环境说明」有路径指引)
- 中文打印机名:客户端会做名称校准
混合项目:同一份 web-print-pdf 代码,在 Windows 样机与统信 / 麒麟样机各验收一次。
集成方只需记住
npm install web-print-pdf
↓
用户安装 Web打印专家(https://webprintpdf.com/downloadApp/)
↓
页面调用 printHtml / printPdfByUrl / batchPrint ...
↓
统信·麒麟 → CUPS 出纸;Windows → Spooler 出纸
Web 管业务,客户端管操作系统,web-print-pdf 管两者之间的那一根线。
验收建议
- 统信 UOS、银河麒麟各一台实机 + Windows 一台
- 同一 Vue 页面、同一
npm依赖版本 - 静默:全程无浏览器打印对话框
- 指定打印机、A4、连续 5 单不堵队列
- 客户端未启动时,前端应有明确报错(连不上 WebSocket)
写在最后
统信 UOS、银河麒麟上的网页静默打印,答案在 本机客户端 + web-print-pdf ,不在浏览器的 print()。
官网与下载:https://webprintpdf.com/ · https://webprintpdf.com/downloadApp/
npm:https://www.npmjs.com/package/web-print-pdf
用一条真实业务报表做 PoC,往往比争论「国产能不能静默」更快结案。
适配范围以正式交付清单为准。