Java Html轉(zhuǎn)pdf實(shí)戰(zhàn)

年尾手頭沒(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文件路徑"馆截,注意空格

image.png

生成路徑在 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 。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窖张,一起剝皮案震驚了整個(gè)濱河市幕随,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宿接,老刑警劉巖赘淮,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辕录,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡梢卸,警方通過(guò)查閱死者的電腦和手機(jī)走诞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蛤高,“玉大人蚣旱,你說(shuō)我怎么就攤上這事〈鞫福” “怎么了姻锁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)猜欺。 經(jīng)常有香客問(wèn)我位隶,道長(zhǎng),這世上最難降的妖魔是什么开皿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任涧黄,我火速辦了婚禮,結(jié)果婚禮上赋荆,老公的妹妹穿的比我還像新娘笋妥。我一直安慰自己,他們只是感情好窄潭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布春宣。 她就那樣靜靜地躺著,像睡著了一般嫉你。 火紅的嫁衣襯著肌膚如雪月帝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天幽污,我揣著相機(jī)與錄音嚷辅,去河邊找鬼。 笑死距误,一個(gè)胖子當(dāng)著我的面吹牛簸搞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播准潭,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼趁俊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了刑然?” 一聲冷哼從身側(cè)響起寺擂,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后沽讹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡武鲁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年爽雄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沐鼠。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挚瘟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饲梭,到底是詐尸還是另有隱情乘盖,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布憔涉,位于F島的核電站订框,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏兜叨。R本人自食惡果不足惜穿扳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望国旷。 院中可真熱鬧矛物,春花似錦、人聲如沸跪但。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屡久。三九已至忆首,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間被环,已是汗流浹背雄卷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛤售,地道東北人丁鹉。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像悴能,于是被迫代替她去往敵國(guó)和親揣钦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容