rust 真的强到没朋友,在前端轻松生成 10000 页以上的矢量 PDF

lmq1919 2026-07-15 09:38 1

最近用 rust+wasn 重构了我的前端 PDF 生成库 dompdf.js ,重写了 PDF 分页、渲染引擎,发现真的越快越好。


之前的项目介绍,开源了一个 html 转 pdf 的 js 库,这应该是 html 转 pdf 最正确的思路了


性能提升,完全碾压现有的前端 PDF 生成方案



  • 生成速度快,实测 1000 页 PDF 只要 5 秒,老版本生成 1000 页非常勉强

  • 生成的是矢量的 PDF ,可以对 PDF 的文本进行搜索,选中,编辑。

  • PDF 文件体积非常小

  • 生成 10000 页以上的 PDF 毫无压力

  • 使用简单,一行代码即可将 html 页面转成 pdf

  • 精准的分页,避免元素,文字被切割

  • 代码体积减少到了原来的 35%


在线体验


https://dompdfjs.lisky.com.cn


Git 仓库地址 (欢迎 Star⭐⭐⭐)


https://github.com/lmn1919/dompdf.js

最新回复 (23)
  • thinkwei2012 07-15 10:25
    1
    先 star 一下
  • alphagao 07-15 10:42
    2
    支持设置页眉页脚嘛~
  • Yjhenan 07-15 10:42
    3
    非常棒!之前我就在想 html2canvas 既然可以绘制在 canvas 上,岂不是也可以绘制在 PDF?不过一直没去研究😂😂
  • Sundayz 07-15 10:44
    4
    Rust 确实快的离谱还节约内存,我的工具链已经都切换到 Rust 了,比如从 VS Code 切换到了 Zed 。
  • lmq1919 楼主 07-15 13:23
    5
    @alphagao 那必须支持的
  • lmq1919 楼主 07-15 13:24
    6
    @Yjhenan 现在有 ai ,有想法马上行动😄
  • yautou 07-15 13:24
    7
    @Sundayz zed 是用 rust 写的么,为啥安装包有一百多 MB ,不符合直觉啊
  • lmq1919 楼主 07-15 13:24
    8
    @Sundayz 就是学习曲线有点陡😂
  • clemente 07-15 13:33
    9
    其实不懂需求是什么?
    chrome 的 打印转 pdf 区别是?
  • wzw 07-15 13:36
    10
    @lmq1919 #8 ai 写, 是不是曲线就不管了, 哈哈
  • yuandong 07-15 14:37
    11
    支持 markdown 转 pdf 吗
  • lmq1919 楼主 07-15 15:24
    12
    @clemente 这个覆盖不了所有需求场景。像一些前端 PDF 生成库,比如 pdfkit,jspdf,pdfmake,html2pdf.js,周下载量都在 100 万以上,说明需求场景还是很多的
  • lmq1919 楼主 07-15 15:25
    13
    @yuandong 我的示例里有 markdown 转 html 再生成 pdf 的,直接转 pdf 不行
  • clemente 07-15 15:56
    14
    @lmq1919 哦哦哦确实
  • kisaho 07-15 16:03
    15
    使用 Demo 后提出以下体验感受:
    1. 并没有做到精准分割,该被切割的部分还是被切割。这个我之前有做过类似的项目,如果非要做到不被硬切割,那只能使用装箱算法:提前给每个需要导出的块一个标记,然后获取这些所有打了标记的块,循环标记块 => 转为 canvas => 转为图片 => 放到导出结果集中,超出预设 pdf 页面高度就加一页,如此反复直到结束。

    2. 测试导出万页时 demo 直接卡死,该场景不太常见,建议隐去万页导出选项。

    3. 对比 html2pdf 的优势目前来看就是博主的插件导出来的体积更小,产物可操作性更多。
  • peihuan 07-15 16:14
    16
    浏览器兼容性测试如何,chrome ,safari 甚至 edge , 导出的 pdf 样式都能保持一致吗
  • SeanYou 07-15 16:27
    17
    @peihuan 测试了一下导出的样式,好像根据你呈现的样式一样。
  • lmq1919 楼主 07-15 16:32
    18
    @peihuan 测了火狐,欧朋,edge,chrome 没问题,safari 目前手上没设备测试
  • lmq1919 楼主 07-15 16:37
    19
    @kisaho 感谢反馈😂。其实第一问题已经实现了的,不用你的方式那么复杂,给对应节点加上 divisionDisable 即可,如果这个节点被分割,那么它会被整体移动到下一页。只是我的示例有部分节点没有加这个属性。还有 pageBreak 属性,会强制将节点移到下一页。可以看看第一个示例的第 8 页
  • xing7673 07-15 17:28
    20
    @yautou 但是 zed 确实快,肉眼可见的体验提升。只不过现在还有一些 bug ,等它们出正式版起再去用也来得及
  • BruceXu 07-15 19:39
    21
    很棒,前端项目可以用来替换 html2pdf 么?

    我看使用的是 rust+wasn,对我的项目有啥要求没有?
  • lmq1919 楼主 07-15 19:44
    22
    @BruceXu 可以尝试一下,完全可以替代 ,rust+wasn 可以在浏览器运行,
  • herozzm 07-15 20:45
    23
    不错,刚好可以用上
* 帖子来源V2EX
返回