JAVA实现利用phantomjs对URL页面(网页)进行转图片保存

news2024/11/16 19:57:43

一、前期准备

1、下载phantomjs工具
地址:https://phantomjs.org/download.html
解压到指定文件夹,后续代码要调用该工具,记住路径
2、准备好模板NetToPicMoban.js
用于给phantomjs提供需要执行的js,具体放在那看自己的需求,我放在:D:/template/NetToPicMoban.js内容:

var page = require('webpage').create();
page.open(url, function(success){
    if(success==='success'){
        console.log('success');
        page.render(savename);
        phantom.exit();
    }else{
        console.log('error');
        phantom.exit();
    }
});

二、代码分析

1、从测试的main函数看起

public static void main(String[] args){
        //目标网页
        String url = "https://www.baidu.com" ;
        //生成的图片名称
        String picname = System.currentTimeMillis()+"sina.png" ;
        //要构建的目标js
        String jsname = "sina.js";
        //生成js
        UrlToImgSaveUtil.reload( url, picname,jsname);
        //调用系统的cmd 执行phantomjs.exe
        // cdm 表示命令行 
        // /c 表示执行后关闭窗口  
        // F: 表示转到F盘 看你的phantomjs.exe工具放在哪个盘就要转到哪个盘,否则生成不了图片
        // && 表示多个命令行关联,即下面字符串待执行三个命令行
        // cd 表示转到某个文件夹下,现在要转到phantomjs的bin目录下
        //  phantomjs.exe  xxxxxx.js  表示工具执行某个js文件
        String cmd1 = "cmd /c F: && cd F:\\tools\\phantomjs-2.1.1-windows\\bin\\" ;
        String cmd  = cmd1 + " && phantomjs.exe " + "D:\\template\\"+jsname;
        //执行cmd
        UrlToImgSaveUtil.implcmd(cmd);
    }

2、生成目标js文件

/**
     * 构建js文件
     * @param url
     * @param picname
     * @param jsname
     */
    public static void  reload(String url,String picname,String jsname){
        //这里面的路径都是相对路径
        String content = "";
        //netToPicMoban.js这个phantomjs 的一个js模版,修改相应的参数就可以实现我们要的功能
        String str = read(new File("D:/template/NetToPicMoban.js"));
        String content1 = str.replace("url", "'"+url+"'");
        content = content1.replace("savename", "'"+picname+"'");
        write(content,"D:/template/", jsname );
    }

3、文件读取和文件写法方法
(可以封装到一个工具类)

