爱意满满的作品展示区。
lmq1919

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

  •  
  •   lmq1919 · 17h 19m ago · 3864 views

    最近用 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

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

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

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

    我看使用的是 rust+wasn,对我的项目有啥要求没有?
    lmq1919
        22
    lmq1919  
    OP
       7h 13m ago
    @BruceXu 可以尝试一下,完全可以替代 ,rust+wasn 可以在浏览器运行,
    herozzm
        23
    herozzm  
       6h 12m ago
    不错,刚好可以用上
    ericFork
        24
    ericFork  
       46 mins ago
    已经用上了,翻新了一个陈年老项目,感谢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   971 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 18:57 · PVG 02:57 · LAX 11:57 · JFK 14:57
    ♥ Do have faith in what you're doing.