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

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

  •  2
     
  •   lmq1919 · 20 小时 30 分钟前 · 3553 次点击

    大概的实现步骤:

    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

    36 条回复    2026-01-21 00:47:50 +08:00
    yangxiaopeipei
        1
    yangxiaopeipei  
       20 小时 13 分钟前
    打印不是更快吗
    cpstar
        2
    cpstar  
       20 小时 12 分钟前
    @yangxiaopeipei #1 服务器上后台服务咋打印
    kuxuan
        3
    kuxuan  
       20 小时 11 分钟前
    收藏了。
    evan1
        4
    evan1  
    PRO
       20 小时 8 分钟前
    @cpstar #2 无头浏览器
    herbloo
        5
    herbloo  
       20 小时 3 分钟前
    @evan1 正解吧,不内嵌一个 chrome 进去,很难做到全兼容
    spark
        6
    spark  
       20 小时 1 分钟前
    @cpstar puppeteer, playwright
    jifengg
        7
    jifengg  
       20 小时 0 分钟前
    之前关注过,先说一下网站证书过期了。
    另外,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
       19 小时 58 分钟前
    @herbloo #5 是的,我做过这个。当时做了很久,各种方案都尝试了,最后发现还是得无头浏览器。其它 js 方式生成的多多少少都会有转换的问题。比如 table 的高度、边框宽度、二维码清晰度之类的。

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