V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lmq1919
V2EX  ›  程序员

开源了一个 html 转 pdf 的 js 库,这应该是 html 转 pdf 最正确的思路了

  •  3
     
  •   lmq1919 · 10 天前 · 5135 次点击

    大概的实现步骤:

    1.解析 html 页面,生成一个包含节点位置信息,样式,层级,内容等信息的 DOM 树。

    2.递归 DOM 树,根据节点据顶部的高度和生成页面规格的高度,将节点分配到不同的页面。

    3.调用 jspdf.js 的 api,将节点绘制到 PDF 文件上。

    优点:

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

    2.生成的文件体积很小

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

    4.精准的分页,避免元素被切割。

    5.如果文件体积不大,而且电脑性能支持,可以生成几千页的 PDF

    1. 具体的说明

    https://juejin.cn/post/7583912637470769203

    1. 在线体验

    https://dompdfjs.lisky.com.cn

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

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

    46 条回复    2026-01-23 08:51:00 +08:00
    yangxiaopeipei
        1
    yangxiaopeipei  
       10 天前
    打印不是更快吗
    cpstar
        2
    cpstar  
       10 天前
    @yangxiaopeipei #1 服务器上后台服务咋打印
    kuxuan
        3
    kuxuan  
       10 天前
    收藏了。
    evan1
        4
    evan1  
    PRO
       10 天前
    @cpstar #2 无头浏览器
    herbloo
        5
    herbloo  
       10 天前
    @evan1 正解吧,不内嵌一个 chrome 进去,很难做到全兼容
    spark
        6
    spark  
       10 天前
    @cpstar puppeteer, playwright
    jifengg
        7
    jifengg  
       10 天前
    之前关注过,先说一下网站证书过期了。
    另外,demo 导出的 pdf ,没有最后的 line chart 。不知道是不是个例。UA:'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36'
    evan1
        8
    evan1  
    PRO
       10 天前
    @herbloo #5 是的,我做过这个。当时做了很久,各种方案都尝试了,最后发现还是得无头浏览器。其它 js 方式生成的多多少少都会有转换的问题。比如 table 的高度、边框宽度、二维码清晰度之类的。

    无头浏览器缺点就是占内存,不过用线程池+队列轮换处理也还好。
    cirzear
        9
    cirzear  
       10 天前
    lmq1919
        10
    lmq1919  
    OP
       10 天前
    @jifengg 感谢关注😄,证书已经更新
    lmq1919
        11
    lmq1919  
    OP
       10 天前
    @yangxiaopeipei 打印有的需求满足不了😭
    dbit
        12
    dbit  
       10 天前
    兼容好像有问题, ubuntu 下载下来, 用 Xreader 打开全部是空白页
    avenger
        13
    avenger  
       10 天前
    这个支持 serverless 环境吗?
    在线体验打不开了,正好有这个需求
    目前用的是 @sparticuz/chromium-min
    webszy
        14
    webszy  
       10 天前   ❤️ 1
    点了 star,支持
    lmq1919
        15
    lmq1919  
    OP
       10 天前
    @webszy 感恩
    lmq1919
        16
    lmq1919  
    OP
       10 天前
    @avenger serverless 还是用其他方案吧,我这个库推荐在前端浏览器使用
    xz410236056
        17
    xz410236056  
       10 天前
    我之前简历是 HTML 的,但是 BOSS 只让传 PDF ,找了很多都找不到合适的。因为 HTML 并不是纯静态页面,需要加载部分 JS 渲染,这种时候转的 PDF 就有点问题
    zhangyunlu80
        18
    zhangyunlu80  
       10 天前
    支持 简单 echart 图表,饼图,柱状图么,支持 一些小的 icon 嘛
    lmq1919
        19
    lmq1919  
    OP
       10 天前
    @zhangyunlu80 必须支持的
    lmq1919
        20
    lmq1919  
    OP
       10 天前
    @xz410236056 我的库支持你这个需求
    54xavier
        21
    54xavier  
       10 天前   ❤️ 1
    不错不错,好活,当赏
    focuxin
        22
    focuxin  
       10 天前
    Edge 官网的直接下载都是空白页
    ysc3839
        23
    ysc3839  
       10 天前 via Android
    是正确的思路,但是是错误的做法。
    解析 html 及生成 PDF 已经有现成的工具了,那就是浏览器。
    正确的做法应该是直接使用浏览器转换,因为自己实现的 html 解析很难媲美浏览器。
    visper
        24
    visper  
       10 天前
    感觉样式肯定有些情况不对。如果需要完美方案,还是得无头浏览器。
    lmq1919
        25
    lmq1919  
    OP
       10 天前
    @ysc3839 浏览器转 pdf 不能实现所有需求,不然就不会有那么多相关的库。你用浏览器打印一下这个页面看看效果就知道了
    lmq1919
        26
    lmq1919  
    OP
       10 天前
    @visper 是会有误差,不会所有的 css 属性都支持。不过我这个方案不需要服务器支持,看需求再取舍😂
    lmq1919
        27
    lmq1919  
    OP
       10 天前
    @54xavier 感恩❤️
    archean
        28
    archean  
       10 天前
    相比 CloudFlare 的 Browser Rendering 有何优势?
    lmq1919
        29
    lmq1919  
    OP
       10 天前
    @archean 我的方案是纯前端实现 html 转 pdf 的哈,不需要服务器,可以很方便的集成到你的网址。个人项目何德何能和巨头的项目比😂
    archean
        30
    archean  
       10 天前
    @lmq1919 #29 了解了,我会去看一下
    lynan
        31
    lynan  
       10 天前
    star 支持一下,说不定哪天就用得到了
    otakustay
        32
    otakustay  
       10 天前
    我有个疑问,这样生成的 PDF ,再用做下游的消费,比如 PDF 转到 Markdown ,还能保留最原始 HTML 里的信息层级结构吗
    ulyssess
        33
    ulyssess  
       10 天前
    mark 一下,明天试一试你这个。现在用的就是 html2pdf 这个库,有几个问题:1. 页数多了会出现空白,因为 canvas 太大了 2. 分页的时候会切割元素。
    Irisviel
        34
    Irisviel  
       10 天前
    感谢分享,之前搞 Mermaid 导出截图一直渲染不了,试试你这个方案~
    lizhenda
        35
    lizhenda  
       10 天前
    官网打开有点慢哦,Edge 打开该 pdf 文件确实会是空白,使用别的本地 pdf 查看工具看就是正常的。
    lmq1919
        36
    lmq1919  
    OP
       10 天前
    @ulyssess 我的方案在努力解决这些问题,不是基于 canvas 的,页数多也不会出现空白
    spritecn
        37
    spritecn  
       9 天前
    用过 java Itext 版本的,坑很多
    xuying
        38
    xuying  
       9 天前
    看着不错 要是有油猴插件就更好了
    xmdbb
        39
    xmdbb  
       8 天前
    不知道啥问题,我直接在线体验导出是六页空白的 PDF
    lmq1919
        40
    lmq1919  
    OP
       8 天前
    @xmdbb 有开发的计划
    lmq1919
        41
    lmq1919  
    OP
       8 天前
    @xmdbb edge 浏览器打开有点问题,可以试一下其他方式打开
    xmdbb
        42
    xmdbb  
       8 天前
    @lmq1919 这个就有点头痛;
    目前有些项目就是用 js-pdf 来导出,但是遇到表格分页的时候,就会导致文字直接砍断,或者表格直接截断。
    而且也没办法要求客户使用这个或那个浏览器
    lmq1919
        43
    lmq1919  
    OP
       8 天前
    @xmdbb 我现在在处理这个问题
    lmq1919
        44
    lmq1919  
    OP
       8 天前
    @xmdbb 也不是所有情况都会这样,你可以先试一下
    xmdbb
        45
    xmdbb  
       8 天前
    @lmq1919 哈哈,理解,接触过 js-pdf 后就知道有多不易,加油,期待哪天能薅你羊毛把 js-pdf 换成你的项目
    oasis2008f
        46
    oasis2008f  
       7 天前
    动态分页的问题真是太头痛了,尝试下你的方案
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   901 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:29 · PVG 04:29 · LAX 12:29 · JFK 15:29
    ♥ Do have faith in what you're doing.