最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot使用Selenium+ChormeDriver在服務(wù)器端將網(wǎng)頁保存為圖片或PDF

 更新時間:2025年10月29日 09:42:53   作者:清山博客  
這篇文章主要為大家詳細(xì)介紹了Springboot使用Selenium+ChormeDriver在服務(wù)器端將網(wǎng)頁保存為圖片或PDF的相關(guān)方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

應(yīng)用場景

Java導(dǎo)出PDF有很多種方式,靠代碼拼內(nèi)容輸出,在應(yīng)對復(fù)雜報表將會很麻煩。

如果將要導(dǎo)出的內(nèi)容做成網(wǎng)頁,將網(wǎng)頁保存為PDF,進(jìn)行打印,這樣將會比較靈活方便,適用于做復(fù)雜報表打印或者簡歷打印等場景。

實(shí)現(xiàn)思路

通過Selenium+ChormeDriver,調(diào)用Google Chrome 瀏覽器,將網(wǎng)頁打印成PDF。

實(shí)現(xiàn)步驟

1.服務(wù)器端配置

安裝 Python

以CentOS / RHEL / Alibaba Cloud Linux系統(tǒng)為例。

# 更新系統(tǒng)包

sudo yum update -y

# 安裝 Python 3

sudo yum install -y python3 python3-pip

# 驗證安裝

python3 --version
pip3 --version

Alibaba Cloud Linux 默認(rèn)可能已預(yù)裝 Python 3。

安裝 Selenium

pip3 install selenium

安裝 Google Chrome 瀏覽器

# 設(shè)置 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 (具體版本以實(shí)際為準(zhǔn)),記住這個版本號,后面下載ChromeDriver、引用java包時,都需要對應(yīng)的版本,版本不一致運(yùn)行不起。

安裝 ChromeDriver

ChromeDriver可以從華為的鏡像下載,https://mirrors.huaweicloud.com/chromedriver/,下載對應(yīng)版本號的文件。

下載解壓后,將chromedriver文件復(fù)制到 /usr/local/bin/chromedriver,并給執(zhí)行權(quán)限。

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 開始,不再需要嚴(yán)格匹配 ChromeDriver 版本,只要主版本一致(如 Chrome 139)即可自動兼容。

編寫代碼

/**
 * 將網(wǎng)頁地址保存
 * @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格式錯誤!");
	}

	// 設(shè)置 ChromeDriver 的路徑
	//Linux 系統(tǒng)
	System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver");
	//Windows系統(tǒng)
	//System.setProperty("webdriver.chrome.driver", "D:\\chromedriver-win64\\chromedriver.exe");

	// 設(shè)置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");

	// 創(chuàng)建 WebDriver 實(shí)例
	ChromeDriver driver = new ChromeDriver(options);
	try {

		// 打開目標(biāo)網(wǎng)頁
		driver.get(url);

		// 設(shè)置打印選項
		PrintOptions printOptions = new PrintOptions();
		printOptions.setPageRanges("1-500"); // 打印頁碼范圍
		printOptions.setOrientation(PrintOptions.Orientation.PORTRAIT); // 縱向
		//printOptions.setScale(0.79); // 縮放比例
		printOptions.setBackground(true); // 打印背景
		// 執(zhí)行打印并獲取 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(); // 關(guān)閉瀏覽器
	}
	return Result.success("success");
}

至此,完成了服務(wù)器端根據(jù)網(wǎng)頁地址,下載成PDF的功能。

到此這篇關(guān)于Springboot使用Selenium+ChormeDriver在服務(wù)器端將網(wǎng)頁保存為圖片或PDF的文章就介紹到這了,更多相關(guān)Springboot網(wǎng)頁保存為圖片或PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SQLSyntaxErrorException-ExecutorException報錯解決分析

    SQLSyntaxErrorException-ExecutorException報錯解決分析

    這篇文章主要為大家介紹了SQLSyntaxErrorException-ExecutorException報錯解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 使用JPA插入枚舉類型字段

    使用JPA插入枚舉類型字段

    這篇文章主要介紹了使用JPA插入枚舉類型字段,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java中JSON字符串轉(zhuǎn)換為Map集合的兩種方法

    java中JSON字符串轉(zhuǎn)換為Map集合的兩種方法

    本文主要介紹了java中JSON字符串轉(zhuǎn)換為Map集合,包含了兩種方法,這種需求可能涉及到從外部接口獲取數(shù)據(jù),或者在程序中處理配置信息等,感興趣的可以了解一下
    2024-07-07
  • JAVA文件讀取常用工具類(8種)

    JAVA文件讀取常用工具類(8種)

    JAVA操作文件在經(jīng)常會使用到,本文匯總了部分JAVA操作文件的讀取常用工具類,主要介紹了8種方法,具有一定的參考價值,感興趣的可以了解一下
    2021-08-08
  • SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼

    SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼

    本文主要介紹了SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • mybatis中大批量數(shù)據(jù)插入解析

    mybatis中大批量數(shù)據(jù)插入解析

    這篇文章主要介紹了mybatis中大批量數(shù)據(jù)插入解析,使用Mybatis框架批量插入的3種方法,分別是多次調(diào)用insert方法、foreach標(biāo)簽、batch模式,本文來詳細(xì)說明一下,需要的朋友可以參考下
    2024-01-01
  • Java帶復(fù)選框的樹(Java CheckBox Tree)實(shí)現(xiàn)和應(yīng)用

    Java帶復(fù)選框的樹(Java CheckBox Tree)實(shí)現(xiàn)和應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了Java帶復(fù)選框的樹實(shí)現(xiàn)和應(yīng)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • SpringBoot自定義Starter及使用

    SpringBoot自定義Starter及使用

    這篇文章主要介紹了SpringBoot自定義Starter及使用,Starter是Spring Boot中的一個非常重要的概念,Starter相當(dāng)于模塊,它能將模塊所需的依賴整合起來并對模塊內(nèi)的Bean根據(jù)環(huán)境進(jìn)行自動配置,需要的朋友可以參考下
    2023-07-07
  • java 基礎(chǔ)之final、finally和finalize的區(qū)別

    java 基礎(chǔ)之final、finally和finalize的區(qū)別

    這篇文章主要介紹了java 基礎(chǔ)之final、finally和finalize的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • SWT(JFace)體驗之圓環(huán)狀(戒指型)

    SWT(JFace)體驗之圓環(huán)狀(戒指型)

    SWT(JFace)體驗之圓環(huán)狀(戒指型)實(shí)現(xiàn)代碼。
    2009-06-06

最新評論

饶阳县| 德令哈市| 曲水县| 建阳市| 安远县| 舒城县| 宜黄县| 塔河县| 白玉县| 诸城市| 文水县| 沾益县| 阿拉善右旗| 阳高县| 镇远县| 交城县| 竹山县| 岚皋县| 阿拉善盟| 中宁县| 杨浦区| 夹江县| 湟源县| 三都| 建昌县| 卢氏县| 永福县| 巧家县| 南木林县| 大安市| 麦盖提县| 绥德县| 宁津县| 高唐县| 巴林左旗| 游戏| 澄江县| 中牟县| 三河市| 忻州市| 龙里县|