PhantomJS 是一个基于WebKit的服务器端 JavaScript API。它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。PhantomJS可以用于页面自动化,网络监测,网页截屏,以及无界面测试等。
需要先安装好phantomjs
执行使用到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];
console.log(page.settings.userAgent );
// 不加分页的话,只输出一页pdf,底部会有大量空白。
//google "phantomjs render pdf bottom blank" 可以看到别人也报过这种bug
// 最终查找Phantomjs generates multiple page PDF 竟然解决了问题
page.paperSize = { format: 'A4', orientation: 'portrait', margin: '0.8cm' };
// page.viewportSize = { width: 600, height: 800 };
console.log("open page now");
page.open(address, function (status) {
//evaluate注册一个回调函数,页面加载完就执行。用来操作页面中的DOM元素
//修改微信公众号文章中图片lazy load的方式
var size = page.evaluate(function () {
//此函数在目标页面执行的,上下文环境非本phantomjs,所以不能用到这个js中其他变量
//这个控制台打印的效果在phantomjs执行界面看不到
console.log('start image lazy loading');
var imgs = document.getElementsByTagName('img');
var size = 0;
console.log(size);
for (var i = imgs.length - 1; i >= 0; i--) {
var data_src = imgs[i].getAttribute("data-src");
if (data_src){
imgs[i].setAttribute("src", data_src);
size++;
}
}
return size;
} );
console.log("change lazy load img number:" + size);
// 预留一定的渲染时间
window.setTimeout(function () {
page.render(output);
page.close();
console.log('render ok');
phantom.exit();
}, 5000);
});
};
手动执行命令
./phantomjs getPdf.js https://cftweb.3g.qq.com/privacy/privacyPolicy?content_id=73fa6604b9102a6d4ed976999335fa22 /temp/test.pdf
查看执行后PDF结果,最终生成的pdf渲染效果良好,无排版错乱
通过java代码调用方式
package cn.utils;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.Objects;
/**
* @author bing
* @version 1.0.0
* @ClassName PhantomJsUtils.java
* @Description TODO
* @createTime 2022年05月31日 15:04:00
*/
@Slf4j
public class PhantomJsUtils {
public static String getImage(String phantomjsPath, String url,String outPahth) {
String osName = System.getProperty("os.name");
String suffix = Objects.nonNull(osName) && osName.toLowerCase().contains("windows") ? ".exe" : "";
phantomjsPath = phantomjsPath+ File.separator + "PhantomJS" + File.separator;
String cmdStr = phantomjsPath +"phantomjs"+ suffix + " "+ phantomjsPath + "getPdf.js " + url +" "+ outPahth;
Runtime rt = Runtime.getRuntime();
log.info("phantomjs={}", cmdStr);
try {
File path = new File(phantomjsPath);
Process ps = rt.exec(cmdStr, (String[])null, path);
BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while((line = br.readLine()) != null) {
sb.append(line);
}
String result = sb.toString();
return result;
} catch (Exception e) {
log.warn("phantomjs error {}", e.getMessage(), e);
return "";
}
}
public static void main(String[] args) {
String phantomPahth = "F:/temp/"; //工具目录
String url = "https://cftweb.3g.qq.com/privacy/privacyPolicy?content_id=73fa6604b9102a6d4ed976999335fa22"; //网页内容
String outPahth = "F:/temp//test.png"; //图片输出目录
String result = getImage(phantomPahth, url, outPahth);
System.out.println(result);
}
}
发布者:小站,转转请注明出处:http://blog.gzcity.top/4592.html