LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

dompdf.js:前端 PDF 导出的矢量级解决方案

admin
2026年9月2日 10:38 本文热度 46

dompdf.js(GitHub: lmn1919/dompdf.js,官网 Demo: dompdfjs.lisky.com.cn)。它解决的是一个很经典的前端痛点:如何在不靠后端、不把页面截成图的前提下,把 HTML 导出成可搜索、可复制、体积小的真实 PDF

dompdf.js 是一个纯前端 DOM-to-PDF 引擎,技术栈是 TypeScript + Web Workers + Rust/WASM。

不走html2canvas 截图 → jsPDF 塞图片 这条老路,而是:

1
主线程读浏览器已经算好的布局(getBoundingClientRect、computed style、文本节点、字体、图片、表单状态);
2
编码成二进制 DOM Snapshot 丢给 Web Worker;
3
Rust/WASM 做分页、字体子集化、矢量绘制、DEFLATE 压缩、加密,直接写 PDF 字节流。

关键点:PDF 里的文字还是文字(Text 对象),不是整页位图。所以放大不糊、可选中、可 Ctrl+F、可复制,文件体积也远小于截图方案。

和 html2pdf.js 的本质区别

维度
html2pdf.js
(html2canvas+jsPDF)
dompdf.js
输出本质
每页一张大图
矢量文本 + 矢量/位图混合
文字
不可选、不可搜
可选、可搜、可复制
放大 500%
锯齿
清晰
长文档
canvas 高度限制,30+ 页易白屏
基准测试 500 页约 2 秒,可上万页
体积
同内容常是数 MB~十几 MB
同内容常是几百 KB
中文
靠截图,不存在字体嵌入问题但也不清晰
需主动嵌 TTF(fontConfig/fontBytes)
分页
CSS 分页类 + 截图切分,容易断卡片
pagination:true
 + pageBreak / divisionDisable 整体迁移

核心能力(已稳定可用)

分页与版式:A0~A10/Letter/Legal 等,自定义 [w,h] pt;marginPtpageBreak(强制前翻页)、divisionDisable(卡片/签字区/报价摘要跨页不切开)。
文字与字体:Unicode、中日韩靠 fontConfig.fontBytes 嵌 TTF,langFontConfig 按 Unicode 区间回退;中文不嵌字体就会变方框。
图形:内联 SVG 保持矢量;位图(Canvas/JPEG/PNG/dataURL)走 jpegQuality 压缩;复杂 CSS 滤镜/混合模式可能降级为位图。
页眉页脚:静态或 (pageNum, totalPages) => config 按页回调,${currentPage}/${totalPages} 占位符。
水印:文字/图片、角度、平铺间距、under/over 层级、按页函数。
表单form: 'static' | 'interactive' | 'hybrid',input/textarea/select/checkbox/radio 可导出成 AcroForm 字段。
安全与体积compress:true(DEFLATE)、encryption(用户/所有者密码 + print/copy/modify 权限)。
进度onProgress 回 collecting / countingPages / rendering / done
API 形态:默认导出 dompdf(el, opts) 返回 Promise<Blob>;另有 exportPDF / renderToBytes / downloadPDF / inspect,以及 collectSnapshot / computePageBreaks 等底层接口。

在线 Demo(dompdfjs.lisky.com.cn)在展示什么

不是炫技渐变拼盘,而是一个「业务文档压力样本」:

城市更新试点评审场景的中英混排段落
动态多行明细表(验证列宽、换行、复制顺序、多页表格)
内联 SVG 流程图 + 一张 Canvas JPEG(仅验证图片链路)
欧拉恒等式 / 高斯积分 / 贝叶斯 / 分段函数(预格式文本与符号)
长正文自然跨页
带 divisionDisable 的卡片(签字区语义,验证不被拦腰截断)

打开后点导出,拿它和 html2pdf.js 同内容导出对比,体积和「能否选中文字」差距最直接。

接入成本

npm install dompdf.js

或 CDN:

<script src="https://cdn.jsdelivr.net/npm/dompdf.js@latest/dist/dompdf.min.js"></script>

最小可用:

import dompdf from 'dompdf.js';
const blob = await dompdf(document.querySelector('#capture'), {
  format: 'a4',
  pagination: true,
  compress: true,
  fontConfig: { fontFamily: 'SourceHanSansSC', fontBytes: await loadTTF('/fonts/xxx.ttf') }
});

SSR 框架(Next/Nuxt)只能在客户端事件里调,不能在服务端跑——它要 DOM/CSSOM/WASM。

边界(别当万能浏览器用)

不重排布局:CSS 是浏览器算完它再读,它自己不是渲染引擎;
视频、iframe、animation、复杂 filter/mask/blend 会降级或栅格化;
完整 CJK 字体很大,生产环境建议子集化或只注册用到的字重;
跨域图片必须对方返回 Access-Control-Allow-OriginuseCORS:true 不能单端绕过;
orientation 选项是兼容残留,横版请直接传 format:[842.25,595.5]

一句话定位

dompdf.js = 前端版「轻量 PDF 渲染器」,用 WASM 取代截图管线,适合报表、合同、审计清单、长文归档这类「要矢量文字、要分页稳、要体积小」的场景;不适合拿来做「整站所见即所得截图留存」。


阅读原文:点击这里


该文章在 2026/9/2 10:38:40 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-2  粤公网安备44030602007207号