您的位置:首页 > 运维架构 > Linux

phantomjs的使用+Java代码+依赖js(兼容Linux和windows版本)

2016-05-28 15:53 716 查看
1、  在使用phantomjs的时候需要下载phantomjs,网上有window版本和Linux版本。将phantomjs放在Linux上的指定位置之后(如下面的/home/tpl/phantomjs-1.9.7-linux-x86_64/处),
2、  按照类似如下命令进行测试,是否可以生成图片(执行前检查phantomjs的权限,要有执行权限):
/home/tpl/phantomjs-1.9.7-linux-x86_64/bin/phantomjs
/home/tpl/phantomjs-1.9.7-linux-x86_64/examples/test.js       http://www.baidu.com /home/test/index.png
注意上面的命令,每个之间用空格隔开,其中:
/home/tpl/phantomjs-1.9.7-linux-x86_64/bin/phantomjs表示的是phantomjs所在的位置
/home/tpl/phantomjs-1.9.7-linux-x86_64/examples/test.js表示使用快照的时候需要的一个js
http://www.baidu.com  要生成快照的页面
/home/test/index.png  表示要将截的图放在的位置
 
3、要使用程序生成快照,需要执行shell命令或者cmd命令
能够兼容java和windows的一段java代码如下:
package xxxxx.webservice.snapshot;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
 
import com.ucap.utils.OsUtils;
 
/**
 * SnapshotServiceImpl.java 用于生成快照的服务类
 *
 * @attention 使用注意事项
 * @author
 * @date
 * @note begin modify by 涂作权 2016-5-19 判断在Linux上的情况
 */
public class SnapshotServiceImpl implements SnapshotService {
 
         /**
          * phantomjsPath   :phantomjs
          *     /home/tpl/phantomjs-1.9.7-linux-x86_64/bin/phantomjs
          *     /home/tpl/phantomjs-1.9.7-linux-x86_64/examples/test.js 
          *     http://xxxxx:5555/tpl/special/2016/5/19/2d0cd5d12a974e438a2f4a13300f60d2/index.html           *    
          * exportPath      :导出路径,这是一个绝对路径 
          *
          * 关于phantomjs的执行命令如:
          *     /home/tpl/phantomjs-1.9.7-linux-x86_64/bin/phantomjs
          *     /home/tpl/phantomjs-1.9.7-linux-x86_64/examples/test.js
          *     http://xxxx:5555/tpl/special/2016/5/19/2d0cd5d12a974e438a2f4a13300f60d2/index.html           *     /home/test/index.png
          */
         public String createSnapshot(String phantomjsPath, String exportPath) {
                   URL path = this.getClass().getClassLoader().getResource("/");
                   String str = path.getPath();
                   File file = new File(str);
                   str = file.getParentFile().getParentFile().getParentFile()
                                     .getAbsolutePath()
                                     + "/temp" + exportPath;
 
                   String[] strArray = null;
 
                   // 判断linux的执行情况
                   if (OsUtils.IS_LINUX) {
                            strArray = new String[3];
                            strArray[0] = "/bin/sh";
                            strArray[1] = "-c";
                            strArray[2] = phantomjsPath + " " + str;
                   } else if (OsUtils.IS_WINDOWS) {
                            strArray = new String[4];
                            strArray[0] = "cmd.exe";
                            strArray[1] = "/C";
                            strArray[2] = phantomjsPath;
                            strArray[3] = str;
                   }
 
                   File fileInfo = new File(str);
                   File fi = new File(fileInfo.getParentFile().getAbsolutePath());
                   if (!fi.exists()) {
                            fi.mkdirs();
                   }
 
                   // windows下phantomjs位置
                   Runtime rt = Runtime.getRuntime();
                   Process process = null;
                   try {
                            process = rt.exec(strArray);
                   } catch (IOException e) {
                            e.printStackTrace();
                   }
                   StringBuffer sbf = null;
                   InputStream is = null;
                   try {
                            is = process.getInputStream();
                            BufferedReader br = new BufferedReader(new InputStreamReader(is));
                            sbf = new StringBuffer();
                            String tmp = "";
 
                            while ((tmp = br.readLine()) != null) {
                                     sbf.append(tmp);
                            }
                   } catch (IOException e) {
                            e.printStackTrace();
                   } finally {
                            if (is != null) {
                                     try {
                                               is.close();
                                     } catch (IOException e) {
                                               e.printStackTrace();
                                     }
                                     is = null;
                            }
                   }
 
                   return sbf.toString();
         }
}
其中一个依赖的test.js如下:
var page = require('webpage').create();
 
//-----------------------------获取窗口的宽高信息,并设置,write by 涂作权 start------------------------------------
var winWidth = null;
var winHeight = null;
// 获取窗口宽度
if (window.innerWidth) {
    winWidth = window.innerWidth;
} else if ((document.body) && (document.body.clientWidth)) {
    winWidth = document.body.clientWidth;
}
// 获取窗口高度
if (window.innerHeight) {
    winHeight = window.innerHeight;
} else if ((document.body) && (document.body.clientHeight)) {
    winHeight = document.body.clientHeight;
}
// 通过深入 Document 内部对 body 进行检测,获取窗口大小
if (document.documentElement && document.documentElement.clientHeight && document.documentElement.clientWidth) {
    winHeight = document.documentElement.clientHeight;
    winWidth = document.documentElement.clientWidth;
}
page.viewportSize = {width:winWidth,height:winHeight};
page.clipRect = {top:0,left:0,width:winWidth,height:winHeight};
//-----------------------------获取窗口的宽高信息,并设置end--------------------------------------
//-----------------------------------------------------------------------------------------------
page.settings = {
         javascriptEnabled:false,
         loadImages:true,
         userAgent:'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) PhantomJS/19.0'
};
//-----------------------------------------------------------------------------------------------
 
 
system = require('system');
//var url = 'http://yule.club.sohu.com/gifttrade/thread/2m2efbrpfui';
var address;
var loca;
if(system.args.length == 1){
         phantom.exit();
}else{
         adress = system.args[1];
         loca = system.args[2];
         page.open(adress, function (status){
    if (status != "success"){
        console.log('FAIL to load the address');
        phantom.exit();
    }
       
    page.evaluate(function(){
        //此函数在目标页面执行的,上下文环境非本phantomjs,所以不能用到这个js中其他变量      
        //window.scrollTo(0,10000);//滚动到底部
                   //滚动到自适应高度
        //window.document.body.scrollTop = document.body.scrollHeight;
       
       /* window.setTimeout(function(){
            var plist = document.querySelectorAll("a");
            var len = plist.length;
            while(len)
            {
                len--;
                var el = plist[len];
                el.style.border = "1px solid red";
            }
        },5000);*/
    });
   
    window.setTimeout(function (){
                       //在本地生成截图
                            page.render(loca);      
                            //console.log(loca);
                            phantom.exit();
                   }, 1000);
         });
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: