【问题标题】:How to export the Html Tables data into PDF using Jspdf如何使用 Jspdf 将 Html Tables 数据导出为 PDF
【发布时间】:2013-11-17 10:35:45
【问题描述】:

如何将 HTML 页面中的表格导出为 PDF。我已经做了一些示例数据,但我无法将 HTML 表格列表加载到 PDF 中,请任何人帮助我将表格加载到 PDF 中。

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>html2canvas example</title>
        <script type="text/javascript" src="js/jquery/jquery-1.7.1.min.js"></script>    
        <script type="text/javascript" src="js/jspdf.js"></script>    
        <script type="text/javascript" src="libs/FileSaver.js/FileSaver.js"></script>
        <script type="text/javascript" src="js/jspdf.plugin.standard_fonts_metrics.js"></script>
        <script type="text/javascript" src="js/jspdf.plugin.split_text_to_size.js"></script>
        <script type="text/javascript" src="js/jspdf.plugin.from_html.js"></script>    

        <script type="text/javascript">
            $(document).ready(function() { 
                var specialElementHandlers = {
                    '#editor': function(element, renderer) { return true; }
                };

                $('#cmd').click(function() {
                    var doc = new jsPDF();

                    doc.fromHTML($('#target').html(), 15, 15, {
                        'width': 170,'elementHandlers': specialElementHandlers
                    });

                    doc.save('sample-file.pdf');
                });  
            });
        </script>
    </head>
    <body id="target">
        <div id="content">
            <h3>Hello, this is a H3 tag</h3>

            <a class="upload">Upload to Imgur</a>    
            <h2>this is <b>bold</b> <span style="color:red">red</span></h2>

            <table border="1">
                <tr>
                    <th>Header 1</th>
                    <th>Header 2</th>
                </tr>
                <tr>
                    <td>row 1, cell 1</td>
                    <td>row 1, cell 2</td>
                </tr>
                <tr>
                    <td>row 2, cell 1</td>
                    <td>row 2, cell 2</td>
                </tr>
            </table>
        </div>

        <button id="cmd">generate PDF</button>
    </body>
</html>

http://jsfiddle.net/y2b7Q/327/

