在項目中使用Echarts來生成報表,效果不錯,以後有個需求要設置定時時間給指定的郵箱發送報表郵件。後臺使用JFreeChart生成的話樣式不協調,而Echarts須要瀏覽器內核來執行js,後來嘗試過htmlunit,對echarts支持的不是很好,遂放棄了。後來搜索中在一篇博客看到PhantomJs的介紹博客地址能夠實現上述需求。html
PhantomJs是一個無頭瀏覽器,對前端頁面支持不錯,對於一些須要爬取異步加載的頁面頗有用。前端
安裝方法網上不少,java
#進入/opt目錄
cd /opt
#下載phantomjs
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
#解壓軟件壓縮包
tar xvf phantomjs-2.1.1-linux-x86_64.tar.bz2 linux
# 編輯配置文件.
vim /etc/profile
# 將PhantomJS的bin目錄加入到PATH環境變量中.
export PATH=${PATH}:/opt/phantomjs-2.1.1-linux-x86_64/bingit
# 退出vi編輯器,使用source命令讓剛纔的配置即時生效.
source /etc/profilegithub
# 測試PhantomJS是否安裝成功,若是打出了版本信息,即安裝成功.
phantomjs -v web
#請phantom.js放到/opt目錄下spring
安裝完成須要編輯phantomjs腳本,可參考如下腳本:canvas
var system = require('system');
var page = require('webpage').create();vim
// 若是是windows,設置編碼爲gbk,防止中文亂碼,Linux自己是UTF-8
var osName = system.os.name;
if ('windows' === osName.toLowerCase()) {
phantom.outputEncoding="gbk";
}
// 獲取第二個參數(即請求地址url).
var url = system.args[1];
// 顯示控制檯日誌.
page.onConsoleMessage = function(msg) {
console.log('[' + msg + ']');
};
//打開給定url的頁面.
page.open(url, function(status) {
if (status == 'success') {
//console.log('echarts頁面加載完成,加載耗時:' + (new Date().getTime() - start) + ' ms');
// 因爲echarts動畫效果,延遲500毫秒確保圖片渲染完畢再調用下載圖片方法.
console.log("頁面加載成功!");
} else {
console.log("頁面加載失敗 Page failed to load!");
}
// 10秒後再關閉瀏覽器.
setTimeout(function() {
phantom.exit();
}, 10000);
});
在剛開始使用時發現沒有執行頁面JS,將page.content打印才發現訪問頁面被登錄攔截了。
上傳服務器時報錯2018-09-21 15:41:29[DEBUG]-[Thread: TP-exec-1]-[org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues()]: Failed to resolve argument 0 of type 'java.lang.String'
org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'doc' is not present
後來發現是web容器作了上傳限制致使,在tomcat配置中加入maxPostSize="-1"便可
Phantomjs+echarts後臺生成報表遇到一個問題生成報表文件的base64編碼的URL的圖片,體積會100倍,內容裏會多出不少個A,在GitHub搜索到相似狀況並給出解決方案
https://github.com/ariya/phantomjs/issues/10455
大體由於phantomjs對canvas和png格式不兼容致使,須要明確質量參數
解決方法是修改Echarts源碼將echarts中用canvas生成圖片的方法指定質量參數0便可解決,相似如下:
varo="svg"===this._zr.painter.getType()?this.getSvgDataUrl():this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png",0.5));
使用jepg格式能夠規避這種問題
myChart.getDataURL({
type:'jpeg',
pixelRatio: 1,
backgroundColor: '#fff'
});
又雙叒叕有問題了,線上和仿真渲染出的圖片文字模糊一直存在,一直在找phantomjs的問題,想找個替代的方案.今天想到模糊的文字都是沒有中文的,而後就想到是系統字體的緣由
操做步驟以下:
1.將附件中字體複製到 /usr/share/fonts/zh_CN 目錄下
2.對目錄受權 #chmod 777 /usr/share/fonts/zh_CN
3.#mkfontscale // 若是提示 mkfontscale: command not found,需自行安裝 #yum install mkfontscale
4.#mkfontdir
5.#fc-cache –fv // 刷新內存中的字體緩存
6.#source /etc/profile // 執行如下命令讓字體生效