Phantomjs+Java+springboot实现后端截图

news2024/11/27 12:58:13

一、phantomjs介绍
(1)一个基于webkit内核的无界面浏览器,即没有UI界面,即它就是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。
(2)提供javascript API接口,即通过编写js程序可以直接与webkit内核交互,在此之上可以结合java语言等,通过java调用js等相关操作,从而解决了以前c/c++才能比较好的基于webkit开发优质采集器的限制。
(3)提供windows、linux、mac等不同os的安装使用包,也就是说可以在不同平台上二次开发采集项目或是自动项目测试等工作。
二、安装phantomjs
https://phantomjs.org/download.html
我下载的是phantomjs-2.1.1-windows版本,自行根据情况下载
下载完成后解压
为方便使用,我将examples下面的rasterize.js复制到了bin目录下
在这里插入图片描述
之后可以通过cmd执行下面命令,进行测试,如果可以正常截图到D:/test.png,说明phantomjs软件没有问题,可以进行代码开发。

D:/phantomjs-2.1.1-windows/bin/phantomjs D:/phantomjs-2.1.1-windows/bin/rasterize.js https://www.bilibili.com/read/cv28388151/ D:/test.png

三、Java代码实现截图
我将phantomjs .exe和rasterize.js放到了resources根目录下
在这里插入图片描述

CutPictureController.java

@GetMapping("/getCutPictureByPhantomjs")
    public void getCutPictureByPhantomjs(String url, HttpServletResponse response) {
        cutPictureService.getCutPictureByPhantomjs(url,response) ;
    }

CutPictureService.java
我这里实现的方案是将项目种的文件复制到对应系统的目录下,你也可以直接将phantomjs .exe和rasterize.js放到系统中,之后在代码里指定好路径就行。就不用我这么麻烦!

public void getCutPictureByPhantomjs(String url, HttpServletResponse response) {
        try {
            String os = System.getProperty("os.name").toLowerCase();
            ClassPathResource jsResource = new ClassPathResource("rasterize.js");
            InputStream jsInputStream = jsResource.getInputStream();
            String pluginPath ;
            String jsPath;
            String imagePath;
            Process process = null;
            if (os.contains("windows")) {
                ClassPathResource resource = new ClassPathResource("phantomjs.exe");
                InputStream pluginInputStream = resource.getInputStream();
                File pluginFile = new File("d:/" + "phantomjs.exe");
                if (!pluginFile.exists()) {
                    FileOutputStream fileOutputStream = new FileOutputStream(pluginFile);
                    IOUtils.copy(pluginInputStream, fileOutputStream);//复制到windows的对应路径
                    fileOutputStream.close();
                }
                pluginPath = pluginFile.getAbsolutePath();//返回本地文件路径

                File jsFile = new File("d:/" + "rasterize.js");
                if (!jsFile.exists()) {
                    FileOutputStream fileOutputStream = new FileOutputStream(jsFile);
                    IOUtils.copy(jsInputStream, fileOutputStream);//复制到liunx的对应路径
                    fileOutputStream.close();
                }
                jsPath = jsFile.getAbsolutePath();
                imagePath="d:/test.png";
                process = Runtime.getRuntime().exec(pluginPath + " " + jsPath +" " + url+" " + imagePath);
            } else {
                ClassPathResource resource = new ClassPathResource("phantomjs");
                InputStream pluginInputStream = resource.getInputStream();
                File pluginFile = new File("/tmp/" + "phantomjs");
                if (!pluginFile.exists()) {
                    FileOutputStream fileOutputStream = new FileOutputStream(pluginFile);
                    IOUtils.copy(pluginInputStream, fileOutputStream);//复制到liunx的对应路径
                    fileOutputStream.close();
                    Runtime.getRuntime().exec("chmod -R 777 /tmp/phantomjs");//赋可执行去权限
                }
                pluginPath = pluginFile.getAbsolutePath();
                File jsFile = new File("/tmp/" + "rasterize.js");
                if (!jsFile.exists()) {
                    FileOutputStream fileOutputStream = new FileOutputStream(jsFile);
                    IOUtils.copy(jsInputStream, fileOutputStream);//复制到liunx的对应路径
                    fileOutputStream.close();
              
                }
                jsPath = jsFile.getAbsolutePath();
                imagePath="/tmp/test.png";
                String pluginAtr = pluginPath + " " + jsPath +" " + url+" " + imagePath;
    
                process = Runtime.getRuntime().exec(pluginAtr);
            }


            InputStream inputStream = process.getInputStream();
            //用一个读输出流类去读
            InputStreamReader isr=new InputStreamReader(inputStream);
            //用缓冲器读行
            BufferedReader br=new BufferedReader(isr);
            String line=null;
            //直到读完为止
            while((line=br.readLine())!=null){
                log.info("message={}",line);
            }


            if (process.waitFor() != 0 && process.exitValue() == 1) {
                return ;
            }
            

            //给前端返回流用于图片下载
            FileInputStream fis = new FileInputStream(imagePath);
            response.setHeader("Content-Disposition","attachment;filename=test.jpg");
            OutputStream out = response.getOutputStream();
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer)) != -1) {
                out.write(buffer,0,length);
            }
            out.close();
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

