You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python与Selenium生成无分页无边距的整页PDF截图

用Selenium生成与PNG截图尺寸一致、无页边距的PDF

要生成和你当前PNG截图完全一致的PDF(无页边距、尺寸匹配页面实际大小),可以利用Chrome DevTools Protocol(CDP)的Page.printToPDF命令,精确控制打印参数,避免默认打印的格式调整。以下是实现方案:

核心思路

  1. 先获取页面的实际滚动宽高(和你原代码的逻辑一致)
  2. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:12:53