jspdf - putTotalPages 在 jspdf-autotable header 中不起作用

标签 jspdf jspdf-autotable

我正在尝试将“页码 x of y”添加到使用 jspdf 和 jspdf-autotable 生成的 PDF 中。我使用了 jspdf-autotable 示例网站上的 Examples.js 文件中的代码,还使用了该网站中的 jspdf.debug.js 文件,其中包含 putTotalPages 函数。

我在每个页面上得到的结果是第一页上的“第 1 页,共 {total_pages_count_string}”和第二页上的“第 2 页,共 {total_pages_count_string}”,即,total_pages_count_string 似乎未正确更新。

我的整个代码如下:

$('#print').click(function() {
            $('#html-table table').remove();
            var table = $("#amu-whiteboard").tabulator("getHtml");
            $('#html-table').append(table);
            $('#html-table>table').attr("id", "table");
            $('#table th:not(:nth-child(1), :nth-child(2)), #table td:not(:nth-child(1), :nth-child(2))').remove();
            var columns = ["Bed", "Name", "Diagnoses", "Jobs"];
            var doc = new jsPDF('l', 'pt');
            doc.setFont('Helvetica', 'normal');
            doc.setTextColor(40);
            var dateTime = moment().format('HH:mm on MMMM Do, YYYY');
            var printedOn = "Printed at " + dateTime;
            var totalPagesExp = "{total_pages_count_string}";
            var pageContent = function(data) {
                doc.setFontSize(14);
                doc.text(21, 30, "AMU Handover Sheet");
                doc.setFontSize(10);
                doc.text(printedOn, doc.internal.pageSize.width / 2, 30, 'center');
                var str = "Page " + data.pageCount;

                if (typeof doc.putTotalPages === 'function') {
                    str = str + " of " + totalPagesExp;
                }
                doc.text(str, doc.internal.pageSize.width - 20, 30, 'right');
            };
            if (typeof doc.putTotalPages === 'function') {
                doc.putTotalPages(totalPagesExp);
            }
            var elem = document.getElementById("table");
            var res = doc.autoTableHtmlToJson(elem);
            doc.autoTable(columns, res.data, {
                addPageContent: pageContent,
                theme: 'grid',
                tableLineWidth: 0,
                bodyStyles: {
                    halign: 'center',
                    valign: 'middle',
                    fillColor: 250,
                    lineWidth: 0.5,
                    lineColor: 180,
                    cellPadding: 6,
                    fontSize: 11
                },
                margin: {
                    horizontal: 20,
                    bottom: 40,
                    top: 40
                },
                drawRow: function(row, data) {
                    doc.setFontSize(12);
                    doc.setFontStyle('bold');
                    if (row.index === 0) {
                        doc.setTextColor(30);
                        doc.rect(data.settings.margin.left, row.y, data.table.width, 30, 'S');
                        doc.autoTableText("A BAY", data.settings.margin.left + 5, row.y + 16, {
                            halign: 'left',
                            valign: 'middle'
                        });
                        data.cursor.y += 30;
                    } else if (row.index === 6) {
                        doc.setTextColor(30);
                        doc.rect(data.settings.margin.left, row.y, data.table.width, 30, 'S');
                        doc.autoTableText("B BAY", data.settings.margin.left + 5, row.y + 16, {
                            halign: 'left',
                            valign: 'middle'
                        });
                        data.cursor.y += 30;
                    } else if (row.index === 17) {
                        doc.setTextColor(30);
                        doc.rect(data.settings.margin.left, row.y, data.table.width, 30, 'S');
                        doc.autoTableText("C BAY", data.settings.margin.left + 5, row.y + 16, {
                            halign: 'left',
                            valign: 'middle'
                        });
                        data.cursor.y += 30;
                    } else if (row.index === 28) {
                        doc.setTextColor(30);
                        doc.rect(data.settings.margin.left, row.y, data.table.width, 30, 'S');
                        doc.autoTableText("SIDE ROOMS", data.settings.margin.left + 5, row.y + 16, {
                            halign: 'left',
                            valign: 'middle'
                        });
                        data.cursor.y += 30;
                    } else if (row.index === 30) {
                        doc.setTextColor(30);
                        doc.rect(data.settings.margin.left, row.y, data.table.width, 30, 'S');
                        doc.autoTableText("FAIRFAX", data.settings.margin.left + 5, row.y + 16, {
                            halign: 'left',
                            valign: 'middle'
                        });
                        data.cursor.y += 30;
                    }
                },
                headerStyles: {
                    fillColor: 120,
                    halign: 'center',
                    valign: 'middle',
                    fontSize: 12,
                },
                alternateRowStyles: {
                    fillColor: 255
                },
                columnStyles: {
                    0: {
                        columnWidth: 40
                    },
                    1: {
                        columnWidth: 180,
                        halign: 'left',
                    },
                    2: {
                        columnWidth: 240
                    },
                }
            });
            doc.save("table.pdf");
        })

有人可以建议我哪里出了问题吗?

最佳答案

我认为 putTotalPages() 必须在 autotable 之后调用。

关于jspdf - putTotalPages 在 jspdf-autotable header 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46809248/

相关文章:

javascript - 如何计算jsPDF中的垂直高度?

pdf-generation - 使用链接跳转到 PDF 内的目标

javascript - jspdf 将 html 转换为多页 pdf

vue.js - 如何在 Vue main.js 中导入 jspdf-autotable?

javascript - 将表格拉伸(stretch)至全宽 jsPDF Autotable

pdf-generation - 如何制作多表头

javascript - jsPDF:如何使用 doc.text() 在单独的行中打印字符串?

angular - 如何为模板中动态生成的 jspdf 自动表格内容提供边框

javascript - 使用 jsPDF && jsPDF AutoTable 仅将特定的 HTML 表格列转换为 PDF

javascript - jsPDF设置表格样式