通过前端js将页面表格导出为PDF(二)

  前面我说道了,将页面的表格导出为pdf,通过我给出的代码完好的实现了其需求,但是没过几天,又说不行了,因为我的表格是按照最多26行就进行分页,如果表格行数一多,就要点击下一页再进行pdf的导出,因为是面向客户的,所以要尽量减少用户的操作,因此要改成,一键导出所有的表格,然后自动分页,每页再加上特定的图片。我就日了@#@#@!这是。。。。,没办法,改呗,前前后后折腾了两天,终于让我给整出来了,不容易啊!真的的是有需求才有动力啊!

  先说一下我的方式:首先还是按照正常的进行分页显示,当点击导出pdf按钮时,跳转到另一个页面,在这个页面表格不进行分页,而是完全的显示在一页,然后渲染再pdf导出,通过cavase的错位,使用空白的图片,覆盖住多余的表格,然后依次下去,直到所有的都移动完,这样就可以多页导出了。就好像下图一样的原理

  首先还是老样子,引入文件

<script src="add/pdf/jquery.js"></script>
<script src="add/pdf/jspdf.debug.js"></script>
<script src="add/pdf/html2canvas.min.js"></script>
<script src="add/pdf/exportpdf.js"></script>

exportpdf.js

$(‘#exportpdf‘).click(function () {
    html2canvas(document.getElementById("contents"), {
        onrendered: function(canvas) {
            // 页面生成的canvas高
            var contentHeight = canvas.height;

            //未生成pdf的html页面高度
            var allHeight = contentHeight;

            //pdf页面头偏移距离(偏移量)
            var position = 60;

            //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
            var imgWidth = 595;

            var imgData = canvas.toDataURL(‘image/jpeg‘);

       var img1_base = ‘~‘;       var img2_base = ‘~‘;       var img3_base = ‘~‘;       var img4_base = ‘~‘;       var img5_base = ‘~‘;

            //初始化pdf,设置相应格式
            var doc = new jsPDF("p", "pt", "a4");
            var p = 1,
                i = 1.5,
                z = Math.ceil(last_counts/26);
              // 如果高度小于一页就
            if (allHeight < 1100) {
                // 页面表单
                doc.addImage(imgData, 0, position, imgWidth, contentHeight/i);
                // 一张空白图片(将超过的覆盖)
                doc.addImage(img4_base, 0, 0, 600, 110);
                // 公司logo
                doc.addImage(img1_base, 10, 5, 90, 50);
                doc.addImage(img2_base, 450, 5, 130, 50);
                // 空白图片(将不需要的覆盖)
                doc.addImage(img4_base, 0, 760, 600, 200);
                doc.addImage(img3_base, 450, 780, 120, 40);

                // 订单总计图片
                doc.addImage(img5_base, 0, 68, 600, 25);         // 文字(因为jspdf不支持中文,所以先将要用的中文制作成图片使用)
                doc.setFontSize(10);
                doc.text(8, 85, start_time);
                doc.text(75, 85, end_time);
                doc.text(160, 85, String(last_counts));
                doc.text(268, 85, String(total_price));
                doc.text(508, 85, String(lists[p]));

                doc.text(290, 820, String(p));
            } else {
                // 如果大于一页
                if (z > 0) {
                    // 页面表单
                    doc.addImage(imgData, 0, position, imgWidth, contentHeight/i);
                    // 空白图片
                    doc.addImage(img4_base, 0, 0, 600, 110);
                    // 公司logo
                    doc.addImage(img1_base, 10, 5, 90, 50);
                    doc.addImage(img2_base, 450, 5, 130, 50);
                    // 空白图片
                    doc.addImage(img4_base, 0, 760, 600, 200);
                    doc.addImage(img3_base, 450, 780, 120, 40);

                    // 订单总计图片
                    doc.addImage(img5_base, 0, 68, 600, 25);
                    doc.setFontSize(10);
                    doc.text(8, 85, start_time);
                    doc.text(75, 85, end_time);
                    doc.text(160, 85, String(last_counts));
                    doc.text(268, 85, String(total_price));
                    doc.text(508, 85, String(lists[p]));

                    doc.text(290, 820, String(p));            // 每导出一页就进行相应的偏移
                    position -= 624;
                    z -= 1;
                    while (z > 0) {
                        doc.addPage(‘a4‘, ‘pt‘);
                        // 页面表单
                        doc.addImage(imgData, 0, position, imgWidth, contentHeight/i);
                        // 空白图片
                        doc.addImage(img4_base, 0, 0, 600, 130);
                        // 表头
                        doc.addImage(img6_base, 5, 113, 586, 24);
                        // 公司logo
                        doc.addImage(img1_base, 10, 5, 90, 50);
                        doc.addImage(img2_base, 450, 5, 130, 50);
                        doc.addImage(img4_base, 0, 760, 600, 200);
                        doc.addImage(img3_base, 450, 780, 120, 40);

                        // 订单总计图片
                        doc.addImage(img5_base, 0, 68, 600, 25);
                        doc.setFontSize(10);
                        doc.text(8, 85, start_time);
                        doc.text(75, 85, end_time);
                        doc.text(160, 85, String(last_counts));
                        doc.text(268, 85, String(total_price));
                        p += 1;
                        doc.text(508, 85, String(lists[p]));

                        doc.text(300, 820, String(p));
                        // allHeight -= 1000;
                        position -= 624;
                        z -= 1;
                    }
                }
            }
            doc.save(‘bill.pdf‘);
        },
        background: ‘#FFF‘
    })
 });
