因为工作需要,笔者需要将一个动态的HTML5页面生成图片,并将图片发送给用户。

其中难点在于怎样将动态H5生成图片

笔者翻阅资料后,决定使用phantomjs这个插件,关于这个插件的安装,非常简单,笔者不再赘述。

安装好插件后就是怎样使用这个插件了。

下面附上笔者的调用

private void exePhantomjs(String url,String filename){
        String BLANK = " ";
        Process process = null;
        try {
            process = Runtime.getRuntime().exec(
                    phantomjs + BLANK //你的phantomjs.exe路径
                    + calendarjs + BLANK //就是上文中那段javascript脚本的存放路径
                    + url + BLANK //你的目标url地址
                    + filePath+filename+".jpg");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         logger.info(phantomjs + BLANK+calendarjs + BLANK+url + BLANK+filePath+filename+".jpg");
         InputStream inputStream = process.getInputStream();
         BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
         String tmp = "";
         try {
            while ((tmp = reader.readLine()) != null) {
                 if (process != null) {
                     process.destroy();
                     process = null;
                 }
             }
            inputStream.close();
            reader.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         System.out.println("渲染成功...");
    }
    

 这里相当是JAVA直接调用第三方插件。需要传入四个参数

1,phantomjs的路径

2,执行脚本

3,动态H5的地址,可以使用百度地址进行测试,笔者在开发时使用了自己后台的H5页面

4,图片生成路径

接下来附上笔者的脚本

var page = require('webpage').create(), system = require('system'), address, output, size;

if (system.args.length < 3 || system.args.length > 5) {
    phantom.exit(1);
} else {
    address = system.args[1];
    output = system.args[2];
    //定义宽高
    page.viewportSize = {
        width : 1242,
        height : 10000
    };
    page.open(address, function(status) {

        var bb = page.evaluate(function() {
            return document.getElementsByTagName('html')[0].getBoundingClientRect();
        });
        var cc = page.evaluate(function() {
             return document.documentElement;

        });
        page.clipRect = {
            top : bb.top,
            left : bb.left,
            width : bb.width,
            height : cc.scrollHeight
        };
        window.setTimeout(function() {
            page.render(output);
            page.close();
            console.log('success...');

            //for (var item in cc){
            //    if('scrollHeight'==item){
            //        console.log(item,cc[item])
            //    }
            //}
            console.log('height',cc.scrollHeight)

            phantom.exit(1);
        }, 1000);
    });
}

整个过程比较简单,但是从技术选型,到开发,调试也历时一个星期。

最后附上笔者生成的图片

12-15 01:48