1. 概述

本文将探讨如何利用Selenium 4中ChromeDriver类提供的print()方法,将网页内容直接生成PDF文件。这个方法提供了一种简单粗暴的方式来捕获网页内容并转换为PDF。

我们将分别使用Chrome和Firefox浏览器实现PDF生成,并通过PrintOptions类演示如何自定义PDF输出。这包括调整页面方向、尺寸、缩放比例和边距等参数,以满足特定需求。

所有示例均基于Java和JUnit测试实现,确保可操作性和实用性。

2. 环境配置

需要两个核心依赖:Selenium JavaWebDriverManager

  • Selenium Java:提供自动化测试框架,支持程序化控制浏览器
  • WebDriverManager:自动管理浏览器驱动的下载和配置,解决环境配置痛点

Maven依赖配置如下:

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.23.1</version>
</dependency>
<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>5.8.0</version>
</dependency>

3. 使用Chrome和Selenium生成PDF

本节演示如何通过Selenium WebDriver将Baeldung的Java Weekly页面转换为PDF。

核心步骤如下:

  1. 初始化ChromeDriver
  2. 导航至目标页面
  3. 调用print()方法生成PDF
  4. 解码Base64内容并保存为文件

JUnit测试示例代码:

@Test
public void whenNavigatingToBaeldung_thenPDFIsGenerated() throws IOException {
    ChromeDriver driver = new ChromeDriver();
    driver.get("https://www.baeldung.com/library/java-web-weekly");
    Pdf pdf = driver.print(new PrintOptions());
    byte[] pdfContent = Base64.getDecoder().decode(pdf.getContent());
    Files.write(Paths.get("./Baeldung_Weekly.pdf"), pdfContent);
    assertTrue(Files.exists(Paths.get("./Baeldung_Weekly.pdf")), "PDF文件应成功创建");
    driver.quit(); // 关键:必须释放资源!
}

⚠️ 注意事项

  • driver.quit()必须执行,否则会造成浏览器进程残留
  • 该方法在Chrome无头模式(headless)下同样有效

启用无头模式示例:

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless"); // 无头模式运行
ChromeDriver driver = new ChromeDriver(options);

4. 使用Firefox和Selenium生成PDF

Firefox浏览器同样支持print()方法,实现方式与Chrome类似。以下是使用Firefox生成PDF的JUnit测试:

@Test
public void whenNavigatingToBaeldungWithFirefox_thenPDFIsGenerated() throws IOException {
    FirefoxDriver driver = new FirefoxDriver(new FirefoxOptions());
    driver.get("https://www.baeldung.com/library/java-web-weekly");
    Pdf pdf = driver.print(new PrintOptions());
    byte[] pdfContent = Base64.getDecoder().decode(pdf.getContent());
    Files.write(Paths.get("./Firefox_Weekly.pdf"), pdfContent);
    assertTrue(Files.exists(Paths.get("./Firefox_Weekly.pdf")), "PDF文件应成功创建");
    driver.quit();
}

核心流程一致:

  1. 启动FirefoxDriver
  2. 访问目标URL
  3. 调用print()生成PDF
  4. 解码并保存文件
  5. 验证文件存在性

5. 使用PrintOptions自定义PDF输出

通过PrintOptions类可以精细控制PDF输出效果,主要支持以下自定义参数:

参数 说明 示例值
Orientation 页面方向 LANDSCAPE(横向)
Scale 缩放比例 1.5(放大50%)
PageSize 自定义页面尺寸 new PageSize(100, 100)
PageMargin 页面边距(上/下/左/右) new PageMargin(2,2,2,2)

自定义示例代码:

PrintOptions options = new PrintOptions();
        
options.setOrientation(PrintOptions.Orientation.LANDSCAPE); // 横向打印
options.setScale(1.5); // 放大内容
options.setPageSize(new PageSize(100, 100)); // 自定义页面尺寸
options.setPageMargin(new PageMargin(2, 2, 2, 2)); // 设置边距

Pdf pdf = driver.print(options); // 应用自定义配置

最佳实践

  • 横向模式适合宽表格展示
  • 缩放比例建议0.5-2.0之间
  • 页面尺寸单位为毫米(mm)

6. 总结

本文系统介绍了使用Selenium 4生成PDF文件的完整方案:

  1. 跨浏览器支持:验证了Chrome和Firefox的实现一致性
  2. 核心方法print() + PrintOptions组合拳
  3. 生产级建议
    • 始终使用driver.quit()释放资源
    • 优先采用无头模式提升效率
    • 根据内容特性合理配置输出参数

这种方案特别适合需要将动态网页内容归档为PDF的场景,比如报告生成、发票打印等需求。相比传统截图方案,PDF格式更利于内容检索和二次处理。


原始标题:How to Generate PDF With Selenium | Baeldung