[特殊字符] 开源好物:web-print-pdf,让 Web 打印像调用接口一样简单!


引言:那些年我们踩过的打印坑

在 Web 应用开发中,打印功能一直是个让人头疼的问题。你是否也遇到过这些场景:

· 电商后台需要批量打印发货单,每点一次打印,浏览器就弹一次窗口,员工得守在电脑前不断点击"确认打印";

· 企业 ERP 系统要输出上百页的财务报表,结果样式错乱、表格分页断裂;

· 连锁门店需要远程打印小票,却被告知"Web 应用没法直接指定远程打印机"......

这些问题的根源在于浏览器为了安全限制了 Web 应用对打印硬件的直接控制。而今天要介绍的 web-print-pdf,正是为解决这些专业打印需求而生的解决方案。

官网:http://webprintpdf.com

什么是 web-print-pdf?

web-print-pdf 是一个基于 Playwright 内核的跨平台 Web 打印解决方案,以 npm 包形式提供。它的核心理念是:让 Web 前端像调用本地打印一样,轻松实现静默打印、远程打印、PDF 生成等企业级功能。

你不需要改造现有系统,不需要让用户安装额外的浏览器插件,只需要几行代码,就能让 Web 应用拥有桌面软件般的打印控制能力。

传统方案 vs web-print-pdf

方案类型 问题

浏览器原生 window.print() 必然弹出打印对话框,用户必须手动点击;样式在不同浏览器差异巨大;无法精确控制打印机、纸张规格、边距等参数

Lodop 类控件 需要客户端安装与授权,浏览器兼容适配麻烦,部署相对复杂

纯前端 PDF 库 功能有限,样式控制困难,无法满足企业级批量打印需求

web-print-pdf 的核心优势:

✅ 简单:API 极简,常见打印需求一步到位

✅ 可靠:通过本地服务与无头内核协作,规避浏览器安全限制与差异

✅ 可控:纸张大小、方向、边距、份数、目标打印机、队列、并发都可配置

✅ 可移植:前端 npm 生态集成方便,后端、桌面端、混合架构都能无缝接入

✅ 零安装部署:无需插件、无需控件注册表操作,直接引入即可

5 分钟快速上手

① 安装

bash 复制代码
npm i web-print-pdf

确保运行时已部署本地打印服务(项目提供 Electron 打包与一键安装能力),前端仅调用 API 即可。

② 打印 PDF

javascript 复制代码
import { printPdfByUrl } from 'web-print-pdf';

async function quickPrint() {
  await printPdfByUrl({
    url: 'https://example.com/order.pdf',
    printer: 'HP-LaserJet',
    copies: 1,
    duplex: false,
    paper: 'A4',
    silent: true,      // 静默打印,无弹窗
  });
}

③ 打印 HTML

javascript 复制代码
import { printHtmlByUrl, printHtmlByBase64 } from 'web-print-pdf';

// 远程 URL
await printHtmlByUrl({
  url: 'https://example.com/preview.html',
  silent: true
});

// Base64 字符串(适合前端动态生成的 DOM + 样式)
await printHtmlByBase64({
  base64: btoa('<html>...</html>'),
  silent: true
});

④ 打印图片

javascript 复制代码
import { printImageByUrl } from 'web-print-pdf';

await printImageByUrl({
  url: 'https://example.com/ticket.png',
  silent: true
});

以上代码示例来源于官方文档及相关实践文章。

核心 API 一览

📌 下文方法来自官方 API 介绍及社区相关文章。

基础打印方法

API 功能描述

printHtml(content, pdfOptions, printOptions) 打印 HTML 字符串,支持 HTML 片段和完整页面

printHtmlByUrl({ url }) 打印在线 HTML 地址,支持设置 cookies、headers、超时

printHtmlByBase64({ base64 }) 打印 Base64 格式的 HTML

printPdfByUrl({ url }) 打印在线 PDF 地址,快速下载打印

printPdfByBase64({ base64 }) 打印 Base64 格式的 PDF

printImageByUrl({ url }) 打印在线图片,支持批量打印

printImageByBase64({ base64 }) 打印 Base64 格式的图片

batchPrint(tasks) 批量打印 API,支持高并发场景

丰富打印配置

