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

有什么 HTML 转 PDF 的开源工具推荐吗?

  •  
  •   deacyn · 2023-07-06 23:53:42 +08:00 via iPhone · 3683 次点击
    这是一个创建于 540 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以前使用的工具是 wkhrmltopdf

    工具希望能够运行在服务器上

    各位公司都在用什么工具呢
    30 条回复    2024-03-20 11:52:12 +08:00
    harrozze
        1
    harrozze  
       2023-07-06 23:58:24 +08:00
    python3-xhtml2pdf/stable 0.2.5-3 all
    A library for converting HTML into PDFs using ReportLab (Python 3 module)
    deacyn
        2
    deacyn  
    OP
       2023-07-07 00:03:07 +08:00 via iPhone
    @harrozze 支持 css3 和 js es6 语法吗?
    dcsuibian
        3
    dcsuibian  
       2023-07-07 00:11:21 +08:00
    puppeteer ?
    deacyn
        4
    deacyn  
    OP
       2023-07-07 00:13:15 +08:00 via iPhone
    @dcsuibian 不知道是使用方式不对还是怎么着,发现使用这个生成的 pdf 比 wkhtmltopdf 工具大一倍,尤其是在有图片的时候。
    justNoBody
        5
    justNoBody  
       2023-07-07 00:23:11 +08:00 via iPhone   ❤️ 4
    chrome 无头模式最佳

    google-chrome --headless --disable-gpu --print-to-pdf=$output_file $html_file
    qsnow6
        6
    qsnow6  
       2023-07-07 00:31:53 +08:00
    调用 Chrome 的打印功能就行
    learningman
        7
    learningman  
       2023-07-07 00:38:28 +08:00 via Android
    你要支持 js ,那最好还是无头浏览器
    deacyn
        8
    deacyn  
    OP
       2023-07-07 08:39:25 +08:00 via iPhone
    @justNoBody 之前测试了一下 puppeteer ,发现生成的文件太大了,有什么办法解决吧吗
    jifengg
        9
    jifengg  
       2023-07-07 08:49:16 +08:00
    前段时间浅浅研究过这俩,wkhtmltopdf 貌似有些支持不是很好,后来用 chrome headless 出来的都挺好,也支持 js 渲染。
    不过最好是用 puppeteer ,命令行的方式有些参数不生效。

    至于楼主说的体积大一倍,建议楼主可以看看两个 pdf 放大之后,图片清晰度是否一样。如果不一样可以看看哪里有设置 dpi 之类的。
    joooooker21
        10
    joooooker21  
       2023-07-07 09:05:05 +08:00
    wkhtmltopdf 也可以运行在服务器上
    jiejia
        11
    jiejia  
       2023-07-07 09:41:42 +08:00
    PhantomMagick
    NealDing
        12
    NealDing  
       2023-07-07 09:49:34 +08:00
    @deacyn puppeteer 应该是目前最强大易用的了,如果有大文件的问题建议把生成功能模块建个 repo 发一下,大家一起帮忙看看
    dcdlove
        13
    dcdlove  
       2023-07-07 10:05:16 +08:00
    只要系统安装有谷歌浏览器就可以 --print-to-pdf-no-header 隐藏打印的页头脚
    google-chrome --headless --disable-gpu --print-to-pdf-no-header --print-to-pdf=test.pdf
    https://www.v2ex.com/t/954703#reply10
    dcdlove
        14
    dcdlove  
       2023-07-07 10:09:56 +08:00
    @deacyn puppeteer 最后调用的还是 chrome 的无头模式 只是定死了一个浏览器内核 所以最好还是直接调用 chrome 输出 最好,想用那个版本就装那个版本 服务端也能调用
    C:\Program Files\Google\Chrome\Application\chrome.exe --headless --print-to-pdf-no-header --print-to-pdf="test.pdf" --disable-gpu "http://www.baidu.com"
    leroy20317
        15
    leroy20317  
       2023-07-07 10:12:02 +08:00
    生成 pdf 我用的也是 puppeteer 就是在服务器中运行时间长了之后内存占用一直在增加 不知道是配置有问题还是这个本身就这样 只能定时去重启服务
    forQ
        17
    forQ  
       2023-07-07 14:28:25 +08:00
    playwright
    yjd
        18
    yjd  
       2023-07-07 15:17:50 +08:00
    @dcdlove 这种转一个要创建一次进程,相当耗资源。内存回收不及时,就会像上面说的持续增长。
    dcdlove
        19
    dcdlove  
       2023-07-07 15:29:58 +08:00
    @yjd 但是生产速度真的刚刚的几乎没延迟,目前服务器通过 cmd 调用完成就结束释放没出现内存无法回收的情况
    Breacher
        20
    Breacher  
       2023-07-07 15:43:44 +08:00 via iPhone   ❤️ 1
    前段时间刚做了个 HTML 生成 PDF 发票的功能,调研了 wkhrmltopdf ,发现它好久没更新了,有些 JS 特性它不支持。最后用了 Gotenburg ,一个打包了无头 Chrome 和常用字体的开箱即用的方案。
    Breacher
        21
    Breacher  
       2023-07-07 15:45:02 +08:00 via iPhone
    @Breacher gotenberg
    yjd
        22
    yjd  
       2023-07-07 16:32:47 +08:00
    @dcdlove 多谢。 下次测试看看。
    之前我用的是第三方软件 coolutils ,htmlToPdf 不理想转出来排版很差。
    adnoh
        23
    adnoh  
       2023-07-07 16:37:54 +08:00 via Android
    用过 phantomjs
    leroy20317
        24
    leroy20317  
       2023-07-07 16:39:54 +08:00
    @yjd 确实是的 重复创建耗资源而且有时候会出现丢失 所以才提前创建几个 page 所有的转换任务都只在这几个 page 中渲染转换 可能就是这样才会内存一直在叠加吧
    haokuixi
        25
    haokuixi  
       2023-07-07 17:35:10 +08:00
    @dcdlove 这个好使,感谢
    yh648559276
        26
    yh648559276  
       2023-07-07 17:50:25 +08:00
    @dcdlove 为什么我执行没有本地没有找到 test.pdf
    dcdlove
        27
    dcdlove  
       2023-07-07 19:33:14 +08:00
    @yh648559276 可以写绝对地址,相对路径会在浏览器 bin 目录下
    xeneizes
        28
    xeneizes  
       2023-07-08 08:34:44 +08:00
    @dcdlove 银河麒麟 sv 系统 可以用这种方案吗 arm 系统可以装 chrome 吗
    zero3412
        29
    zero3412  
       2023-07-08 15:11:43 +08:00
    @Breacher 感觉这个挺好的,麻烦点在需要独立服务器
    正好我也有个项目有这需求,目前使用的是 mPDF ,支持度一般般,要求别太高的都 OK
    solgh
        30
    solgh  
       282 天前
    我目前也是用 mPDF , puppeteer 也用過,puppeteer 直接將 HTML 頁面打印出來的效果是非常好的,但是生成出來的 PDF 內容高度和原 HTML 高度相差總是有差別
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2379 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 15:56 · PVG 23:56 · LAX 07:56 · JFK 10:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.