PDF Rendering Engine Benchmark

对比矢量渲染引擎与传统的 HTML-Canvas-to-Image 拼接输出

WASM + Worker (矢量) v0.10.1 (图片拼接)
测试文档:
检测字体文件中...

dompdf.js (WASM)

调用主线程收集轻量级 DOM 状态,通过 Worker 传给后台的 Rust-WASM 模块直接渲染出底层的矢量图元 PDF 流。

html2pdf.js

基于 html2canvas 对当前 DOM 进行像素级截图并返回 Canvas,再通过 jsPDF 把 Canvas 图片嵌入写入 PDF 文档。

一键性能基准测试

在当前运行环境中先后串行执行两种引擎的 PDF 转换流程,以对比耗时和最终生成的 PDF 文件字节大小。

生成速度 (生成耗时)
dompdf.js (WASM) --
html2pdf.js --
等待测试数据
输出文件体积 (PDF 大小)
dompdf.js (WASM) --
html2pdf.js --
等待测试数据
PDF 输出属性 (渲染技术)
dompdf.js (WASM) --
html2pdf.js --
矢量引擎下文本支持任意放大而不模糊,内容可自由选择并复制;而截图嵌入的 PDF 会随缩放产生栅格马赛克。
HTML 源文档 标准 A4 页面渲染 (794px × 1123px)
文本追加
段
仅“纯文本长文示例”支持追加,且只插入文本段落
技术特征 dompdf.js (WASM 版) html2pdf.js
技术机制 Rust + WASM + Web Worker 后台转换 html2canvas 渲染像素 + jsPDF 拼接
渲染输出 原生 PDF 矢量元指令 (纯矢量图文) 栅格图片嵌入 (截图合成)
文本选择与检索 原生支持 (可拖拽选中、全文复制/搜索) 不支持 (输出为纯图片)
缩放清晰度 无损缩放 (任意分辨率打印保持极清) 放大失真 (受截图分辨率限制)
分页渲染极限 不受限制 (内存允许可渲染数千页) 受限 (受 Canvas 浏览器像素上限限制)
UI 线程卡顿 无感 (在独立 Worker 后台运算) 严重卡顿 (截图与像素读取会阻塞主线程)
中文字体嵌入 支持 (支持 TTF 字体子集化打包嵌入) 无需 (但输出实际为文本图像)

dompdf.js 调用示例 (WASM 模式)

const element = document.querySelector('#capture-area');

// 准备字体配置 (仅在中英文混合电子发票且已加载字体时配置)
const fontConfig = window.customFontBytes ? {
  fontFamily: 'SourceHanSansSC-Regular',
  fontBytes: window.customFontBytes,
  fontStyle: 'normal',
  fontWeight: 400
} : undefined;

const options = {
  pagination: true,            // 开启自动分页
  format: 'a4',                // A4标准尺寸
  useCORS: true,               // 支持跨域图片加载
  compress: true,              // 压缩开关
  putOnlyUsedFonts: true,      // 仅嵌入所用字形字重
  fontConfig: fontConfig       // 注入字体
};

window.dompdf(element, options)
  .then(blob => {
    const blobUrl = URL.createObjectURL(blob);
    iframe.src = blobUrl;
  })
  .catch(err => console.error(err));

html2pdf.js 调用示例

// 引入 html2pdf.js,通过配置 html2canvas 与 jsPDF 完成生成
const element = document.querySelector('#capture-area');

const opt = {
  margin: 0,
  filename: 'html2pdf-export.pdf',
  image: { type: 'jpeg', quality: 2 },
  html2canvas: { 
    scale: 2,           // 决定渲染分辨率
    useCORS: true, 
    logging: false,
    scrollY: 0,         // 解决网页滚动时 HTML 截图向下偏移的问题
    scrollX: 0
  },
  jsPDF: { 
    unit: 'pt', 
    format: 'a4', 
    orientation: 'portrait' 
  },
  pagebreak: { 
    mode: ['css', 'legacy'],
    avoid: ['tr', 'h1', 'h2', 'h3', '.report-stat-card', '.report-chart-container', '.invoice-details-grid > div', '[divisionDisable]']
  }
};

html2pdf()
  .from(element)
  .set(opt)
  .output('blob')
  .then(blob => {
    // 渲染生成图片拼贴型 PDF
    const blobUrl = URL.createObjectURL(blob);
    iframe.src = blobUrl;
  });