Fork me on GitHub

使用cdp4j通过url完成网页内容转存pdf、截图(包括centos下chrome安装)

使用cdp4j通过url完成网页内容转存pdf、截图

cdp4j提供了高级API来通过DevTools协议控制Chrome或Chromium,在浏览器中手动执行的大多数操作都可以使用cdp4j完成。例如:

  • 生成页面的屏幕截图和PDF。
  • 爬网单页应用程序并生成预渲染的内容(服务器端渲染)。
  • 自动执行表单提交,UI测试,键盘输入等。
  • 创建最新的自动化测试环境。
  • 使用最新的JavaScript和浏览器功能,可以在最新版本的Chromium中直接运行测试

本文中主要解决的需求为生成页面pdf、截图。以下为开发记录:

一. 代码开发

  1. 配置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>
    
  2. 生成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中的无头模式,就是无界面模式运行

  3. 执行网页截图的方法

    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/

posted @ 2020-11-26 16:23  ayueC  阅读(883)  评论(0)    收藏  举报