年尾手頭沒(méi)啥事磷杏,干起了打雜工作,最近幫忙解決后端項(xiàng)目里一個(gè)html批量轉(zhuǎn)pdf速度慢的問(wèn)題,項(xiàng)目里用到的轉(zhuǎn)換工具是 wkhtmltopdf 笆怠,這貨轉(zhuǎn)單個(gè)html還好,批量轉(zhuǎn)速度就慢了誊爹。幾經(jīng)摸索(各種baidu蹬刷、google......)各種測(cè)試后,終于找到個(gè)性能不錯(cuò)的工具 —— phantomjs
Phantomjs安裝
官網(wǎng)地址:http://phantomjs.org
下載地址:http://phantomjs.org/download.html
選擇合適自己系統(tǒng)的版本频丘,解壓就行办成,目錄結(jié)構(gòu)如下圖(mac為例)
新建 html2pdf.js 文件,把下面代碼拷進(jìn)去搂漠,文件最好放在phantomjs的bin目錄下
var page = require('webpage').create();
var system = require('system');
////讀取命令行參數(shù)诈火,也就是js文件路徑。
if (system.args.length === 1) {
console.log('Usage: loadspeed.js <some URL>');
//這行代碼很重要状答。凡是結(jié)束必須調(diào)用冷守。否則phantomjs不會(huì)停止
phantom.exit();
}
page.settings.loadImages = true; //加載圖片
page.settings.resourceTimeout = 30000;//超過(guò)10秒放棄加載
//截圖設(shè)置,
//page.viewportSize = {
// width: 1000,
// height: 3000
//};
var address = system.args[1];
page.open(address, function(status) {
function checkReadyState() {//等待加載完成將頁(yè)面生成pdf
setTimeout(function () {
var readyState = page.evaluate(function () {
return document.readyState;
});
if ("complete" === readyState) {
page.paperSize = { width:'1500px',height:'2000px',orientation: 'portrait',border: '1cm' };
var timestamp = Date.parse(new Date());
var pdfname = 'HT_'+timestamp + Math.floor(Math.random()*1000000);
var outpathstr = "/Users/zachary/Downloads/phantomjs2/bin/"+pdfname+".pdf";
page.render(outpathstr);
//console.log就是傳輸回去的內(nèi)容惊科。
console.log("生成成功");
console.log("$"+outpathstr+"$");
phantom.exit();
} else {
checkReadyState();
}
},1000);
}
checkReadyState();
});
Phantomjs使用
打開(kāi)終端拍摇,進(jìn)入phantomjs的bin目錄,執(zhí)行命令phantomjs html2pdf.js "網(wǎng)址或html文件路徑"
馆截,注意空格
生成路徑在 html2pdf.js 文件里設(shè)置充活,可以看到bin目錄下生成pdf成功
打開(kāi)看下效果,相當(dāng)Nice ! ! !
Java調(diào)用Phantomjs
新建工具類(lèi) Html2pdfUtil.java,代碼如下
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* 轉(zhuǎn)換html為pdf
* @author Zachary46
*/
public class Html2pdfUtil {
public static String parseHtml2Pdf(String url) throws IOException {
System.out.println(url);
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("/Users/zachary/Downloads/phantomjs2/bin/phantomjs /Users/zachary/Downloads/phantomjs2/bin/html2pdf.js "+url);
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuffer sbf = new StringBuffer();
String tmp = "";
while ((tmp = br.readLine()) != null) {
sbf.append(tmp);
}
String resultstr = sbf.toString();
System.out.println("resultstr:"+resultstr);
String[] arr = resultstr.split("\\$");
String result = "";
for(String s : arr){
if(s.endsWith("pdf"))result = s;
}
return result;
}
}
寫(xiě)個(gè) 測(cè)試類(lèi) Converter.java蜡娶,代碼如下
public class Converter {
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
String result = Html2pdfUtil.parseHtml2Pdf("https://www.baidu.com");
long all = System.currentTimeMillis()- start;
System.out.println("pdf生成地址:"+result+",用時(shí):"+all/1000+"秒");
}
}
運(yùn)行一下Converter.java 混卵,完美生成pdf 。