/**
     * 文件读取
     * @param file
     * @return
     */
    public static String read(File file) {
        try (FileInputStream fis = new FileInputStream(file)) {
            byte[] b = new byte[(int) file.length()];
            fis.read(b);
            return new String(b, StandardCharsets.UTF_8);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 文件写入
     * @param content  文件内容
     * @param dirPath   保存路径
     * @param fileName   文件名称
     */
    public static void write(String content, String dirPath, String fileName) {
        File file = createFile(dirPath, fileName);
        try (FileWriter writer = new FileWriter(file)) {
            writer.write(content);
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建文件
     * @param dirPath  文件路径
     * @param fileName  文件名称
     * @return
     */
    private static File createFile(String dirPath, String fileName) {
        String filePath = "";
        if (Objects.isNull(dirPath) || dirPath.isEmpty()) {
            filePath = fileName;
        } else {
            if (dirPath.endsWith("/")) {
                filePath = dirPath + fileName;
            } else {
                filePath = dirPath + "/" + fileName;
            }
            File dir = new File(dirPath);
            if (!dir.exists()) {
                dir.mkdirs();
            }
        }
        File file = new File(filePath);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return file;
    }

4、执行cmd

/**
 * 执行cmd
 * @param cmd
 */
public static void  implcmd(String cmd){//在java中调用执行cmd命令
    Process p;
    System.out.println(cmd);
    try {
        p = Runtime.getRuntime().exec(cmd);
        // 等待进程执行完成
        int exitCode = p.waitFor();
        //命令行运行内容打印
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        // 打印命令执行结果  为0表示成功
        System.out.println("Command executed with exit code: " + exitCode);
    } catch (IOException e) {
        System.out.println("e==="+e.getMessage());
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
}

三、整体代码

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Objects;

/**
 * @author Administrator
 */
public class UrlToImgSaveUtil {

    /**
     * 构建js文件
     * @param url
     * @param picname
     * @param jsname
     */
    public static void  reload(String url,String picname,String jsname){
        //这里面的路径都是相对路径
        String content = "";
        //netToPicMoban.js这个phantomjs 的一个js模版,修改相应的参数就可以实现我们要的功能
        String str = read(new File("D:/template/NetToPicMoban.js"));
        String content1 = str.replace("url", "'"+url+"'");
        content = content1.replace("savename", "'"+picname+"'");
        write(content,"D:/template/", jsname );
    }

    /**
     * 文件读取
     * @param file
     * @return
     */
    public static String read(File file) {
        try (FileInputStream fis = new FileInputStream(file)) {
            byte[] b = new byte[(int) file.length()];
            fis.read(b);
            return new String(b, StandardCharsets.UTF_8);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 文件写入
     * @param content
     * @param dirPath
     * @param fileName
     */
    public static void write(String content, String dirPath, String fileName) {
        File file = createFile(dirPath, fileName);
        try (FileWriter writer = new FileWriter(file)) {
            writer.write(content);
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建文件
     * @param dirPath
     * @param fileName
     * @return
     */
    private static File createFile(String dirPath, String fileName) {
        String filePath = "";
        if (Objects.isNull(dirPath) || dirPath.isEmpty()) {
            filePath = fileName;
        } else {
            if (dirPath.endsWith("/")) {
                filePath = dirPath + fileName;
            } else {
                filePath = dirPath + "/" + fileName;
            }
            File dir = new File(dirPath);
            if (!dir.exists()) {
                dir.mkdirs();
            }
        }
        File file = new File(filePath);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return file;
    }


    /**
     * 执行cmd
     * @param cmd
     */
    public static void  implcmd(String cmd){//在java中调用执行cmd命令
        Process p;
        System.out.println(cmd);
        try {
            p = Runtime.getRuntime().exec(cmd);
            // 等待进程执行完成
            int exitCode = p.waitFor();
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            // 打印命令执行结果
            System.out.println("Command executed with exit code: " + exitCode);
        } catch (IOException e) {
            System.out.println("e==="+e.getMessage());
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }


    public static void main(String[] args){
        String url = "https://www.baidu.com" ;
        String picname = System.currentTimeMillis()+"sina.png" ;
        String jsname = "sina.js";
        //生成js
        UrlToImgSaveUtil.reload( url, picname,jsname);
        //调用系统的cmd 执行phantomjs.exe
        String cmd1 = "cmd /c F: && cd F:\\tools\\phantomjs-2.1.1-windows\\bin\\" ;
        String cmd  = cmd1 + " && phantomjs.exe " + "D:\\template\\"+jsname;
        //执行cmd
        UrlToImgSaveUtil.implcmd(cmd);
    }
}

四、运行分析

1、代码运行打印
在这里插入图片描述

2、目标sina.js生成
在这里插入图片描述

3、图片位置在工具的bin目录下
在这里插入图片描述

五、注意事项

1、phantomjs工具安装位置
2、js模板和目标模板位置
3、cmd命令的写法与这些位置息息相关,注意细节
4、在linux处理的话要下载phantomjs的linux版本,具体命令执行方式、文件路径书写方式都与windows有差异

六、 参考资料:

https://blog.csdn.net/sh_c1991/article/details/37992055
https://blog.csdn.net/sunnyzyq/article/details/98726085

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

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

相关文章

运算放大器(运放)缓冲器(跟随器)电路

运算放大器(Operational Amplifier) 运算放大器(Operational Amplifier)是一种差分放大器,具有高输入电阻、低输出电阻、高开放增益(开环增益),并具有可放大输入引脚与-输入引脚间的电压差的功能。 设计目标 输入输入输出输出频…

“Photoshop AI插件:StartAI的全面使用攻略

随着人工智能技术的飞速发展,Photoshop作为设计师们不可或缺的工具,也在不断地融入AI技术,以提升设计效率和效果。在2024年,PSAI插件StartAI因其强大的功能和易用性,成为了Photoshop用户的得力帮手。下面来给大家详细介…

银行数仓项目实战(五)--搭建数仓和数据标准化

文章目录 搭建数仓数据采集 标准层 搭建数仓 数据采集 业务系统源 -》ODS贴源层,添加标签,添加系统来源,添加时间戳 问甲方要建表语句,自己添加etldt字段和来源字段,通过之前文章教的Kettle把数据抽到自己数据库中。…

远程桌面另一台服务器连接不上,局域网IP如何访问另一台服务器

在IT运维工作中,远程桌面连接是日常工作中不可或缺的一部分。然而,当尝试远程桌面连接至另一台服务器时,如果连接不上,可能会引发一系列问题,影响到工作效率和信息安全。特别是在局域网环境中,确保能够正确…

MySQL学习——创建MySQL Workbench中的Connections

在MySQL Workbench中,Connections(连接)是用户与MySQL数据库进行交互的桥梁。 本文将添加一个新连接,该连接可以是初始连接,也可以是附加连接。在开始之前,必须安装、启动MySQL服务器的实例,并…

今年618各云厂商的香港服务器优惠活动汇总

又到了一年618年中钜惠活动时间,2024年各大云服务器厂商都有哪些活动呢?有哪些活动包括香港服务器呢?带着这些问题,小编给大家一一讲解各大知名厂商的618活动有哪些值得关注的地方,如果对你有帮助,欢迎点赞…

SK投屏助手:电脑控制手机,游戏与App轻松畅玩

SK投屏助手让您将手机画面完美投射至电脑屏幕,而且不止于此!现在,您可以利用电脑反向控制手机,轻松操作各种游戏和应用程序。无论是在家中放松还是在工作中提高效率,SK投屏助手都能成为您的得力助手。立即体验无缝连接…

51单片机STC89C52RC——3.1 数码管静态展示

目的 让数码管在指定位置显示指定数字 一,STC单片机模块 二,数码管 2.1 数码管位置 2.2 生活中用到的数目管 红绿灯 LED数码管在生活中随处可见,洗衣机、电饭煲、热水器、微波炉、冰箱、这些最基本的家用电器上基本都用到了这种7段LED数…

windows cmd bat 批处理脚本找到监听端口并并杀掉进程 nestat -ano

echo off rem 终止正在监听在端口8888上的进程 rem tokens5 表示第五个token for /f tokens5 %%p in (netstat -ano ^| findstr 8888) do ( set pid%%p ) echo xxxx %pid% rem xxxx TCP [::]:8888 [::]:0 LISTENING 2720 taskkill /pid %pid% /f if %errorlevel% equ 0 ( echo …

从零开始认识思科,并学会认识思科1.认识思科

hello大家好,我是风屿,今天我将从零开始带领大家认识思科设备中的各种技术以及配置,方便以后配置思科的设备,以及考取相应的证书。 在当今的数字化时代,网络扮演着至关重要的角色。而在网络技术领域,思科无…

java语言his系统医保接口 云HIS系统首页功能实现springboot框架+Saas模式 his系统项目源码

java语言his系统医保接口 云HIS系统首页功能实现springboot框架Saas模式 his系统项目源码 HIS系统的实施旨在整个医院建设企业级的计算机网络系统,并在其基础上构建企业级的应用系统,实现整个医院的人、财、物等各种信息的顺畅流通和高度共享&#xff0c…

英伟达市值飙升,超越苹果微软并超过英国股市总市值

原标题:英伟达超越苹果微软市值,成为全球市值最高的企业 易采游戏网6月19日消息:近日,美国科技巨头英伟达市值的迅速增长引起了市场广泛关注。据最新数据显示,截至本周二收盘,英伟达的市场资本化已达到3.34…

数据结构之探索“队列”的奥秘

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 目录 队列有关概念 队列的使用 队列模拟实现 循环队列的模拟实现 622. 设计循环队列 双端队…

【C++初阶路】--- 类和对象(中)

目录 一、this指针1.1 this指针的引出1.2 this指针的特性1.3. C语言和C实现Stack的对比 二、类的6个默认成员函数三、构造函数3.1 概念3.2 特性 一、this指针 1.1 this指针的引出 如下定义一个日期类Date class Date { public://void InitDate(Date* const this, int year …

[Vulnhub] BrainPan BOF缓冲区溢出+Man权限提升

信息收集 Server IP AddressPorts Open192.168.8.105TCP: $ nmap -p- 192.168.8.105 -sC -sV -Pn --min-rate 1000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-06-10 04:20 EDT Nmap scan report for 192.168.8.105 (192.168.8.105) Host is up (0.0045s latency). N…

gtk+2.0设置按钮背景图片

效果 在gtk+2.0中,可以通过gtk_widget_get_style获取按钮的样式,并设置bg_pixmap背景图片的方法。 其中bg_pixmap数组有下面的枚举类型,代表不同情况下的图片类型。这意味着你可以在按钮正常,鼠标覆盖和鼠标按下的时候分别设置不同的图片。 enum GtkStateType typedef e…

【植物大战僵尸杂交版】致敬传奇游戏玩家——一个普通人的六年坚持

目录 缘起 波澜 凌云 缘起 曾​​​​​​佳伟是《植物大战僵尸》的忠实粉丝,这款游戏给了他很多乐趣,也成为了他度过困难时期的精神支柱。他决定制作杂交版,部分原因是出于对原版游戏的热爱和致敬。 六年前,出于对一些pvz续作…

立讯精密:“果链一哥”怎么摆脱依赖症

AI手机创新赋能,隔岸苹果股价走出历史新高,消费电子有望迎来复苏? 这里我们聊聊苹果产业链代工龙头——立讯精密 作为早早入场的代工企业,立讯精密曾经吃足“果链”红利,如今摆在它面前的是增长、毛利、安全等难题。 …

Springboot 整合 Flowable(二):使用 Flowable BPMN visualizer 绘制流程图

📁 Springboot 整合 Flowable(一):使用 flowable-UI 绘制流程图-CSDN博客 一、安装 IDEA 插件:Flowable BPMN visualizer 二、绘制流程图 1、创建流程文件 2、选中文件后,右键打开流程图设计界面 以一个简…

使用fetch加载阿里云的在线json 出现403错误

在做地图项目的时候,引用了阿里云的在线JSON地图数据。 问题描述: 但是本地开发使用fetch请求json地址的时候接口却出现了403错误,把地址直接复制到浏览器上却能正常打开。 https://geo.datav.aliyun.com/areas_v3/bound/330000_full.json …