Python使用Selenium调用Chrome打印无法保存完整正常PDF如何解决
Selenium导出正常可编辑PDF的解决方法
问题原因
你当前使用的window.print()配合kiosk打印的方式,在部分场景下会将可视区域截图后生成PDF,无法输出矢量可复制文本的完整PDF,且容易出现内容截断问题。
推荐解决方案:使用Chrome DevTools Protocol(CDP)原生打印接口
该方法直接调用Chrome内核的PDF生成能力,输出的是标准矢量PDF,支持文本选中、格式完整,不会生成截图版文件,修改后的代码如下:
import json import base64 from selenium import webdriver chrome_options = webdriver.ChromeOptions() # 配置默认保存路径,注意Windows路径转义用双反斜杠或者正斜杠 save_path = "D:/Documents/PycharmProjects/projects/Manipule_PDF/output.pdf" chrome_options.add_experimental_option('prefs', { "savefile.default_directory": "D:/Documents/PycharmProjects/projects/Manipule_PDF" }) # 可以开启无头模式不影响生成 # chrome_options.add_argument("--headless=new") driver = webdriver.Chrome(r"D:\Documents\chrome\chromedriver.exe", options=chrome_options) url = "你要访问的目标页面地址" driver.get(url) # 等待页面完全加载,可根据实际需求调整等待逻辑,比如等待特定元素出现 driver.implicitly_wait(10) # 调用CDP的打印接口,可自定义参数控制PDF格式 pdf_params = { "landscape": False, # 横向打印设为True "displayHeaderFooter": False, # 不显示页眉页脚 "printBackground": True, # 打印背景颜色和图片 "preferCSSPageSize": True, # 优先使用页面定义的页面大小 "marginTop": 0, "marginBottom": 0, "marginLeft": 0, "marginRight": 0 } result = driver.execute_cdp_cmd("Page.printToPDF", pdf_params) # 把返回的base64内容写入PDF文件 with open(save_path, "wb") as f: f.write(base64.b64decode(result['data'])) driver.quit()
额外优化建议
- 如果页面存在懒加载内容,执行打印前先模拟滚动到页面底部,确保所有内容都加载完成,避免出现空白区域
- 可以根据实际需要调整
pdf_params中的参数,比如纸张大小、边距、是否打印背景等,实现自定义PDF格式 - 如果需要批量生成PDF,可复用driver实例,不用每次重启浏览器提升效率
内容的提问来源于stack exchange,提问作者MD Monteiro
相关产品推荐
相关产品推荐

