Java通过phantomjs实现html截图

功能: 实现是卡片分享的功能

开始技术选型选的是DJNativeSwing,但是windows是可以使用,发布到linux就不行了。虽然参照前辈方法进行解决,还是一直报org.eclipse.swt.SWTError:No more handles [gtk_init_check() failed]异常。在长时间未解决这个问题。只好

一、服务器安装 phantomjs 工具

    1、解压安装包phantomjs-2.1.1-linux-x86_64.tar  

    2、设置环境变量 exportPATH=/usr/local/phantomjs-2.1.1-linux-x86_64/bin:$PATH

    3、安装phantomjs相关包(图片字体)

     sudo yum install bitmap-fontsbitmap-fonts-cjk

    4、安装完成测试

        cd /usr/local/phantomjs-2.1.1-linux-x86_64/examples

        phantomjs hello.js

        查看结果是否打印:hello,world!

    5、碰到特殊字体linux上没有。需要导入字体 

            新建目录/usr/share/fonts/newfonts

            将font.zip压缩包解压到newfonts文件夹

            sudo mkfontscale

            sudo mkfontdir

            sudo fc-cache –fv

二、Java代码那块( 这边实现会在服务器生成一个本地html文件,调用phantomjs读取本地html文件进行截图)

代码只贴了部分代码,复制过去需要自行调整才能执行

private static final String EXE_COMMAND = "phantomjs";

private static final String BLANK = "  ";

/**
	 * 
	 * <p>     
	 * Description: 删除html文件/判断文件是否生成成功 返回结果是否成功
	 * </p>  
	 * @author  ---
	 * @created 2018年1月19日 上午9:54:01
	 * @param result phantomjs返回结果
	 * @param shareCardPath 生成卡片路径
	 * @param resultHtmlAddress html地址
	 * @return  boolean
	 */
private boolean handleResult(String result,String shareCardPath, String resultHtmlAddress,boolean checkFileIsCreate) {
Process process = Runtime.getRuntime().exec(PhantomjsService.EXE_COMMAND + BLANK //你的phantomjs.exe路径

					+ getExeScriptPath() + BLANK // 截图 javascript脚本的存放路径
					+ resultHtmlAddress + BLANK //你的目标url地址
					+ shareCardPath);//你的图片输出路径
			inputStream = process.getInputStream();
			reader = new BufferedReader(new InputStreamReader(inputStream));
			String result = reader.readLine();
			return handleResult(result,shareCardPath, resultHtmlAddress);

}

createArticleCard.js 代码:

var webPage = require('webpage');
var system = require('system');
var address = system.args[1];
var output = system.args[2];
var page = webPage.create();
page.viewportSize = {
	width : 750,
	height : 100
};
page.open(address, function(status) {
	if (status == "success") {
		var length = page.evaluate(function(s) {
			var div = document.getElementById("screenshot");
			var bc = div.getBoundingClientRect();
			var top = bc.top;
			var left = bc.left;
			var width = bc.width;
			var height = bc.height;
			window.scrollTo(0, 10000);// 滚动到底部
			return [ top, left, width, height ];
		});
		page.clipRect = {
			top : length[0],
			left : length[1],
			width : length[2],
			height : length[3]
		};
		page.render(output);
		console.log("success");
		phantom.exit();
	} else {
		console.log(status);
		phantom.exit(1);
	}
});


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页