使用Selenium实现网页自动导出彩色PDF到Python脚本同目录的方法咨询
Selenium 自动化生成彩色PDF到脚本同级目录的实现方案
核心思路
手动按Ctrl+P唤起的是操作系统原生打印窗口,Selenium本身没有权限直接操作这类系统级控件,硬写模拟按键点弹窗的方案稳定性极差。最落地的实现路径是直接调用Chrome浏览器内置的DevTools打印协议,跳过所有预览、弹窗交互环节,直接完成彩色PDF生成、本地存储的全流程。
具体实现步骤
1. 配置Chrome启动参数,锚定存储路径
提前把浏览器的默认下载、另存为路径锁定为当前Python脚本的同级目录,关闭所有会打断自动化流程的系统弹窗:
import os from selenium import webdriver from selenium.webdriver.chrome.options import Options # 获取当前Python脚本的绝对路径所在文件夹,避免相对路径定位偏差 current_script_dir = os.path.dirname(os.path.abspath(__file__)) chrome_options = Options() chrome_options.add_experimental_option("prefs", { # 锁定默认下载路径为脚本同级目录 "download.default_directory": current_script_dir, # 关闭“选择下载路径”的系统弹窗 "download.prompt_for_download": False, # 浏览器打印预览默认选中“另存为PDF”选项 "printing.print_preview_sticky_settings.appState": '{"recentDestinations":[{"id":"Save as PDF","origin":"local","account":""}],"selectedDestinationId":"Save as PDF","version":2}', # 锁定“另存为文件”的默认路径为脚本同级目录 "savefile.default_directory": current_script_dir }) # 可选:开启无界面模式,运行时不会弹出浏览器窗口 # chrome_options.add_argument("--headless=new") driver = webdriver.Chrome(options=chrome_options)
2. 调用CDP打印接口,配置彩色输出参数
不需要等待打印预览窗口加载,直接通过Chrome的内部调试协议触发打印动作,传入对应的彩色渲染参数,直接拿到PDF的二进制内容写入本地:
# 打开目标待打印的网页 driver.get("替换为你的目标网页地址") # 等待页面内容加载完成,避免生成的PDF存在内容缺失 driver.implicitly_wait(5) # 核心打印参数配置 print_params = { "landscape": False, # 默认纵向排版,需要横向打印可改为True "displayHeaderFooter": False, # 自动去掉浏览器默认添加的页眉页脚 "printBackground": True, # 必须开启:否则网页的彩色背景、图片会被过滤成黑白 "color": True, # 核心配置:开启彩色输出模式,默认值为False即黑白打印 "paperWidth": 8.27, # A4纸宽度,单位为英寸 "paperHeight": 11.69, # A4纸高度,单位为英寸 "margin": {"top": "0.4", "bottom": "0.4", "left": "0.4", "right": "0.4"} # 页边距调整 } # 执行打印命令获取PDF数据 pdf_binary = driver.execute_cdp_cmd("Page.printToPDF", print_params) # 把生成的PDF直接写入脚本同级目录 save_file_path = os.path.join(current_script_dir, "auto_exported.pdf") with open(save_file_path, "wb") as output_file: output_file.write(pdf_binary["data"].encode("latin1")) # 流程结束后关闭浏览器 driver.quit()
实操注意事项
- 不要硬写模拟
Ctrl+P按键、点击预览窗口元素的逻辑:Chrome的打印预览窗口属于Shadow DOM结构,元素定位的稳定性极差,随Chrome版本迭代很容易失效,CDP接口的方式不受前端页面结构、小版本更新的影响,长期运行的可靠性更高。 - 彩色PDF生效的两个必要条件:除了把
color参数设为True,必须同步开启printBackground: True,否则网页上的彩色色块、带背景的彩色按钮、彩色图片都会被浏览器默认替换成灰度内容,达不到彩色打印的效果。 - 路径定位的稳定性注意:不要用相对路径
./指向脚本目录,一定要用os.path.abspath(__file__)获取脚本所在的绝对路径,避免脚本被其他程序从不同工作目录调用时,生成的PDF被存到错误的位置。
内容的提问来源于stack exchange,提问作者Tkinter Lover
相关产品推荐
相关产品推荐

