使用cdp4j通过url完成网页内容转存pdf、截图(包括centos下chrome安装)
使用cdp4j通过url完成网页内容转存pdf、截图
cdp4j提供了高级API来通过DevTools协议控制Chrome或Chromium,在浏览器中手动执行的大多数操作都可以使用cdp4j完成。例如:
- 生成页面的屏幕截图和PDF。
- 爬网单页应用程序并生成预渲染的内容(服务器端渲染)。
- 自动执行表单提交,UI测试,键盘输入等。
- 创建最新的自动化测试环境。
- 使用最新的JavaScript和浏览器功能,可以在最新版本的Chromium中直接运行测试
本文中主要解决的需求为生成页面pdf、截图。以下为开发记录:
一. 代码开发
-
配置maven引入依赖
<!-- https://mvnrepository.com/artifact/io.webfolder/cdp4j --> <dependency> <groupId>io.webfolder</groupId> <artifactId>cdp4j</artifactId> <version>3.0.13</version> </dependency> <!-- https://mvnrepository.com/artifact/org.jvnet.winp/winp --> <dependency> <groupId>org.jvnet.winp</groupId> <artifactId>winp</artifactId> <version>1.28</version> </dependency> -
生成PDF的方法
import java.nio.file.Path; import java.nio.file.Paths; import cn.hutool.core.io.FileUtil; import io.webfolder.cdp.AdaptiveProcessManager; import io.webfolder.cdp.Launcher; import io.webfolder.cdp.session.Session; import io.webfolder.cdp.session.SessionFactory; import static java.awt.Desktop.getDesktop; import static java.awt.Desktop.isDesktopSupported; import static java.nio.file.Files.*; import static java.util.Arrays.asList; import java.io.File; public static void convertToPdf(String filePath, String url) throws Exception { Launcher launcher = new Launcher(); launcher.setProcessManager(new AdaptiveProcessManager()); Path path = Paths.get(filePath); //如果文件路径不存在,则创建 File file = new File(filePath); if (!FileUtil.exist(file.getParent())) { FileUtil.mkdir(file.getParent()); } try (SessionFactory factory = launcher .launch(asList("--disable-gpu", "--headless"))) { String context = factory.createBrowserContext(); try (Session session = factory.create(context)) { session.navigate(url); session.waitDocumentReady(60000); //session.activate(); byte[] content = session.getCommand().getPage().printToPDF(); //写入文件 write(path, content); } } launcher.getProcessManager().kill(); }"--headless"指定了chrome中的无头模式,就是无界面模式运行
-
执行网页截图的方法
public static void convertToImg(String filePath, String url) throws Exception { Launcher launcher = new Launcher(); launcher.setProcessManager(new AdaptiveProcessManager()); Path path = Paths.get(filePath); //如果文件路径不存在,则创建 File file = new File(filePath); if (!FileUtil.exist(file.getParent())) { FileUtil.mkdir(file.getParent()); } try (SessionFactory factory = launcher .launch(asList("--disable-gpu", "--headless")); ) { String context = factory.createBrowserContext(); try(Session session = factory.create(context)) { session.navigate(url); session.waitDocumentReady(60000); // activate the tab/session before capturing the screenshot // session.activate(); byte[] data = session.captureScreenshot(true); write(path, data); } } //在桌面打开文件进行展示 if (isDesktopSupported()) { getDesktop().open(file.toFile()); } launcher.getProcessManager().kill(); }
二. 部署时问题记录
在自己本地win10系统上运行良好,但是部署到centos7时出现了chrome找不到、url无法连接、汉字显示为方框等问题。解决方案如下:
1. 安装chrom,并修改配置
其实代码是通过控制chrome来完成的操作,所以操作系统中必须安装chrome。
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
sudo yum install google-chrome-stable_current_*.rpm
此时连接还是有错误,更改配置文件后解决
cd /opt/google/chrome
vim google-chrome
# 在exec -a "$0" "$HERE/chrome" "$@" 后面加上 --no-sandbox
通过以上操作后,chrome正常启动,并且可以通过以上代码生成pdf,但是在pdf内容文件中,汉字显示为方框,这是字体的原因导致的。
2. 安装字体
安装宋体解决汉字显示为方框的问题。可以在自己的windows系统下C:\Windows\Fonts找到宋体字体包(SIMSUN.TTC)上传到路径 /usr/share/fonts/下,然后依次执行以下命令:
mkfontdir
mkfontscale
fc-cache -fv
查看安装的中文语言
fc-list :lang=zh
注:我的后端代码是以后台服务的方式部署的,因为是每次调用的时候生成的session然后执行的,我原本以为不用重启后台服务的,但是只有在重启了后台服务后方框字的问题才解决。
参考文章:
cdp4j介绍及使用:https://blog.csdn.net/f1370335844/article/details/102815452
Java操作Chrome浏览器的API库-cdp4j:http://bcxw.net/article/702.html
CentOS 安装 Chrome:https://www.cnblogs.com/zhuminghui/p/12120483.html
Centos7安装中文宋体-phantomjs:https://www.aityp.com/centos7安装中文宋体-phantomjs/

浙公网安备 33010602011771号