Springboot使用Selenium+ChormeDriver在服务器端将网页保存为图片或PDF

 更新时间:2025年10月29日 09:42:53   作者:清山博客  
这篇文章主要为大家详细介绍了Springboot使用Selenium+ChormeDriver在服务器端将网页保存为图片或PDF的相关方法,感兴趣的小伙伴可以跟随小编一起学习一下

应用场景

Java导出PDF有很多种方式,靠代码拼内容输出,在应对复杂报表将会很麻烦。

如果将要导出的内容做成网页,将网页保存为PDF,进行打印,这样将会比较灵活方便,适用于做复杂报表打印或者简历打印等场景。

实现思路

通过Selenium+ChormeDriver,调用Google Chrome 浏览器,将网页打印成PDF。

实现步骤

1.服务器端配置

安装 Python

以CentOS / RHEL / Alibaba Cloud Linux系统为例。

# 更新系统包

sudo yum update -y

# 安装 Python 3

sudo yum install -y python3 python3-pip

# 验证安装

python3 --version
pip3 --version

Alibaba Cloud Linux 默认可能已预装 Python 3。

安装 Selenium

pip3 install selenium

安装 Google Chrome 浏览器

# 设置 Chrome 的 yum 源

sudo tee /etc/yum.repos.d/google-chrome.repo <<EOF
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl.google.com/linux/linux_signing_key.pub
EOF

# 安装 Chrome

sudo yum install -y google-chrome-stable

# 验证安装

google-chrome --version

输出:Google Chrome 139.0.7258.127 (具体版本以实际为准),记住这个版本号,后面下载ChromeDriver、引用java包时,都需要对应的版本,版本不一致运行不起。

安装 ChromeDriver

ChromeDriver可以从华为的镜像下载,https://mirrors.huaweicloud.com/chromedriver/,下载对应版本号的文件。

下载解压后,将chromedriver文件复制到 /usr/local/bin/chromedriver,并给执行权限。

sudo chmod +x /usr/local/bin/chromedriver

验证安装

chromedriver --version

