博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
phantomjs抛出IOException
阅读量:5943 次
发布时间:2019-06-19

本文共 4172 字,大约阅读时间需要 13 分钟。

使用phantomjs对网页进行截图遇到的问题

问题描述:

  1. 使用的phantomjs版本:phantomjs-2.1.1-windows
  2. 使用的截图js文件,\phantomjs-2.1.1-windows\examples\rasterize.js
  3. 使用的java驱动代码:
package mackimg;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;/** * @Description:根据网页地址转换成图片 * @Author: admin * @CreateDate: 2018年6月22日 */public class PhantomTools {    private static String tempPath = "F:/phantomjs";// 图片保存目录    private static String BLANK = " ";    // 下面内容可以在配置文件中配置    private static String binPath = "D:/phantomjs-2.1.1-windows/bin/phantomjs.exe";// 插件引入地址    private static String jsPath = "D:/phantomjs-2.1.1-windows/rasterize.js";// js引入地址     // 执行cmd命令    public static String cmd(String imgagePath, String url) {        return binPath + BLANK + jsPath + BLANK + url + BLANK + imgagePath;    }    //关闭命令    public static void close(Process process, BufferedReader bufferedReader) throws IOException {        if (bufferedReader != null) {            bufferedReader.close();        }        if (process != null) {            process.destroy();            process = null;        }    }        /**     * @param userId      * @param url     * @throws IOException      */    public static void printUrlScreen2jpg(String url) throws IOException{        String imgagePath = tempPath+"/"+System.currentTimeMillis()+".png";//图片路径        //Java中使用Runtime和Process类运行外部程序        Process process = Runtime.getRuntime().exec(cmd(imgagePath,url));        InputStream inputStream = process.getInputStream();        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));        String tmp = "";        while ((tmp = reader.readLine()) != null) {              close(process,reader);        }        System.out.println("success");    }        public static void main(String[] args) throws IOException {        String url = "https://www.baidu.com/";//以百度网站首页为例        PhantomTools.printUrlScreen2jpg(url);    }}

以上可以参考文章:

运行之后出现异常:

Exception in thread "main" java.io.IOException: Stream closed    at java.io.BufferedReader.ensureOpen(BufferedReader.java:122)    at java.io.BufferedReader.readLine(BufferedReader.java:317)    at java.io.BufferedReader.readLine(BufferedReader.java:389)    at mackimg.PhantomTools.printUrlScreen2jpg(PhantomTools.java:48)    at mackimg.PhantomTools.main(PhantomTools.java:59)

更换网址:

String url = "http://www.cnblogs.com/han108/p/9216583.html";

能正常运行,但是后台没有图片.

更换js文件

我在网上看了别人用的另一个js文件,我命名为22.js.内容是:

var page = require('webpage').create(),    system = require('system'),    address, output, size;if (system.args.length < 3 || system.args.length > 5) {    console.log('Usage: rasterize.js URL filename');    phantom.exit(1);} else {    address = system.args[1];    output = system.args[2];    page.viewportSize = { width: 600, height: 600 };    page.open(address, function (status) {      // 通过在页面上执行脚本获取页面的渲染高度      var bb = page.evaluate(function () {         return document.getElementsByTagName('html')[0].getBoundingClientRect();       });      // 按照实际页面的高度,设定渲染的宽高      page.clipRect = {        top:    bb.top,        left:   bb.left,        width:  bb.width,        height: bb.height      };      // 预留一定的渲染时间      window.setTimeout(function () {        page.render(output);        page.close();        console.log('render ok');      }, 1000);    });}
  1. 使用百度链接,抛出上面提到的异常.后台没有图片
  2. 使用cnblogs链接,抛出上面的异常,后台有图片

问题分析

不懂,不知道,去他妈的

问题解决

  1. 把代码更改为:
while ((tmp = reader.readLine()) != null) {          }close(process,reader);

可以解决抛出异常和后台无法获取图片的问题,但是如果使用22.js,会出现程序运行完无法自动停止的问题.

  1. 注意到,22.js文件最后几行:
window.setTimeout(function () {        page.render(output);        page.close();        console.log('render ok');      }, 1000);    });

js文件执行完会发送一句"render ok",这就导致java代码中的while ((tmp = reader.readLine()) != null)无法跳出,陷入阻塞状态,无法理解的是,此时自然无法执行到close(process,reader);,但是后台仍然可以获得图片.

如果此时把代码更改为:

while ((tmp = reader.readLine()) != null) {              close(process,reader);            break;        }

此时能正常运行,后台也有图片.

  1. 按照第二种更改后的条件下,在把js文件更改为:\phantomjs-2.1.1-windows\examples\rasterize.js,程序能正常运行,后台有图片;

推荐解决办法

代码更改为:

while ((tmp = reader.readLine()) != null) {              close(process,reader);            break;        }
你可能感兴趣的文章
人工神经网络
查看>>
信用分计算(自研)
查看>>
055——VUE中vue-router之路由参数的随意设置与伪静态链接地址处理:
查看>>
迭代器
查看>>
性能压测,SQL查询异常
查看>>
JMessage Android 端开发详解
查看>>
Console命令详解,让调试js代码变得更简单
查看>>
一本通 1285:最大上升子序列和
查看>>
关于UseSubmitBehavior和OnClientClick同时使用,导致无法触发后台事件的问题
查看>>
《小岛经济学--鱼、美元和经济的故事》Digest
查看>>
深入浅出 消息队列 ActiveMQ(转)
查看>>
oracle client server那点事
查看>>
坐飞机的一个现象
查看>>
SSH学习笔记(一)
查看>>
android:layout_weight的真实含义
查看>>
挂载磁盘
查看>>
[android] 练习样式主题自定义activity切换动画
查看>>
springmvc4之<mvc:exclude-mapping path="" />拦截配置
查看>>
深度解析使用CSS单位px、em、rem、vh、vw、vmin、vmax实现页面布局
查看>>
iOS之KVO
查看>>