你的位置:首页 > Java教程

[Java教程]js生成pdf报表


由于前台html已经动态生成报表,而且,前台有一个功能,一个date range组件,当你拖动的时候,报表会在不提交到后台的情况下动态变化。
因此需要用到js生成生报表:

用到的组件:

jquery.jsjspdf.jscanvg.jshtml2canvas.jsjspdf.plugin.autotable.js


前台动态生成的chart现在一般是用的html5的canvas或者是svg,很不幸运,我遇到的是svg, 如果是flash没研究过。
由于报表还需要保持原html页面的外观,但是又不是整个html,真正需要转换成pdf报表的是:html+svg

前提:jsPDF 支持html,但支持不是很好,当你用一个html直接生成pdf的时候,其实他只保留了html里面文本,样式,结构都丢失了。
比如:table就丢失了。
jsPDF不支持svg导入。

思路:将svg转换成canvas,再将html+canvas转换成canvas,再使用html2canvas将canvas转换成图片,最后将图片写入pdf.
table的话就使用:jspdf.plugin.autotable.js

firefox:html2canvas可以直接将svg转换成canvas.
chrome: 不能将svg转换成canvas因此需要将svg转换成canvas

//将指定节点下面的所有svg转换成canvas//这里需要:canvg.jsfunction 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里面打开//主要是排除其它元素的干扰导致不成功,之前是一直输出不成功,所示才使用iframe//这段代码是官网抠下来的。
//还有个问题就是:如果将页面的chart转换成canvas了,那web页面报表动态变化的功能将丢失。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中,根据自身的需要 var style = "<link href='http://www.cnblogs.com//javax.faces.resource/css/auth.css.jsf' rel='stylesheet' type='text/css'>"; style+="<link href='http://www.cnblogs.com//javax.faces.resource/css/common.css.jsf' rel='stylesheet' type='text/css'>"; style+="<link href='http://www.cnblogs.com//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(); /* //这里做一些微调,根据自身的需要 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;}




//导出pdffunction exportAsPDF(){  //得到要导出pdf的html根节点    var chartCenter = document.getElementById("chart-center").outerHTML;    var fbody = openWithIframe(chartCenter);  svg2canvas(fbody);    //html2canvas官网的标准方法  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");      */            //将图片转换成: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,由于我的报表比较大,所以专门设置了尺寸。      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根节点没有设置背景的话,会用黑色填充。    allowTaint: true  //避免一些不识别的图片干扰,默认为false,遇到不识别的图片干扰则会停止处理html2canvas  });  };

 




7月泰国旅游泰国旅游多少钱一人泰国游费用泰国旅游团购泰国蜜月旅游连州地下河旅游景区特色?清远连州地下河好玩不? 清远连州地下河票价?连州地下河门票优惠价? 约旦印象:一半是海水一半是火焰 世界上最穷的十个国家:人均GDP700美元以下(全文) 宝桑园秋季也能采桑果吗?花都宝桑园秋季桑果采摘时间? 2015宝桑园桑果采摘节什么时候?花都宝桑园秋季桑果采摘节时间? 花都宝桑园桑果香瓜采摘文化节开始了吗?宝桑园秋季有什么? 国庆节去宝桑园还能摘桑果吗?花都宝桑园桑果采摘时间? 印象海南岛嘉宾席团购价格?印象海南岛嘉宾席预定优惠? 生日当天免费游森波拉奇妙世界吗?佛冈森波拉怎么取到免费票? 古龙峡第二届捞鸡节开始了吗?清远古龙峡捞鸡节有什么好玩的? 桂林乐满地乐园好玩吗?乐满地主题乐园图片? 厦门方特梦幻王国门票团购购票注意事项? 厦门11月的天气如何?穿什么衣服好? 去厦门哪里有卖春卷?怎做? 2015厦门有哪些特产美食可以带回家乡的? 12105A822GAT2A Datasheet 12105A822GAT2A Datasheet SQCB7M110JAJME\500 Datasheet SQCB7M110JAJME\500 Datasheet 12061A300KAT2A Datasheet 12061A300KAT2A Datasheet 高跷钓鱼 高跷钓鱼 高跷钓鱼 千岛湖旅游线路 千岛湖旅游线路 千岛湖旅游线路 点评网 厦门 点评网 厦门 点评网 厦门