输出:ChromeDriver 139.0.7258.68 (40ff94600b6ed9fa7778a3a2566f254ad85f2147-refs/branch-heads/7258@{#2228})

2.Springboot集成 Selenium

引入依赖

<dependency>
	<groupId>org.seleniumhq.selenium</groupId>
	<artifactId>selenium-java</artifactId>
	<version>4.16.0</version>
</dependency>
<dependency>
	<groupId>org.seleniumhq.selenium</groupId>
	<artifactId>selenium-chrome-driver</artifactId>
	<version>4.16.0</version>
</dependency>

注意引用的版本号要和selenum和ChromeDriver一致。

Chrome 浏览器版本ChromeDriver 版本推荐 Selenium Java 版本
139.x139.0.7258.xx4.11 ~ 4.27.0
138.x138.0.7171.xx4.11 ~ 4.27.0
130 - 137130 - 1374.11 ~ 4.27.0
120 - 129120 - 1294.11 ~ 4.27.0
111 - 119111 - 1194.8 ~ 4.10
100 - 110100 - 1104.1 ~ 4.7
90 - 9990 - 994.0 ~ 4.5
< 90< 903.141.59(最后版本)

从 Selenium 4.11 开始,不再需要严格匹配 ChromeDriver 版本,只要主版本一致(如 Chrome 139)即可自动兼容。

编写代码

/**
 * 将网页地址保存
 * @param response
 * @param url
 * @return
 */
@GetMapping("/urlToPdf")
@ResponseBody
public Result<String> urlToPdf(HttpServletResponse response, @RequestParam(value = "url", required = false) String url) {
	if (url == null || url.isEmpty()) {
		return Result.error("抱歉,url不能为空!");
	}
	if (!isValidUrl(url)) {
		return Result.error("抱歉,url格式错误!");
	}

	// 设置 ChromeDriver 的路径
	//Linux 系统
	System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver");
	//Windows系统
	//System.setProperty("webdriver.chrome.driver", "D:\\chromedriver-win64\\chromedriver.exe");

	// 设置Chrome选项
	ChromeOptions options = new ChromeOptions();
	Map<String, Object> prefs = new HashMap<>();
	prefs.put("profile.default_content_setting_values.images", 1); // 1:允许加载图片,2:阻止加载图片
	options.setExperimentalOption("prefs", prefs);
	options.addArguments("--incognito");
	options.setAcceptInsecureCerts(true);
	options.addArguments("--headless=new");// 无头模式
	options.addArguments("--disable-gpu");
	options.addArguments("--no-sandbox");
	options.addArguments("--disable-dev-shm-usage");
	options.addArguments("--window-size=1920,1080");

	// 创建 WebDriver 实例
	ChromeDriver driver = new ChromeDriver(options);
	try {

		// 打开目标网页
		driver.get(url);

		// 设置打印选项
		PrintOptions printOptions = new PrintOptions();
		printOptions.setPageRanges("1-500"); // 打印页码范围
		printOptions.setOrientation(PrintOptions.Orientation.PORTRAIT); // 纵向
		//printOptions.setScale(0.79); // 缩放比例
		printOptions.setBackground(true); // 打印背景
		// 执行打印并获取 PDF(Base64 编码)
		String pdfBase64 = ((PrintsPage) driver).print(printOptions).getContent();
		byte[] pdfBytes = Base64.getDecoder().decode(pdfBase64);
		//2.文件流
		OutputStream os = response.getOutputStream();
		//3.输出文件
		response.setContentType("application/pdf");
		response.setCharacterEncoding(StandardCharsets.UTF_8.name());
		String fileName = URLEncoder.encode(System.currentTimeMillis() + ".pdf", StandardCharsets.UTF_8); // 这里URLEncoder.encode可以防止中文乱码
		response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName);
		os.write(pdfBytes);
		os.flush();
		os.close();
	} catch (Exception e) {
		return Result.error(e.getMessage());
	} finally {
		driver.quit(); // 关闭浏览器
	}
	return Result.success("success");
}

至此,完成了服务器端根据网页地址,下载成PDF的功能。

到此这篇关于Springboot使用Selenium+ChormeDriver在服务器端将网页保存为图片或PDF的文章就介绍到这了,更多相关Springboot网页保存为图片或PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java外观模式解读,让你的代码优雅又高效

    Java外观模式解读,让你的代码优雅又高效

    外观模式(Facade Pattern)是一种常用的结构型设计模式,它为复杂的子系统提供一个简单的接口,隐藏复杂的实现细节,本文就来讲讲它是如何简化代码,提高可维护性的
    2023-05-05
  • MAC配置java+jmeter环境变量过程解析

    MAC配置java+jmeter环境变量过程解析

    这篇文章主要介绍了MAC配置java+jmeter环境变量过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • springboot如何忽略接收请求中的参数

    springboot如何忽略接收请求中的参数

    这篇文章主要介绍了springboot如何忽略接收请求中的参数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • SpringBoot可以同时处理多少请求流程分析

    SpringBoot可以同时处理多少请求流程分析

    SpringBoot默认的内嵌容器是Tomcat,也就是我们的程序实际上是运行在Tomcat里的,所以与其说SpringBoot可以处理多少请求,到不如说Tomcat可以处理多少请求,这篇文章主要介绍了SpringBoot可以同时处理多少请求,需要的朋友可以参考下
    2023-02-02
  • Spring AOPr如何打通两个切面之间的通信

    Spring AOPr如何打通两个切面之间的通信

    本文主要介绍了Spring AOPr如何打通两个切面之间的通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • SpringBoot Security密码加盐实例

    SpringBoot Security密码加盐实例

    这篇文章主要为打击介绍了SpringBoot Security密码加盐实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • struts2的国际化实现网站整体中英文切换实例代码

    struts2的国际化实现网站整体中英文切换实例代码

    本篇文章主要介绍了struts2的国际化实现网站整体中英文切换实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Jdbc的步骤以及简单实现代码

    Jdbc的步骤以及简单实现代码

    下面小编就为大家带来一篇Jdbc的步骤以及简单实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • Java字符串比较方法equals的空指针异常的解决

    Java字符串比较方法equals的空指针异常的解决

    这篇文章主要介绍了Java字符串比较方法equals的空指针异常的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • maven中心仓库OSSRH使用简介(推荐)

    maven中心仓库OSSRH使用简介(推荐)

    这篇文章主要介绍了maven中心仓库OSSRH使用简介,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04

最新评论