javascript 复制代码
const pdfOptions = {
  paperFormat: 'A4',           // 纸张格式:A0-A6、Letter、Legal 等
  margin: { top: '20px', bottom: '20px', left: '20px', right: '20px' },
  landscape: false,            // 横向/纵向
  printBackground: true,       // 打印背景
  watermark: {                 // 水印功能
    text: "机密文件",
    color: 'rgb(255,0,0)',
    opacity: 0.3
  },
  pageNumber: {                // 页码设置
    format: '第{{page}}页/共{{totalPage}}页',
    y: 'alignBottom'
  },
  pageRanges: [{ from: 1, to: 5 }]  // 页面范围
};

const printOptions = {
  printerName: 'HP LaserJet Pro',  // 指定打印机
  copies: 2,                       // 打印份数
  duplexMode: 'duplex',            // 双面打印模式
  colorful: true                   // 彩色/黑白
};

以上代码参考了相关技术文章中的配置示例。

高级特性

静默打印 ------ 真正的无感体验

传统的 window.print() 必然会弹出系统打印对话框,用户必须手动点击"打印"才能继续。而在 web-print-pdf 中,只需一个参数 silent: true,就能实现全程无弹窗打印。

javascript 复制代码
await printHtml({
  content: document.getElementById('receipt').innerHTML,
  silent: true,           // 无弹窗,无预览
  printer: 'Receipt_Printer',
  copies: 2
});

精确控制打印机和纸张

你可以从系统中获取已安装的打印机列表,并动态指定目标打印机,支持 A4、A5、80mm 热敏纸、自定义尺寸等,完全满足电商面单、医疗标签、财务凭证等不同场景。

高质量 PDF 生成与预览

不是截图式的 PDF,而是真正可复制、可搜索的矢量 PDF,并且支持生成预览链接,用户可以先确认预览效果再打印,所见即所得。

批量打印 + 队列管理

内置轻量级打印队列,支持并发控制和延时排队,高并发场景下稳定可控。

javascript 复制代码
import { createPrintQueue } from 'web-print-pdf';

const queue = createPrintQueue({
  concurrency: 2,          // 同时最多2个打印任务
  delay: 300,              // 每个任务间隔300ms
  onProgress: (done, total) => {
    console.log(`已打印: ${done}/${total}`);
  }
});

orders.forEach(order => {
  queue.add(() => printHtml({ content: generateOrderHtml(order), silent: true }));
});

await queue.start();

以下方法参考了相关技术社区文章中展示的队列管理实现。

典型应用场景

行业 应用场景

电商/仓配 批量面单、拣货单、出库单静默打印;支持队列与并发控制,防止卡顿

连锁零售 小票、价签、标签快速打印,指定门店默认打印机自动落盘

医院/政务 表单、回执、凭证批量打印;纸张与边距严格可控,满足合规要求

制造/物流 工艺卡/条码标签打印;支持图片、PDF 混合任务一并下发

与其他方案的对比

对比项 web-print-pdf Lodop 浏览器原生 print hiprint

需要安装插件 ❌ ✅ ❌ ❌(需引入脚本)

静默打印 ✅ ✅ ❌ ❌

指定打印机 ✅ ✅ ❌ ❌

批量打印 ✅ ✅ ❌ ✅

队列并发控制 ✅ 部分支持 ❌ ❌

学习成本 低 中 中 较高

Vue/React 友好 ✅ 一般 N/A ✅

对比分析参考了多篇技术文章的对比内容。

最佳实践建议

· 模板与内容分离:在前端或服务端产出 HTML/PDF,打印层只负责传递与落盘,系统职责更清晰

· 队列化与幂等:开启任务队列与重试,保证高峰期不丢单、不重复

· 配置校验:实际可用参数会因驱动与机型差异有所不同,建议先通过打印机列表与纸型查询接口进行校验

结语

前端打印从来都不是一件简单的事,但有了 web-print-pdf,确实能省下大量调试时间。如果你正在做报表打印、PDF 合同生成、批量单据打印等需求,真心推荐试一下。

最后附上官网和 npm 地址:

· 🌐 官网:http://webprintpdf.com

· 📦 npm:web-print-pdf

· 👨‍💻 开发者:10,000+ 开发者使用,99.9% 稳定性保障

希望这个库,能帮你少加班,多睡觉。💤


本文相关代码示例及配置项参考自官方文档和技术社区的文章,实际使用时请以最新版 npm 包的 API 为准。

相关推荐
mldong7 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排7 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60618 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角9 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!9 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰9 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi11 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen11 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马12 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu12 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss