代码之家  ›  专栏  ›  技术社区  ›  farhan jatt

Playwright page.pdf()只获取一个页面

  •  2
  • farhan jatt  · 技术社区  · 2 年前

    我一直在尝试将html转换为pdf。我试过很多工具,但都不管用。现在我使用的是player,它正在将页面转换为PDF,但它只获得第一个屏幕视图。从那一页开始,右边的内容被修剪掉了。

    import os
    import time
    import pathlib
    from playwright.sync_api import sync_playwright
    
    filePath = os.path.abspath("Lab6.html")
    fileUrl = pathlib.Path(filePath).as_uri()
    fileUrl = "file://C:/Users/PMYLS/Desktop/Code/ScribdPDF/Lab6.html"
    with sync_playwright() as p:
        browser = p.chromium.launch()
        page = browser.new_page()
        page.goto(fileUrl)
        for i in range(5): #(The scroll is not working)
            page.mouse.wheel(0, 15000)
            time.sleep(2)
        page.wait_for_load_state('networkidle') 
        page.emulate_media(media="screen")
        page.pdf(path="sales_report.pdf")
        browser.close()
    

    Html视图

    Html view

    运行脚本后的PDF文件 pdf view 我几乎试过互联网上所有可用的工具。我也使用了硒,但效果相同。我认为这是由于页面加载不正确,我添加了等待并手动滚动整个页面以加载内容。所有这些都给出了相同的结果。

    我正在转换的html https://drive.google.com/file/d/16jEq52iXtAMCg2FDt3VbQN0dCQmdTip_/view?usp=sharing

    1 回复  |  直到 2 年前
        1
  •  1
  •   ggorlen Hoàng Huy Khánh    2 年前

    这是一个对我有用的有点脏的解决方案。这个 sleep 滚动不是很好,可能可以改进,但我将把它作为一个开始,看看以后是否有时间收紧它(也可以随意这样做)。

    from playwright.sync_api import sync_playwright # 1.37.0
    from time import sleep
    
    
    with open("index.html") as f:
        html = f.read()
    
    with sync_playwright() as p:
        browser = p.chromium.launch()
        page = browser.new_page()
        page.set_content(html)
    
        # focus inside the annoying border to enable scroll
        page.click(".document_container")
    
        for i in range(10):
            page.mouse.wheel(0, 2500)
            sleep(0.5)
    
        # strip out the annoying border that messes up PDF generation
        page.evaluate("""() => {
            const el = document.querySelector(".document_scroller");
            el.parentElement.appendChild(el.querySelector(".document_container"));
            el.remove();
        }""")
        page.emulate_media(media="screen")
        page.pdf(path="sales_report.pdf")
        browser.close()
    

    两个技巧:

    1. 单击边界区域内部可以进行滚动,这似乎是加载所有内容所必需的。
    2. 撕开恼人的边界可以让PDF生成捕获所有页面。当边界存在时,主体上没有滚动,只有内部容器,PDF捕获似乎不理解这一点。
    推荐文章