Springboot使用Selenium+ChormeDriver在服務(wù)器端將網(wǎng)頁保存為圖片或PDF
應(yīng)用場景
Java導(dǎo)出PDF有很多種方式,靠代碼拼內(nèi)容輸出,在應(yīng)對復(fù)雜報(bào)表將會很麻煩。
如果將要導(dǎo)出的內(nèi)容做成網(wǎng)頁,將網(wǎng)頁保存為PDF,進(jìn)行打印,這樣將會比較靈活方便,適用于做復(fù)雜報(bào)表打印或者簡歷打印等場景。
實(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
# 驗(yàn)證安裝
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
# 驗(yàn)證安裝
google-chrome --version
輸出:Google Chrome 139.0.7258.127 (具體版本以實(shí)際為準(zhǔn)),記住這個(gè)版本號,后面下載ChromeDriver、引用java包時(shí),都需要對應(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

驗(yàn)證安裝
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.x | 139.0.7258.xx | 4.11 ~ 4.27.0 |
| 138.x | 138.0.7171.xx | 4.11 ~ 4.27.0 |
| 130 - 137 | 130 - 137 | 4.11 ~ 4.27.0 |
| 120 - 129 | 120 - 129 | 4.11 ~ 4.27.0 |
| 111 - 119 | 111 - 119 | 4.8 ~ 4.10 |
| 100 - 110 | 100 - 110 | 4.1 ~ 4.7 |
| 90 - 99 | 90 - 99 | 4.0 ~ 4.5 |
| < 90 | < 90 | 3.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格式錯(cuò)誤!");
}
// 設(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選項(xiàng)
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è)置打印選項(xiàng)
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)文章
MAC配置java+jmeter環(huán)境變量過程解析
這篇文章主要介紹了MAC配置java+jmeter環(huán)境變量過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
SpringBoot Security密碼加鹽實(shí)例
這篇文章主要為打擊介紹了SpringBoot Security密碼加鹽實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
struts2的國際化實(shí)現(xiàn)網(wǎng)站整體中英文切換實(shí)例代碼
本篇文章主要介紹了struts2的國際化實(shí)現(xiàn)網(wǎng)站整體中英文切換實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10

