使用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;
}

最新文章

  1. 搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】
  2. rabbitmq性能优化之Consumer utilisation
  3. JAVAScript柯里化、部分应用参数终极理解
  4. Android6.0动态权限申请
  5. asp.net mvc 在视图中获取控制器与动作的名称
  6. 11g添加asm
  7. 关于TCP/IP的三次握手和四次挥手解释
  8. LintCode Balanced Binary Tree
  9. fzu 2111 Min Number
  10. DataList数据的绑定
  11. this及其作用域(函数外部this变量的调用)
  12. 关于DPC和workitem的简单用法
  13. Tornado源码探寻(请求到来)
  14. 【转】关于 Endnote 与 Word 卡死问题 标记语法错误
  15. Border - SGU 133(排序)
  16. 分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)
  17. MySQL 修改字段类型或长度
  18. 四款让你绝对上瘾的手机APP 用一次就会爱不释手
  19. Egret的容器--删除对象,遮罩
  20. 【题解】Luogu CF817F MEX Queries

热门文章

  1. var let const的一些区别
  2. 用java集合模拟登录和注册功能
  3. 840. Magic Squares In Grid (5月27日)
  4. Order Helper
  5. opencv移植(二)
  6. 嵌入式LInux之C语言提升篇---Skr Skr Up Up
  7. 『Python基础-9』元祖 (tuple)
  8. python3 练习题100例 (一)
  9. Java Integer == 以及分析
  10. c语言杨氏矩阵算法