时间: 2024-11-05 06:17:54

通过前端js将页面表格导出为PDF(二)的相关文章

通过前端js将页面表格导出为PDF

最近工作太忙了,要同时用django重构两个系统,前后端都是我一个人写,前端要设计大量的表单,后端要处理大量的数据,身心俱疲啊!周末都没空,有半个月没有写博客了,今天没心情加班,腾出时间写写这半个月积累的技术经验. 因为开发的系统是服务于酒店的,需要定期和酒店对账,所以要将表格导出为execl表格,这要求简单,在前端写写js代码就行了:后来又改需求,execl不行,会被人为改动,要导出为pdf,还要每页加上公司的logo和其他乱七八糟的东西:没办法,只能去github上看看有没有好的第三方插件了

html页面表格导出到excel

几种把html页面表格导出到excel的方法比较. 表格例子如下: <table id="tableExcel" width="100%" border="1" cellspacing="0" cellpadding="0"> <tr> <td colspan="5" align="center">html 表格导出道Exceltd

页面直接导出为PDF文件,支持分页与页边距

将WEB页面直接导出为pdf文件是经常会用到的一个功能,尤其是各种报表系统.总结了一下目前几种主流的做法: 在后端用代码生成pdf文件,比如iText一类: 在后端抓取页面并生成pdf文件,比如phantomjs一类: 在前端用js直接生成pdf文件: 方案3的优势在于前端直接生成,所见即所得.今天要探索的就是html2canvas和jspdf,前者用于将页面元素render生成canvas,后者用于将canvas生成pdf文档.需要注意的是,这种方法对IE系列支持不好. html2canvas

通过JS获取页面表格选中行信息

在ASP.NET中表格的显式方法多种多样,有html标签<table></table>,有asp服务器控件GridView,还有Repeater控件等都可以帮我们在页面显式表格信息.GridView控件比较强大,它有自带的属性和方法可以用来对显式的表格数据进行各种操作.但是如果使用传统html标签<table></table>或者是Repeater控件来显式数据,又该如何取到选中行的数据呢.这里我们来介绍一下利用JS来取页面表格数据的方法. 如图所示,我们需

html页面表格导出到excel总结

转载:http://www.cnblogs.com/liuguanghai/archive/2012/12/31/2840262.html <table id="tableExcel" width="100%" border="1" cellspacing="0" cellpadding="0"> <tr> <td colspan="5" align=&qu

js实现页面表格筛选

关于表格内容的筛选处理有很多种方法,总体来说可以分为前端和后端两种.1,用带筛选条件的sql语句去查询数据库,得到需要的数据显示在页面上,最好用ajax来实现.2,页面渲染的时候带条件地显示需要的数据. 最近也是碰到了问题,用上述第一种方法行不通,因为表格的包含自定义的checkbox,重新加载过后需要绑定click事件.而用ajax来做的话,绑定事件会在元素加载完成之前就执行.所以不考虑.而用前端筛选也遇到问题.用jstl的<c:choose>与<c:when>,<c:ot

js操作table表格导出数据到excel方法

js导出excel资料很少,网上也找了很多,基本都不能用,要么只能是IE用,还必须要权限,这是非常不好的.后来到github上找到table2excel.js,虽然可以用,但仍然对IE支持不够,也算不错的东西. 导出的excel文件是xlsx,也可以改为xls打开.注意的是,要对每个table做个标记,加上div框架如代码: <div class="table-responsive table2excel" data-tableName="Test Table 1&qu

JS 将页面上的表格导出为 Excel 文件

如果在页面上展示了一个表格,想把这个表格导出为Excel文件,那么在要求不高的情况下,可以直接利用 JavaScript 的 Blob 和 Object URL 特性将表格导出.不过,这就是利用了 Excel 能打开 HTML 文档的特性,所以导出的表格实际上是一个 HTML 文档,并且其扩展名只能为 .xls,而不能是 .xlsx,否则Excel无法打开.(有使用JavaScript生成真正Excel文件的方案,以后再研究.) 实例: <!DOCTYPE html> <html>

Vue导出模板、使用前端js办法导出表格数据、导入表格前端读取表格数据、导入表格发送后端读取数据

以下是几种用的较多的函数方法,可以参考使用. // 導出1 myExport() { // post請求文件寫法1 const url = 'http://XXXX/XXXX/XXXX/XXXX' const formData = new FormData() formData.append('file', '123') this.axios({ method: 'post', url: url, data: formData, responseType: 'blob' // 表明返回服務器返回