如何用Python与Selenium生成无分页无边距的整页PDF截图
用Selenium生成与PNG截图尺寸一致、无页边距的PDF
要生成和你当前PNG截图完全一致的PDF(无页边距、尺寸匹配页面实际大小),可以利用Chrome DevTools Protocol(CDP)的Page.printToPDF命令,精确控制打印参数,避免默认打印的格式调整。以下是实现方案:
核心思路
- 先获取页面的实际滚动宽高(和你原代码的逻辑一致)
- 通过CDP命令配置PDF打印参数:设置边距为0,纸张尺寸与页面宽高精确匹配,同时强制保留页面背景和样式
完整代码示例
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 自定义函数获取页面滚动宽高 S = lambda X: driver.execute_script('return document.body.parentNode.scroll' + X) # 配置Chrome选项(可选无头模式) chrome_options = Options() # chrome_options.add_argument('--headless=new') # 无头模式可取消注释 driver = webdriver.Chrome(options=chrome_options) driver.get('https://www.google.com') # 获取页面实际宽高 width = S('Width') height = S('Height') # 配置CDP打印PDF的参数 pdf_options = { 'printBackground': True, # 保留页面背景、图片,和截图效果一致 'marginTop': 0, 'marginBottom': 0, 'marginLeft': 0, 'marginRight': 0, 'paperWidth': width / 96, # 转换为英寸(Chrome默认DPI为96) 'paperHeight': height / 96, 'preferCSSPageSize': False, # 强制使用自定义纸张尺寸,忽略CSS分页 'landscape': False # 纵向打印,根据页面方向调整 } # 执行CDP命令生成PDF,返回字节流 pdf_bytes = driver.execute_cdp_cmd('Page.printToPDF', pdf_options) # 将字节流写入文件 PDF_SAVEAS = 'page_screenshot.pdf' with open(PDF_SAVEAS, 'wb') as f: f.write(pdf_bytes['data']) driver.close()
参数说明
printBackground: true:确保页面的背景色、图片等元素被完整打印,和PNG截图视觉一致- 边距参数设为0:彻底消除默认打印的页边距
- 纸张尺寸转换:因为Chrome的PDF打印默认使用英寸为单位,而页面宽高是像素,所以用
像素值/96转换为英寸(96是Chrome默认DPI) preferCSSPageSize: false:禁用页面CSS中的分页设置,强制使用我们定义的纸张尺寸,避免自动分页或缩放
注意事项
- 如果需要使用Firefox,Firefox也支持CDP协议,参数配置基本一致,但需确保Firefox版本支持
Page.printToPDF命令 - 若页面存在动态加载内容,需添加等待逻辑(如
WebDriverWait)确保页面完全加载后再获取宽高和生成PDF
内容的提问来源于stack exchange,提问作者MrChadMWood
相关产品推荐
相关产品推荐

