使用jspdf生成pdf報表
由于前臺html已經(jīng)動態(tài)生成報表,而且,前臺有一個功能,一個date range組件,當(dāng)你拖動的時候,報表會在不提交到后臺的情況下動態(tài)變化。
因此需要用到j(luò)s生成生報表:
用到的組件:
jquery.js jspdf.js canvg.js html2canvas.js jspdf.plugin.autotable.js
前臺動態(tài)生成的chart現(xiàn)在一般是用的html5的canvas或者是svg,很不幸運,我遇到的是svg, 如果是flash沒研究過。
由于報表還需要保持原h(huán)tml頁面的外觀,但是又不是整個html,真正需要轉(zhuǎn)換成pdf報表的是:html+svg
前提:jsPDF 支持html,但支持不是很好,當(dāng)你用一個html直接生成pdf的時候,其實他只保留了html里面文本,樣式,結(jié)構(gòu)都丟失了。
比如:table就丟失了。
jsPDF不支持svg導(dǎo)入。
思路:將svg轉(zhuǎn)換成canvas,再將html+canvas轉(zhuǎn)換成canvas,再使用html2canvas將canvas轉(zhuǎn)換成圖片,最后將圖片寫入pdf.
table的話就使用:jspdf.plugin.autotable.js
firefox: html2canvas不能直接將svg+html轉(zhuǎn)換成canvas --> 先將svg元素轉(zhuǎn)換成canvas --> html+canvas轉(zhuǎn)換成canvas
chrome: html2canvas可以直接將svg+html轉(zhuǎn)換成canvas
//將指定節(jié)點下面的所有svg轉(zhuǎn)換成canvas
//這里需要:canvg.js
function svg2canvas (targetElem) {
var nodesToRecover = [];
var nodesToRemove = [];
var svgElem = targetElem.find('svg');
svgElem.each(function(index, node) {
var parentNode = node.parentNode;
var svg = node.outerHTML;
var canvas = document.createElement('canvas');
canvg(canvas, svg);
nodesToRecover.push({
parent: parentNode,
child: node
});
parentNode.removeChild(node);
nodesToRemove.push({
parent: parentNode,
child: canvas
});
parentNode.appendChild(canvas);
});
}
//這里是將html(文本)在一個iframe里面打開
//主要是排除其它元素的干擾導(dǎo)致不成功,之前是一直輸出不成功,所示才使用iframe
//這段代碼是官網(wǎng)摳下來的。
//還有個問題就是:如果將頁面的chart轉(zhuǎn)換成canvas了,那web頁面報表動態(tài)變化的功能將丟失。
function openWithIframe(html){
var iframe = document.createElement('iframe');
iframe.setAttribute("id", "myFrmame");
var $iframe = $(iframe);
$iframe.css({
'visibility': 'hidden', 'position':'static', 'z-index':'4'
}).width($(window).width()).height($(window).height());
$('body').append(iframe);
var ifDoc = iframe.contentWindow.document;
//這里做是將報表使用到的css重新寫入到iframe中,根據(jù)自身的需要
var style = "<link href='/javax.faces.resource/css/auth.css.jsf' rel='stylesheet' type='text/css'>";
style+="<link href='/javax.faces.resource/css/common.css.jsf' rel='stylesheet' type='text/css'>";
style+="<link href='/javax.faces.resource/css/dc.css.jsf' rel='stylesheet' type='text/css'>";
html = "<!DOCTYPE html><html><head>"+style+"</head><body>"+html+"</body></html>"
ifDoc.open();
ifDoc.write(html);
ifDoc.close();
/*
//這里做一些微調(diào),根據(jù)自身的需要
var fbody = $iframe.contents().find("body");
fbody.find("#chart-center").removeAttr("width");
fbody.find(".page-container").css("width", "370px");
fbody.find(".center-container").css("width", "600px");
fbody.find("#severity-chart svg").attr("width", "370");
fbody.find("#status-chart svg").attr("width", "300");
*/
return fbody;
}
//導(dǎo)出pdf
function exportAsPDF(){
//得到要導(dǎo)出pdf的html根節(jié)點
var chartCenter = document.getElementById("chart-center").outerHTML;
var fbody = openWithIframe(chartCenter);
svg2canvas(fbody);
//html2canvas官網(wǎng)的標準方法
html2canvas(fbody, {
onrendered: function(canvas) {
//var myImage = canvas.toDataURL("image/png");
//alert(myImage);
//window.open(myImage);
/*
canvas.toBlob(function(blob) {
saveAs(blob, "report.png");
}, "image/png");
*/
//將圖片轉(zhuǎn)換成:base64編碼的jpg圖片。
var imgData = canvas.toDataURL('image/jpeg');
//alert(imgData);
//l:橫向, p:縱向
var doc = new jsPDF('l', 'pt', 'a3');
//var doc = new jsPDF('p', 'mm', [290, 210]);
//var doc = new jsPDF();//默認是A4,由于我的報表比較大,所以專門設(shè)置了尺寸。
doc.setFontSize(22);
doc.setFontType("bolditalic");
doc.text(500, 30, "Ticket Report"); //x:500, y:30
doc.addImage(imgData, 'jpeg', 10, 60); //寫入位置:x:10, y:60
doc.addPage(); //新建一頁
//這里就是把將table寫入到pdf里面。
var res = doc.autoTableHtmlToJson(document.getElementById("tickets-summary-table"), true);
doc.autoTable(res.columns, res.data);
doc.save('ticket.report_'+new Date().getTime()+'.pdf');
$('#myFrmame').remove(); //最后將iframe刪除
},
background:"#fff", //這里給生成的圖片默認背景,不然的話,如果你的html根節(jié)點沒有設(shè)置背景的話,會用黑色填充。
allowTaint: true //避免一些不識別的圖片干擾,默認為false,遇到不識別的圖片干擾則會停止處理html2canvas
});
};
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
相關(guān)文章
Jquery Ajax學(xué)習(xí)實例4 向WebService發(fā)出請求,返回實體對象的異步調(diào)用
Jquery Ajax學(xué)習(xí)實例4-向WebService發(fā)出請求,返回實體對象的異步調(diào)用2010-03-03
基于jquery的設(shè)置頁面文本框 只能輸入數(shù)字的實現(xiàn)代碼
之前寫過的方法有缺陷,可以輸入空格?,F(xiàn)在將空格也屏蔽了。就是在之前的代碼里加入了過濾空格的功能。2011-04-04
Jquery下的26個實用小技巧(jQuery tips, tricks & solutions)
前段時間發(fā)布了Jquery類庫1.4版本,使用者也越來越多,為了方便大家對Jquery的使用,下面列出了一些Jquery使用技巧。2010-03-03
jQuery模仿阿里云購買服務(wù)器選擇購買時間長度的代碼
jQuery仿阿里云購買服務(wù)器選擇時間長度,操作簡單,只需點擊所要選的時間段,對實現(xiàn)代碼感興趣的朋友參考下2016-04-04
圖片放大鏡jquery.jqzoom.js使用實例附放大鏡圖標
這篇文章主要介紹了圖片放大鏡jquery.jqzoom.js的使用另附放大鏡圖標,需要的朋友可以參考下2014-06-06
html+jQuery實現(xiàn)拖動滑塊圖片拼圖驗證碼插件【移動端適用】
這篇文章主要介紹了html+jQuery實現(xiàn)拖動滑塊圖片拼圖驗證碼插件,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09

