如何在Selenium Python中自动将网页保存为PDF并指定文件名
解决ChromeDriver自动保存网页为PDF时弹出文件名窗口的问题
你的核心问题在于错误配置了文件名的设置项,Chrome打印生成PDF的文件名不是通过download.name控制的,而是需要在打印预览的配置里指定。以下是修正后的完整方案:
修正后的代码
import json from selenium import webdriver from selenium.webdriver.chrome.service import Service import time # 替换为你的实际路径 download_path = "/绝对路径/到你的下载目录" ser = Service("/绝对路径/到chromedriver") # 配置打印预览的核心参数,包含文件名 settings = { "appState": { "recentDestinations": [ { "id": "Save as PDF", "origin": "local", "account": "", "filename": "test.pdf", # 这里指定PDF文件名 "margin": 0, "size": "auto" } ], "selectedDestinationId": "Save as PDF", "version": 2, "isHeaderFooterEnabled": False, # 可选:关闭默认页眉页脚 "margin": 0, "size": "auto" } } prefs = { 'printing.print_preview_sticky_settings': json.dumps(settings), 'download.default_directory': download_path, 'savefile.default_directory': download_path, 'download.prompt_for_download': False, "download.directory_upgrade": True, "safebrowsing_for_trusted_sources_enabled": False, "safebrowsing.enabled": False, # 关闭安全浏览避免干扰自动保存 "plugins.always_open_pdf_externally": False, # 禁用外部PDF打开,确保直接保存 "profile.default_content_settings.popups": 0 } options = webdriver.ChromeOptions() options.add_experimental_option('prefs', prefs) options.add_argument('--kiosk-printing') # 启用自助打印模式,自动确认保存 options.add_argument('--disable-extensions') # 禁用扩展避免冲突 driver = webdriver.Chrome(service=ser, options=options) driver.maximize_window() driver.get('你的目标网页URL') # 等待页面完全加载(可根据实际情况替换为显式等待) time.sleep(3) # 触发打印,此时将自动保存为指定文件名到目标目录 driver.execute_script('window.print();') # 等待保存完成,时间可根据页面复杂度调整 time.sleep(5) driver.quit()
关键修改说明
- 正确配置文件名:在
appState的recentDestinations对象中添加filename字段,这是Chrome打印保存PDF时识别文件名的唯一正确位置,download.name仅适用于普通文件下载,对打印生成的PDF无效。 - 调整PDF相关偏好:将
plugins.always_open_pdf_externally设为False,避免Chrome尝试用外部程序打开PDF,导致保存流程中断。 - 简化无效配置:移除了冗余的
margin和size重复配置,关闭安全浏览策略避免自动保存被拦截。
额外注意事项
- 确保
download_path是绝对路径,且Chrome有该目录的写入权限。 - ChromeDriver版本必须与本地安装的Chrome浏览器版本完全匹配,版本不兼容会导致配置失效。
- 页面加载完成后再执行打印,建议使用显式等待(如
WebDriverWait)替代固定sleep,提升稳定性。
内容的提问来源于stack exchange,提问作者Andrij Kusmich
相关产品推荐
相关产品推荐

