如何使用 Java 将一个网页转成 PDF - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
linmt
V2EX    程序员

如何使用 Java 将一个网页转成 PDF

  •  
  •   linmt 2024-01-20 09:39:15 +08:00 3512 次点击
    这是一个创建于 630 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前用的是 playwright ,但是当网页有十几页的时候就很慢,有其他方法吗

    1. 需要等网页加载完成之后再生成 PDF
    2. 可以设置生成 PDF 的宽度
    3. 可以设置每页 PDF 的高度
    19 条回复    2024-01-26 17:07:32 +08:00
    fzazhao
        1
    fzazhao  
       2024-01-20 10:29:53 +08:00 via Android
    用 Selenium
    flyqie
        2
    flyqie  
       2024-01-20 10:42:01 +08:00 via Android
    你需要的是无头浏览器。。

    并且,你要转的到底是可复制的那种还是不可复制的那种?

    不可复制的话无头浏览器直接截图拼,可复制的话就得调无头导 pdf 了。
    youknowiam
        3
    youknowiam  
       2024-01-20 10:48:47 +08:00
    我用的 headless-chrome ,https://github.com/rust-headless-chrome/rust-headless-chrome ,Java 也有类似的框架。
    flyqie
        4
    flyqie  
       2024-01-20 11:27:28 +08:00
    @flyqie #2

    刚才搜了下 playwright ,发现也是个无头框架,但感觉好像。。没怎么见过?
    cvbnt
        5
    cvbnt  
       2024-01-20 11:36:04 +08:00 via Android
    ironpdf ?
    gouflv
        6
    gouflv  
       2024-01-20 14:43:50 +08:00 via iPhone
    Playwright 的性能似乎比 Selenium 、Puppeteer 差一点
    Dockerfile
        7
    Dockerfile  
       2024-01-20 14:46:19 +08:00
    除了无头浏览器,还有一个 wkhtmltopdf ,但是效果应该比无头浏览器稍微差一点
    linmt
        8
    linmt  
    OP
       2024-01-20 16:37:41 +08:00
    @Jwyt 这个好像已经不更新了,不敢用
    linmt
        9
    linmt  
    OP
       2024-01-20 16:40:30 +08:00
    @gouflv 也有试过用 Selenium ,用不来,但是这个好像也是用的浏览器 driver
    linmt
        10
    linmt  
    OP
       2024-01-20 16:41:07 +08:00
    @flyqie 这个偏向于用做自动化测试
    linmt
        11
    linmt  
    OP
       2024-01-20 16:41:55 +08:00
    @youknowiam playwright 也是用的 headless-chrome
    500
        12
    500  
       2024-01-20 20:19:54 +08:00
    可以试试这个开源库 https://github.com/danfickle/openhtmltopdf
    neoblackcap
        13
    neoblackcap  
       2024-01-20 20:30:27 +08:00
    @flyqie 没记错的话,是 Puppeteer 那批人做的。相同的人,在 Google 做了 Puppeteer ,去微软做了 Playwright
    linmt
        14
    linmt  
    OP
       2024-01-20 21:43:26 +08:00
    @paulluis2dev 这个也两年多没更新了,而且不支持 flex 和 grid 布局,用不了
    kongkx
        15
    kongkx  
       2024-01-20 22:43:46 +08:00 via iPhone
    目前看,样式支持最好是 headless chrome 。 要不先用命令行直接调 headless chrome 来测试一下性能? 定位一下是慢在哪里
    dengji85
        16
    dengji85  
       2024-01-22 09:22:19 +08:00
    gotenberg ,封装好的无头浏览器,docker 运行,直接调用用它的 web 接口
    jifengg
        17
    jifengg  
       2024-01-22 10:03:13 +08:00
    楼主,给你个解决问题的思路:
    1.“很慢”,是多慢?
    2.既然“playwright 也是用的 headless-chrome”,那首先,你用浏览器打开“网页”,从打开到你调用浏览器打印命令打印到 PDF 文件完成,算算耗时;
    3.如果第二步耗时明显短( 1/10 之类的),那么用 chrome --headless 试试打印这个网页看看是否也差不多;
    4.如果还是明显比第一步时间短,那么可能是 playwright 某些问题导致的,可以考虑自己调 chrome 命令行或换一个 headless chrome 封装。
    5.如果 1 、2 、3 耗时都差不多,那就和工具无关了
    yh7gdiaYW
        18
    yh7gdiaYW  
       2024-01-22 10:29:37 +08:00
    @flyqie 微软挖了 puppeteer 的团队成员做的,前两年 star 涨的很快。相对来说,playwright 更偏向自动测试一些,且 API 更丰富友好
    zhangdahai
        19
    zhangdahai  
       2024-01-26 17:07:32 +08:00
    你确定 playwright 不能直接调用浏览器的 screenshot 方法?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     928 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 19:13 PVG 03:13 LAX 12:13 JFK 15:13
    Do have faith in wht you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86