【问题讨论】:

    标签: jquery html jspdf


    【解决方案1】:

    AutoTable(a Table plugin for jsPDF) 是一个不错的选择,它包括主题、行跨度、列跨度、从 html 中提取数据、与 json 一起使用,您还可以个性化您的标题并使它们横排。 Here 是一个演示。

    【讨论】:

      【解决方案2】:

      有一个tablePlugin for jspdf 它需要对象数组并将该数据显示为表格。您可以对代码进行少量更改来设置文本和标题的样式。它是开源的,也有示例供您入门。

      【讨论】:

        【解决方案3】:

        这是一个我认为对你有帮助的例子

        <!DOCTYPE html>
        <html>
        <head>
        <script src="js/min.js"></script>
        <script src="js/pdf.js"></script>
        <script>
            $(function(){
                 var doc = new jsPDF();
            var specialElementHandlers = {
                '#editor': function (element, renderer) {
                    return true;
                }
            };
        
           $('#cmd').click(function () {
        
                var table = tableToJson($('#StudentInfoListTable').get(0))
                var doc = new jsPDF('p','pt', 'a4', true);
                doc.cellInitialize();
                $.each(table, function (i, row){
                    console.debug(row);
                    $.each(row, function (j, cell){
                        doc.cell(10, 50,120, 50, cell, i);  // 2nd parameter=top margin,1st=left margin 3rd=row cell width 4th=Row height
                    })
                })
        
        
                doc.save('sample-file.pdf');
            });
            function tableToJson(table) {
            var data = [];
        
            // first row needs to be headers
            var headers = [];
            for (var i=0; i<table.rows[0].cells.length; i++) {
                headers[i] = table.rows[0].cells[i].innerHTML.toLowerCase().replace(/ /gi,'');
            }
        
        
            // go through cells
            for (var i=0; i<table.rows.length; i++) {
        
                var tableRow = table.rows[i];
                var rowData = {};
        
                for (var j=0; j<tableRow.cells.length; j++) {
        
                    rowData[ headers[j] ] = tableRow.cells[j].innerHTML;
        
                }
        
                data.push(rowData);
            }       
        
            return data;
        }
        });
        </script>
        </head>
        <body>
        <div id="table">
        <table id="StudentInfoListTable">
                        <thead>
                            <tr>    
                                <th>Name</th>
                                <th>Email</th>
                                <th>Track</th>
                                <th>S.S.C Roll</th>
                                <th>S.S.C Division</th>
                                <th>H.S.C Roll</th>
                                <th>H.S.C Division</th>
                                <th>District</th>
        
                            </tr>
                        </thead>
                        <tbody>
        
                                <tr>
                                    <td>alimon  </td>
                                    <td>Email</td>
                                    <td>1</td>
                                    <td>2222</td>
                                    <td>as</td>
                                    <td>3333</td>
                                    <td>dd</td>
                                    <td>33</td>
                                </tr>               
                        </tbody>
                    </table>
        <button id="cmd">Submit</button>
        </body>
        </html>
        

        这里是输出

        【讨论】:

          【解决方案4】:

          很遗憾,这是不可能的。

          jsPDF 不支持 fromHTML 方法导出图片和表格。在 jsPDF v0.9.0 rc2

          【讨论】:

          • 是的,答案是“正确的”,但回答这个问题并不正确。 OP 正在寻求帮助以导出为 pdf,并已尝试过。
          【解决方案5】:

          How to properly use jsPDF library”可能会给你更多你需要的东西。该表无法正确呈现 (no css, per this answer),但您可以使用 jquery 对 html 表进行一些解析并自己手动设置样式。

          另一种选择是使用带有HTML2CanvasCasper.js 的HTML 屏幕截图。

          编辑

          这是一个使用 jspdf 单元插件的基本示例。它使用 jquery 和来自HTML Table to JSONtableToJson() 函数。

          确保包含 Deflate 库(两个 js 文件)和 jspdf.plugin.cell.js

          var table = tableToJson($('#table-id').get(0))
          var doc = new jsPDF('p', 'pt', 'a4', true);
          doc.cellInitialize();
          $.each(table, function (i, row){
            $.each(row, function (j, cell){
              doc.cell(10, 200, 100, 20, cell, i);
            })
          })
          doc.save()
          

          【讨论】:

            【解决方案6】:

            只要按照这些步骤,我就可以确保生成 pdf 文件

                <html>
                <head>
            
                <title>Exporting table data to pdf Example</title>
            
            
                <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.3.js"></script>
                <script type="text/javascript" src="js/jspdf.js"></script>
                <script type="text/javascript" src="js/from_html.js"></script>
                <script type="text/javascript" src="js/split_text_to_size.js"></script>
                <script type="text/javascript" src="js/standard_fonts_metrics.js"></script>
                <script type="text/javascript" src="js/cell.js"></script>
                <script type="text/javascript" src="js/FileSaver.js"></script>
            
            
                <script type="text/javascript">
                    $(document).ready(function() {
            
                        $("#exportpdf").click(function() {
                            var pdf = new jsPDF('p', 'pt', 'ledger');
                            // source can be HTML-formatted string, or a reference
                            // to an actual DOM element from which the text will be scraped.
                            source = $('#yourTableIdName')[0];
            
                            // we support special element handlers. Register them with jQuery-style 
                            // ID selector for either ID or node name. ("#iAmID", "div", "span" etc.)
                            // There is no support for any other type of selectors 
                            // (class, of compound) at this time.
                            specialElementHandlers = {
                                // element with id of "bypass" - jQuery style selector
                                '#bypassme' : function(element, renderer) {
                                    // true = "handled elsewhere, bypass text extraction"
                                    return true
                                }
                            };
                            margins = {
                                top : 80,
                                bottom : 60,
                                left : 60,
                                width : 522
                            };
                            // all coords and widths are in jsPDF instance's declared units
                            // 'inches' in this case
                            pdf.fromHTML(source, // HTML string or DOM elem ref.
                            margins.left, // x coord
                            margins.top, { // y coord
                                'width' : margins.width, // max width of content on PDF
                                'elementHandlers' : specialElementHandlers
                            },
            
                            function(dispose) {
                                // dispose: object with X, Y of the last line add to the PDF 
                                //          this allow the insertion of new lines after html
                                pdf.save('fileNameOfGeneretedPdf.pdf');
                            }, margins);
                        });
            
                    });
                </script>
                </head>
                <body>
                <div id="yourTableIdName">
                    <table style="width: 1020px;font-size: 12px;" border="1">
                        <thead>
                            <tr align="left">
                                <th>Country</th>
                                <th>State</th>
                                <th>City</th>
                            </tr>
                        </thead>
            
            
                        <tbody>
            
                            <tr align="left">
                                <td>India</td>
                                <td>Telangana</td>
                                <td>Nirmal</td>
                            </tr>
            <tr align="left">
                                <td>India</td>
                                <td>Telangana</td>
                                <td>Nirmal</td>
                            </tr><tr align="left">
                                <td>India</td>
                                <td>Telangana</td>
                                <td>Nirmal</td>
                            </tr><tr align="left">
                                <td>India</td>
                                <td>Telangana</td>
                                <td>Nirmal</td>
                            </tr><tr align="left">
                                <td>India</td>
                                <td>Telangana</td>
                                <td>Nirmal</td>
                            </tr><tr align="left">
                                <td>India</td>
                                <td>Telangana</td>
                                <td>Nirmal</td>
                            </tr><tr align="left">
                                <td>India</td>
                                <td>Telangana</td>
                                <td>Nirmal</td>
                            </tr>
                        </tbody>
                    </table></div>
            
                    <input type="button" id="exportpdf" value="Download PDF">
            
            
                </body>
            
                </html>
            

            输出:

            HTML 文件输出:

            PDF 文件输出:

            【讨论】:

              【解决方案7】:

              试着放

              doc.fromHTML($('#target').get(0), 15, 15, {
                  'width': 170,'elementHandlers': specialElementHandlers
              });
              

              而不是

              doc.fromHTML($('#target').html(), 15, 15, {
                  'width': 170,'elementHandlers': specialElementHandlers
              });
              

              【讨论】:

                【解决方案8】:

                我使用 Datatable JS 插件 将 html 表格数据导出为各种格式。根据我的经验,它非常快速、易于使用和配置,只需最少的编码。

                以下是使用数据表插件的示例 jquery 调用,#example 是您的表 id

                $(document).ready(function() {
                    $('#example').DataTable( {
                        dom: 'Bfrtip',
                        buttons: [
                            'copyHtml5',
                            'excelHtml5',
                            'csvHtml5',
                            'pdfHtml5'
                        ]
                    } );
                } );
                

                请在下面的数据表参考链接中找到完整的示例:

                https://datatables.net/extensions/buttons/examples/html5/simple.html

                这是配置后的样子(来自参考站点):

                您的 html 中需要有以下库引用(一些可以在上面的参考链接中找到)

                jquery-1.12.3.js
                jquery.dataTables.min.js
                dataTables.buttons.min.js
                jszip.min.js
                pdfmake.min.js
                vfs_fonts.js
                buttons.html5.min.js
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2014-05-26
                  • 2021-12-27
                  • 2021-10-15
                  • 2018-01-07
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-06-25
                  • 1970-01-01
                  相关资源
                  最近更新 更多