首页 > 基础资料 博客日记

Java根据url生成图片、截图

2025-01-14 07:30:11基础资料围观140

本篇文章分享Java根据url生成图片、截图,对你有帮助的话记得收藏一下,看Java资料网收获更多编程知识

说明

来都来了,别着急走,有些搞后端的同志看到使用了nodejs头也不回的就走了,我也是纯后端出身,接下来的内容和安装步骤我会以后端入门级开发都能看懂方式描述,简易程度堪比Hello Word

原理

nodejs可以直接在cmd命令窗格中通过命令直接运行,Java可以调用命令窗格执行某个命令;

使用nodejs脚本调用Puppeteer(Puppeteer是一个由Google Chrome团队官方提供的Node.js库)利用Puppeteer无感的调用Chrome浏览器抓取网页并截图,最后将图片转为标准输出流返给Java程序

环境准备

1.确保已经安装了node和npm运行环境

node -v
npm -v

可以执行上面的两个命令来检查,能看到输出版本号,表示环境没问题;如果没有安装可以访问nodejs官网,下载安装程序 傻瓜式下一步安装即可;安装完成后将镜像地址改成国内的

npm config set registry https://registry.npmmirror.com

2.确保安装了Chrome浏览器或基于Chrome内核开发的浏览器

如何使用

1.创建文件夹,打开cmd cd到新建的文件中执行下面的命令,这个过程大概需要3-5分钟

npm install puppeteer

执行完后的效果如下

2.新建screenshot.js文件,编写nodejs脚本

const puppeteer = require('puppeteer');
// 获取java传过来的参数
const url = process.argv[2];

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    // 设置视口大小
    await page.setViewport({
        width: 1920,
        height: 1080,
        deviceScaleFactor: 2, // 像素比,默认为 1。在高 DPI 屏幕上,可以将其设置为 2 或更高,以模拟高分辨率显示。
    });
    await page.goto(url);

    const screenshotBuffer = await page.screenshot({
        fullPage: true;//是否截全屏
    });

    // 输出截图的 Buffer 到标准输出流
    process.stdout.write(screenshotBuffer);

    await browser.close();
})();

效果如下


3.cmd在当前目录中执行下面的命令,测试抓取百度的页面

node screenshot.js https://www.baidu.com/

抓取成功后的效果
一堆乱码对吧,但是不要慌 这是正常的,因为脚本中是将文件流转成了标准的输出流

4.Java代码

package com.assoft.erms.common.utils;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;


public class ScreenshotUtil {



    public static void main(String[] args) {

        //js脚本文件地址
        String screenshotJs = "D:\\workspace\\javascript\\screenshot.js";
        //要截图的网页(有拦截器,需要验证身份的不行)
        String url = "http://politics.people.com.cn/n1/2024/1031/c1024-40350705.html";
        //保存的文件名
        String filePath = "screenshot.png";

        try {
            //两种返回类型,逻辑是一样的;只是返回类型不同 根据情况自行选择
            
            // 模式一:获取截图的字节数组
            byte[] screenshotBytes = ScreenshotUtil.captureScreenshotAsBytes(url,screenshotJs);
            System.out.println("屏幕截图字节数组长度: " + screenshotBytes.length);

            // 模式二:将截图保存到指定路径
            ScreenshotUtil.captureScreenshotAsFile(url, filePath,screenshotJs);
            System.out.println("屏幕截图已保存到: " + filePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取网页截图的字节数组
     * @param url
     * @return
     * @throws Exception
     */
    public static byte[] captureScreenshotAsBytes(String url,String screenshotJs) throws Exception {
        Process process = Runtime.getRuntime().exec(new String[]{"node", screenshotJs, url});

        // 获取 Process 的输入流
        try (InputStream inputStream = process.getInputStream();
             ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {

            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, length);
            }
            process.waitFor(); // 等待进程结束
            return byteArrayOutputStream.toByteArray(); // 返回字节数组
        }
    }

    /**
     * 将网页截图保存到指定路径
     * @param url
     * @param filePath
     * @throws Exception
     */
    public static void captureScreenshotAsFile(String url, String filePath,String screenshotJs) throws Exception {
        byte[] screenshotBytes = captureScreenshotAsBytes(url,screenshotJs); // 获取截图字节数组

        // 将字节数组写入文件
        try (FileOutputStream fileOutputStream = new FileOutputStream(filePath)) {
            fileOutputStream.write(screenshotBytes);
        }
    }


}

5.最终的效果图如下

图片违规了。。。。

集成

Demo是写好了,怎么集成到自己的java工程中呢?

很简单只需要将node_modules和screenshot.js复制到自己的Java工程中,package.json、package-lock.json不需要

目录层级的说明:
screenshot.js会往上查找node_modules,以下是三个例子

可行

|-- node_modules
|-- screenshot.js

可行

|-- node_modules
|-- js
	|-- screenshot.js

不可行

|-- screenshot.js
|-- static
	|-- node_modules

文章来源:https://blog.csdn.net/weixin_44927978/article/details/143426512
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云