
Dembrandt
Dembrandt 不是“AI 神器”,而是一个精准、可复现、面向工程落地的逆向分析工具。它把设计师和开发者从手动截图、取色、量尺寸的重复劳动中解放出来,让设计系统的提取变成一次命令行调用。
“还在用 html2canvas 把网页切成一张张模糊的图片塞进 PDF?生成的文件巨大、文字无法复制、打印效果差,而且一旦超过几千像素就报错?”
dompdf.js 是一个革命性的前端库,它摒弃了传统的“HTML -> Canvas 图片 -> PDF”的低效路径,转而采用 DOM -> 矢量 PDF 的直接渲染模式。

基于 html2canvas 和 jspdf 深度改造,dompdf.js 能够直接读取 DOM 结构和 CSS 样式,调用 jsPDF 原生方法绘制矢量图形。这意味着生成的 PDF 文字可复制、可搜索、可编辑,且文件体积极小,更能轻松支撑数千页的长文档生成,彻底打破 Canvas 的高度限制。
| 特性 | 传统方案 (html2canvas + jspdf) | dompdf.js |
|---|---|---|
| 渲染原理 | HTML -> Canvas 图片 -> PDF | HTML/DOM -> 矢量 PDF 指令 |
| 文件性质 | 图片式 PDF (不可选中文本) | 矢量 PDF (文字可选、可搜、可编辑) |
| 文件大小 | 极大 (每张图都占空间) | 极小 (仅存储绘图指令和字体) |
| 打印质量 | 低 (放大后模糊锯齿) | 高 (无限缩放不失真) |
| 长度限制 | 受 Canvas 高度限制 (通常 ~30000px) | 无限制 (支持数千页长文档) |
| 服务器依赖 | 可选 (可纯前端) | 纯前端 (零服务器渲染成本) |
dompdf.js 已经实现了绝大多数常用 Web 样式的矢量还原:
${currentPage}/${totalPages})。font-family, font-size, color, font-style 等。支持文字描边,暂不支持文字阴影。<canvas> 和 <svg> 元素为矢量或高清嵌入。border-width/color/style/radius (目前仅实线)。foreignObjectRendering 技术支持边框阴影。(注:暂不支持 <iframe> 渲染;部分复杂 CSS 属性可能尚未覆盖)
npm install dompdf.js --save
# 或使用 CDN
# <script src="https://cdn.jsdelivr.net/npm/dompdf.js@latest/dist/dompdf.js"></script>
import dompdf from 'dompdf.js';
// 选中你要转换的 DOM 节点
const element = document.querySelector('#capture');
dompdf(element)
.then((blob) => {
// 创建下载链接
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'report.pdf';
document.body.appendChild(a);
a.click();
})
.catch((err) => {
console.error('PDF 生成失败:', err);
});
生成 A4 格式文档,并添加动态页码:
dompdf(document.querySelector('#report'), {
pagination: true, // 开启分页
format: 'a4', // 纸张格式
// ⚠️ 重要:确保 #report 的宽度设置为 794px (A4 在 96dpi 下的像素宽度)
pageConfig: {
header: {
content: '公司月度报告',
height: 40,
contentColor: '#333',
contentFontSize: 14,
contentPosition: 'center'
},
footer: {
content: '第 ${currentPage} 页 / 共 ${totalPages} 页', // 支持变量
height: 40,
contentColor: '#666',
contentFontSize: 12,
contentPosition: 'center'
}
}
}).then(/* ... */);
💡 防断裂技巧:如果不希望某个区块(如表格行、卡片)被分页切断,给该元素添加 divisionDisable 属性:
<div divisionDisable>此内容将整体移至下一页,不会被切断</div>
由于 jsPDF 默认只内置西文字体,生成中文 PDF 会出现乱码。dompdf.js 提供了便捷的 fontConfig 配置项,支持加载 Base64 格式的 .ttf 字体。
推荐方案:使用体积较小的思源黑体 (Source Han Sans) 或类似中文字体。
import myFontBase64 from './fonts/SourceHanSansCN-Regular.base64.js'; // 假设你已转换好
dompdf(element, {
fontConfig: [
{
fontFamily: 'Source Han Sans CN', // 必须与 CSS 中的 font-family 一致
fontBase64: myFontBase64, // .ttf 文件的 Base64 字符串
fontStyle: 'normal',
fontWeight: 400
}
]
});
| 参数 | 类型 | 说明 |
|---|---|---|
pagination | boolean | 是否开启自动分页 (默认 false) |
format | string | 纸张规格 (a4, letter, a3 等) |
useCORS | boolean | 允许加载跨域图片 (需服务端配合 CORS) |
backgroundColor | string/null | 背景色,设为 null 可生成透明背景 PDF |
encryption | object | PDF 加密配置 (密码、权限控制) |
compress | boolean | 是否压缩输出文件 (默认 false) |
putOnlyUsedFonts | boolean | 仅嵌入实际用到的字体,减小体积 |
onJspdfReady | Function | jsPDF 实例初始化后的回调,可进行底层定制 |
✅ 最佳场景:
⚠️ 注意事项:
<iframe> 内容。






