Java + Selenium实现浏览器打印功能

Java + Selenium实现浏览器打印功能

Java调用浏览器打印功能

本文主要介绍如果通过Java实现浏览器的PDF打印功能

环境配置以及依赖导入

  1. seleniumJava依赖
xml 复制代码
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-java</artifactId>
          <version>4.41.0</version>
          <scope>compile</scope>
      </dependency>
  1. 浏览器的Driver配置(手动配置)
  • 下载不同浏览器的driver, 这里以chrome为例: https://googlechromelabs.github.io/chrome-for-testing/ 具体下载什么版本还需要看本地安装的 Chrome 的版本, 一定要版本相同, 如果没有自己对应的版本,随便选择一个下载链接,然后把版本改成自己的浏览器就行了。
txt 复制代码
### 随便选择一个
https://storage.googleapis.com/chrome-for-testing-public/146.0.7680.66/win64/chromedriver-win64.zip

### 假设我的版本为1111111.11111
https://storage.googleapis.com/chrome-for-testing-public/1111111.11111/win64/chromedriver-win64.zip
  • 导入配置
java 复制代码
// 设置Chrome浏览器的driver
System.setProperty("webdriver.chrome.driver", "C:\\PerfLogs\\chromedriver-win64\\chromedriver.exe");
  1. 通过webdrivermanager自动管理 (推荐☆☆☆☆)
  • 引入依赖:
xml 复制代码
<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>6.3.3</version>
    <scope>compile</scope>
</dependency>
  • 在代码中启用
java 复制代码
// 6.3.3版本只支持以下类型的浏览器
		// chrome
        WebDriverManager.chromedriver().setup();
        // 其他使用chrome内核的浏览器
        WebDriverManager.chromiumdriver().setup();
        // firefox
        WebDriverManager.firefoxdriver().setup();
        // edge
        WebDriverManager.edgedriver().setup();
        // opera
        WebDriverManager.operadriver().setup();
        // safari
        WebDriverManager.safaridriver().setup();

设置Selenium

4.41.0版本支持的浏览器类型以及不同浏览器的配置如图所示

  1. 浏览器驱动:
  2. 浏览器配置:
这里以Chrome为例
java 复制代码
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Pdf;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.print.PageMargin;
import org.openqa.selenium.print.PageSize;
import org.openqa.selenium.print.PrintOptions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.Duration;
import java.util.Base64;
import java.util.UUID;

public class PdfDownload {

    public static void main(String[] args) throws IOException {
        PdfDownload pdfDownload = new PdfDownload();
        String fileName = UUID.randomUUID().toString();
        pdfDownload.generatePdfFromUrl("http://localhost:8080/doc/xxxxxxx", "C:\\opt\\" + fileName + ".pdf");
    }

    public void generatePdfFromUrl(String url, String outputPath) throws IOException {
        // 加载chrome浏览器驱动
        System.setProperty("webdriver.chrome.driver", "C:\\PerfLogs\\chromedriver-win64\\chromedriver.exe");

        ChromeOptions options = new ChromeOptions();
        // 运行无头模式-不弹窗(服务器中必须, 本地开发可以不用)
        options.addArguments("--headless");
        // 跳过打印预览
        options.addArguments("--kiosk-printing");

        ChromeDriver driver = new ChromeDriver(options);
        try {
            driver.get(url);

            // 等待页面加载, 根据需要设置时间
            WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
            wait.until(d -> (Boolean) ((JavascriptExecutor) d)
                    .executeScript("return window.jQuery ? jQuery.active == 0 : true"));
            // 等待数据渲染(1.5s), 根据需要设置时间
            Thread.sleep(1500);
            // 配置打印选项
            PrintOptions printOptions = new PrintOptions();
            printOptions.setPageSize(PageSize.ISO_A4); // A4尺寸(cm)
            printOptions.setPageMargin(new PageMargin(1.0, 1.0, 1.0, 1.0));
            printOptions.setScale(1.0);
            printOptions.setBackground(true);
            printOptions.setShrinkToFit(true);

            // 调用浏览器打印功能
            Pdf pdf = driver.print(printOptions);

            // 解码并保存文件
            byte[] pdfContent = Base64.getDecoder().decode(pdf.getContent());
            Files.write(Paths.get(outputPath), pdfContent);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            driver.quit(); // 必须关闭浏览器进程
        }
    }
}
相关推荐
mldong9 小时前
一个 App,十三套后端:手机审批端 uni-jeeflow-app 开源了
java·架构
tqs_1234510 小时前
MySQL RR隔离级别死锁|Gap间隙锁、临键锁,订单并发范围查询死锁根因方案
java
逆境不可逃11 小时前
Pi Agent 学习笔记:多个工具怎样并行执行
java
Flynt11 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet11 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
星云API技术支持12 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
niucloud-admin12 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
海宇AI13 小时前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化车抵贷核保网关
java·人工智能·架构·自动化
cfm_291415 小时前
单例模式详解
java
我叫张土豆15 小时前
本体论、DDD、SDD、TDD:AI 编程时代的四层认知栈
java·人工智能