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

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

  •  3
     
  •   lmq1919 · 3 天前 · 4756 次点击

    大概的实现步骤:

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

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