Playwright Python生成PDF空白/格式错误问题求助
解决方案:Playwright Python处理PDF预览页生成PDF的空白/格式错误问题
核心原因
直接访问PDF URL时,Chromium会启动内置PDF阅读器,而page.pdf()是针对网页HTML内容的渲染工具,无法正确识别阅读器内的PDF内容,导致空白或格式错误;旧版无头模式(headless=True)对PDF阅读器的兼容性较差,引发运行失败。
方案1:直接下载PDF(推荐,高效可靠)
目标URL本身就是PDF文件,无需通过页面渲染,直接发起网络请求获取文件内容:
def test(): from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) context = browser.new_context() # 发起GET请求获取PDF原始内容 response = context.request.get('https://nyc3.digitaloceanspaces.com/midia/wp-content/uploads/2023/01/4tmrioel-sample.pdf') # 验证请求是否成功 assert response.ok, f"请求失败,状态码:{response.status}" # 将二进制内容写入本地文件 with open('Test.pdf', 'wb') as f: f.write(response.body()) browser.close() test()
方案2:禁用PDF阅读器,通过页面触发下载(适用于间接打开PDF的场景)
使用Playwright新版无头模式(headless="new"),搭配禁用PDF阅读器的启动参数,让浏览器直接触发PDF下载而非预览:
def test(): from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch( headless="new", args=[ "--disable-pdf-extension", "--disable-plugin-pdf-viewer", "--plugins=0" ] ) context = browser.new_context() page = context.new_page() # 监听下载事件,访问URL时自动触发下载 with page.expect_download() as download_info: page.goto('https://nyc3.digitaloceanspaces.com/midia/wp-content/uploads/2023/01/4tmrioel-sample.pdf') download = download_info.value # 保存下载的PDF文件 download.save_as('Test.pdf') browser.close() test()
原代码无效的原因
headless=False时,PDF阅读器界面加载需要时间,page.pdf()执行过早会捕获空白页面;- 旧版
headless=True模式对PDF阅读器的支持存在兼容性问题,导致无法正常运行; page.pdf()生成的是网页渲染结果,而非原始PDF内容,因此会出现阅读器UI导致的格式错误。
内容的提问来源于stack exchange,提问作者Pedro Pessuto
相关产品推荐
相关产品推荐

