一、写在前面:前端打印的痛点
做前端开发的同学,几乎都逃不开一个需求:网页打印或 HTML 转 PDF。报表导出、发票打印、合同下载、订单生成......这些场景几乎每个管理系统都会碰到。但真正上手做的时候,你会发现各种坑接踵而至:
- 样式错乱:浏览器里显示完美,打印出来却是另外一回事,表格跨页被截断、背景色神秘失踪
- 分页控制困难:内容被生硬切断,该在一起的内容被拆到两页
- 弹窗干扰:浏览器自带的打印弹窗太丑,而且无法实现静默打印
- 方案割裂 :
window.print()不够用,jsPDF + html2canvas性能差,后端无头浏览器又太麻烦 - 框架集成复杂:Vue / React 项目里集成打印功能往往要写很多胶水代码
这些问题相信不少前端开发都深有体会。那有没有一个工具,可以同时解决"HTML 转 PDF"和"静默打印"两大需求,还能保持原汁原味的 CSS 样式呢?今天要介绍的这个 npm 包------web-print-pdf,就是一个非常务实的选择。
二、web-print-pdf 简介
web-print-pdf 是一个基于 Electron 的跨平台 Web 打印解决方案,专为 Web 应用提供强大而灵活的打印能力。简单来说,它做了一件事:让前端打印像调用接口一样简单。
这个库基于 Playwright 无头浏览器内核,渲染效果与最新版 Chrome 浏览器完全一致,完美支持 Flex、Grid 布局、自定义字体、背景色、圆角阴影等现代 CSS 特性。这意味着你不需要为打印单独编写一套样式模板,直接用现有的 HTML 和 CSS,就能打印出高质量 PDF 或纸质文档。
三、安装与配置
安装非常简单,一条命令搞定:
bash
npm i web-print-pdf
如果你的项目使用 yarn 或 pnpm:
bash
yarn add web-print-pdf
# 或
pnpm add web-print-pdf
注意事项:web-print-pdf 需要配合官方提供的 Web 打印专家客户端 使用,项目官网提供了 Electron 打包的一键安装能力,安装后前端仅需调用 API 即可。
四、核心用法详解
- 打印 HTML 内容
最简单的使用场景------打印页面某个区域:
javascript
import { printHtml } from 'web-print-pdf';
await printHtml({
content: document.getElementById('report').innerHTML,
paperSize: 'A4',
margin: '10mm',
silent: false
});
这种方式直接传入 DOM 元素内的 HTML 字符串,打印出来和在浏览器中看到的样式完全一致。不需要额外定义打印模板,不需要学习新的 DSL,不需要后端参与。
如果你的 HTML 内容来自远程 URL 或 Base64 格式,也都有对应的 API:
javascript
import { printHtmlByUrl, printHtmlByBase64 } from 'web-print-pdf';
// 打印远程 URL 页面
await printHtmlByUrl({
url: 'https://example.com/preview.html',
silent: true
});
// 打印 Base64 编码的 HTML
await printHtmlByBase64({
base64: btoa('<html>...</html>'),
silent: true
});
- 打印 PDF 文件
从远程 URL 直接打印 PDF 文件是最常见的场景之一:
javascript
import { printPdfByUrl } from 'web-print-pdf';
await printPdfByUrl({
url: 'https://example.com/order.pdf',
printer: 'HP-LaserJet',
copies: 1,
duplex: false,
paper: 'A4',
silent: true
});
- 打印图片
如果需要打印图片(如小票、价签、条码等):
javascript
import { printImageByUrl, printImageByBase64 } from 'web-print-pdf';
await printImageByUrl({
url: 'https://example.com/ticket.png',
silent: true
});
五、高级配置选项
- PDF 生成配置
web-print-pdf 支持丰富的 PDF 生成选项,让你精确控制输出效果:
javascript
const pdfOptions = {
// 纸张格式:A0-A6、Letter、Legal 等
paperFormat: 'A4',
// 自定义纸张尺寸
width: '210mm',
height: '297mm',
// 页边距
margin: { top: '20px', bottom: '20px', left: '20px', right: '20px' },
// 横向/纵向
landscape: false,
// 打印背景色
printBackground: true,
// 水印功能
watermark: {
text: '机密文件',
color: 'rgb(255,0,0)',
x: 'alignCenter',
y: 'alignCenter',
size: 30,
opacity: 0.3
},
// 页码设置
pageNumber: {
start: 1,
format: '第{{page}}页/共{{totalPage}}页',
x: 'alignCenter',
y: 'alignBottom'
},
// 页面范围(指定打印页)
pageRanges: [{ from: 1, to: 5 }]
};
- 打印配置
javascript
const printOptions = {
printer: '目标打印机名称', // 不填则使用系统默认
silent: true, // 静默打印,跳过弹窗
copies: 2, // 打印份数
duplex: true, // 双面打印
paper: 'A4', // 纸张规格
orientation: 'portrait', // 方向:portrait/landscape
margin: { top: 10, right: 10, bottom: 10, left: 10 } // 边距(mm)
};
- Vue 框架集成示例
javascript
import webPrintPdf from 'web-print-pdf';
// Vue 3 组件中
const handlePrint = async () => {
try {
await webPrintPdf.printHtml({
content: invoiceTemplate.value,
pdfOptions: { paperFormat: 'A4' },
printOptions: { copies: 1, silent: true }
});
console.log('打印成功');
} catch (error) {
console.error('打印失败:', error);
}
};
- React 框架集成示例
javascript
import React from 'react';
import webPrintPdf from 'web-print-pdf';
function PrintButton() {
const handlePrint = async () => {
try {
await webPrintPdf.printHtml({
content: document.getElementById('report').innerHTML,
pdfOptions: { paperFormat: 'A4' }
});
} catch (error) {
console.error(error);
}
};
return <button onClick={handlePrint}>打印报表</button>;
}
六、静默打印的实现原理
web-print-pdf 通过 Electron 与无头浏览器的协作实现了真正的静默打印。整体架构如下:
- 前端调用 API:通过 npm 包提供的接口发起打印请求
- WebSocket 通信:前端与本地打印服务保持实时连接
- 无头浏览器渲染:基于 Playwright 启动 Chromium 无头浏览器渲染 HTML 内容
- PDF 生成与输出:将渲染结果转换为高质量 PDF 并发送到指定打印机
传统的 Web 打印方案往往存在并发处理能力弱、资源管理不当、用户体验差等问题。而基于 Playwright 无头浏览器的现代 Web 打印技术,配合智能任务队列系统,完美解决了这些痛点。
静默打印的核心优势:
· 无需用户手动确认,完全自动化
· 高质量输出,完美还原样式
· 灵活配置,支持丰富的 PDF 和打印参数
· WebSocket 连接确保任务状态实时同步
七、与其他方案的对比
方案 优点 缺点
window.print() 简单,无需依赖 样式兼容性差,必须弹窗,无法静默,功能单一
jsPDF + html2canvas 纯前端实现 生成的是图片型 PDF,文字不可选中,长文档易崩溃
后端无头浏览器 功能强大 需要维护后端服务,开发协作成本高
web-print-pdf 开箱即用,样式原生支持,支持静默打印,前端调用简单 需要安装本地客户端
相比传统方案,web-print-pdf 的突出优势在于:和 Lodop 一类控件相比,无需控件安装、证书、浏览器兼容适配;和纯浏览器方案相比,无需依赖用户交互弹窗或浏览器实验开关;和重型可视化模板库相比,更聚焦"把已生成的内容稳妥印出",学习成本更低。
八、典型应用场景
web-print-pdf 在以下业务场景中特别适用:
· 电商/仓配:批量面单、拣货单、出库单静默打印,支持队列与并发控制
· 连锁零售:小票、价签、标签快速打印,指定门店默认打印机自动落盘
· 企业后台管理系统:报表打印、数据分析页面导出
· 电子发票/电子合同:生成高保真的 PDF 文档
· 制造/物流:工艺卡、条码标签打印,支持图片、PDF 混合任务一并下发
· 医院/政务:表单、回执、凭证批量打印,纸张与边距严格可控
九、技术架构解析
web-print-pdf 的底层技术架构分为三个层次:
- 前端调用层:Vue / React / Angular 项目通过 npm 包调用 API
- 通信层:通过 WebSocket 与本地打印服务实时通信
- 渲染打印层:Electron 客户端内嵌 Playwright 无头浏览器,负责 HTML 渲染、PDF 生成和打印机控制
这种架构的巧妙之处在于:将复杂的打印渲染逻辑下沉到本地客户端,前端开发者只需要像调用普通 API 一样使用即可,极大地降低了开发门槛。
十、总结与推荐
如果你正在开发一个需要打印功能的前端项目,web-print-pdf 是一个非常务实的选择:
✅ 开箱即用:几行代码完成 HTML 转 PDF 或静默打印,无需复杂配置
✅ 样式原生支持:基于 Playwright 内核,你现有的 CSS 是什么样子,打印出来就是什么样子
✅ 静默打印:无需用户交互弹窗,完美支持自动化批量打印
✅ 框架无关:Vue、React、Angular 均可直接使用
✅ 功能全面:支持 HTML、PDF、图片等多种格式,支持自定义水印、页眉页脚、页码等高级功能
✅ 生产就绪:已在企业级应用中经过实战验证
前端打印从来都不是简单的事,但有了好工具,能省下大量调试时间。如果你也正在被 HTML 转 PDF 或静默打印的需求所困扰,不妨试一下 web-print-pdf:
· NPM 包:https://www.npmjs.com/package/web-print-pdf
· GitHub:https://github.com/weixiaoyi/web-print-pdf
希望这个库,能帮更多的人