到此,正常外网网页都可以实现截图,但是发现自己系统页面不行,因为需要登录,没地方这是参数,也可能是我了解的还不够深,不太会用,最后没用这种方法。使用了chromedriver去实现后端截图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1393028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路由器初始化配置、功能配置

实验环境 拓扑图 Ip规划表(各组使用自己的IP规划表) 部门 主机数量 网络地址 子网掩码 网关 可用ip Vlan 市场部 38 192.168.131.0 255.255.255.0 192.168.131.1 2-254 11 研发部 53 192.168.132.0 255.255.255.0 192.168.132.1 2-2…

Three.js Tri-panner (三面贴图) 材质 两种实现方式

文章目录 介绍自定义shaderNodeMaterial骨骼材质特殊处理 介绍 Tri-panner 在babylonjs中有支持 但是three.js目前的基础材质并不支持 需要自己定义shader 或者使用目前还没有什么完善的文档的 NodeMaterial 下面展示两种实现方式 自定义shader /*** description: 替换三角面…

PICO Developer Center 创建和调试 ADB 命令

PICO 开发者中心概览 ADB 是一个轻量级的 Android 调试桥(Android Debug Bridge,简称 ADB),用于与 Android 设备进行通信和调试。ADB提供了许多有用的功能,使开发人员能够轻松地管理和调试设备上的应用程序。 你可以使用 PDC 工具来调试系统…

配置zabbix监控平台

目录 内容纯手敲,难免有误,若发现请私信我。 配置zabbix监控平台 一、进入官网 ​编辑​ 二、配置zabbix-server(服务端) 1.下载zabbix的yum源 2.安装Zabbix服务器、前端、代理 3.安装Zabbix前端 4.编辑文件/etc/yum.rep…

Java SE入门及基础(19)

二维数组 1. 数组的本质 数组从本质上来说只有一维,二维数组是指在一维数组中再放入一个一维数组。三维数组、四维数组依次类推。 2. 二维数组的定义 语法 数据类型[][] 数组名 new 数据类型[数组的长度][数组的长度]; 示例 public static void main ( Str…

安全帽/反光衣检测AI边缘计算智能分析网关V4如何修改IP地址?

智能分析网关V4是TSINGSEE青犀推出的一款AI边缘计算智能硬件,硬件采用BM1684芯片,集成高性能8核ARM A53,主频高达2.3GHz,INT8峰值算力高达17.6Tops,FB32高精度算力达到2.2T,硬件内置了近40种AI算法模型&…

C++三剑客之std::variant(二):深入剖析

目录 1.概述 2.辅助类介绍 2.1.std::negation 2.2.std::conjunction 2.3.std::is_destructible 2.4.std::is_object 2.5.is_default_constructible 2.6.std::is_trivially_destructible 2.7.std::in_place_type和std::in_place_index 3.原理分析 3.1.存储分析 3.2.…

鸿蒙开发-UI-布局-弹性布局

地方 鸿蒙开发-UI-布局 鸿蒙开发-UI-布局-线性布局 鸿蒙开发-UI-布局-层叠布局 文章目录 前言 一、基本概念 二、布局方向 1、主轴为水平方向 2、主轴为垂直方向 三、布局换行 四、对齐方式 1、主轴对齐方式 2、交叉轴对齐方式 2.1、容器组件设置交叉轴对齐 2.2、子组件设置交叉…

首届PolarDB开发者大会在京举办,阿里云李飞飞:云数据库加速迈向智能化

1月17日,阿里云PolarDB开发者大会在京举办,中国首款自研云原生数据库PolarDB发布“三层分离”新版本,基于智能决策实现查询性能10倍提升、节省50%成本。此外,阿里云全新推出数据库场景体验馆、训练营等系列新举措,广大…

力扣hot100 完全平方数 完全背包 滚动数组 四平方和定理

Problem: 279. 完全平方数 文章目录 思路💖 完全背包💖 滚动数组优化💖 四平方和定理 思路 👨‍🏫 三叶神解 👨‍🏫 数学解法 💖 完全背包 ⏰ 时间复杂度: O ( n 2 n ) O(n^2 …

STM32F103标准外设库——中断应用/事件控制器(六)

个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…

CSS 之 跑马灯边框

一、简介 ​ 之前有做过渐变色边框的样式,然后某天刷抖🎵,看到某个老师在讲跑马灯的样式效果,于是就自己尝试实现一下跑马灯样式的边框,虽然这种样式并不常见(基本没卵用),其使用场…

手机崩溃日志的查找与分析

手机崩溃日志的查找与分析 摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具,该工具可以方便地查看iPhone设备上应用和系统运行时的实时日志和崩溃日志。同时还提供了崩溃日志的分析查看模块,可以对苹果崩溃日志进行符号化、格式化和分析&#x…

CMake+QT+大漠插件的桌面应用开发(QThread)

文章目录 CMakeQT大漠插件的桌面应用开发(QThread)简介环境项目结构配置编译环境代码 CMakeQT大漠插件的桌面应用开发(QThread) 简介 在CMakeQT大漠插件的桌面应用开发中已经给出了QT配合大漠插件开发桌面应用的样例 不过由于主…

Android车载系统Car模块架构链路分析

一、模块主要成员 CarServiceHelperService SystemServer 中专门为 AAOS 设立的系统服务,用来管理车机的核心服务 CarService。该系统服务的具体实现在 CarServiceHelperServiceUpdatableImpl CarService Car模块核心服务APP,Android 13版本开始分为…

PXE和kickstart无人值守安装

PXE高效批量网络装机 引言 1.系统装机的引导方式 启动 操作 系统 1.硬盘 2.光驱(u盘) 3.网络启动 pxe 重装系统? 在已有操作系统 新到货了一台服务器, 装操作系统 系统镜像 u盘 光盘 pe: 小型的 操作系统 在操…

RocketMQ Dashboard 详解

RocketMQ Dashboard 是 RocketMQ 的管控利器,为用户提供客户端和应用程序的各种事件、性能的统计信息,支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作。 一、介绍​ 功能概览​ 面板功能运维修改nameserver 地址; 选用 VIPChannel驾驶舱查…

【Docker】网络模式详解及容器间网络通信

目录 一、概述 二、默认网络 三、网络模式及应用 1. Bridge模式 2. Host模式 3. none网络模式 四、自定义网络应用 1. 网络相连 2. 自定义通讯 3. 自定义IP 每篇一获 一、概述 在 Docker 中,网络设置包括 IP 地址、子网掩码、网关、DNS 和端口号等关键组…

循环神经网络的变体模型-LSTM、GRU

一.LSTM(长短时记忆网络) 1.1基本介绍 长短时记忆网络(Long Short-Term Memory,LSTM)是一种深度学习模型,属于循环神经网络(Recurrent Neural Network,RNN)的一种变体。…

数据结构学习之链式栈应用的案例(最小栈)

实例要求: 设计一个支持入栈、出栈、取栈顶元素等操作,并能在常数时间内检索到最小元素的栈; 实现 MinStack 类: MinStack* minStackCreate() 初始化堆栈对象,即建栈; void minStackPush(MinStack* obj, int val) …