6

JsPdf-autoTable是一款非常棒的软件,让基础工作变得非常简单。

现在我想在每一页的顶部添加一个徽标和一些文本,并在每一页上添加一个page X of Y页脚,但我不知道如何。我想从 URL(我网站上的本地文件)获取徽标的图像。

在某处有一个简单的例子吗?我认为我是用 JsPdf 而不是 JsPdf-autoTable 来做的。

4

1 回答 1

13

该方法接受一个参数:

doc.autoTable(options);

options, 是一个对象,您可以在此处的文档中查看其属性。

options对象接受hooks。您正在寻找didDrawPage能够插入页眉和页脚的钩子。

didDrawPage: (HookData) => {} - 在插件完成绘制页面上的所有内容后调用。可用于添加带有页码的页眉和页脚或您想要的任何其他内容,每个页面都有一个自动表格。

注意:钩子在低于 v3 的版本didDrawPage中命名。addPageContent

演示中已经有一个关于如何执行此操作的示例。代码如下:

var doc = new jsPDF();
var totalPagesExp = "{total_pages_count_string}";

doc.autoTable({
    head: headRows(),
    body: bodyRows(40),
    didDrawPage: function (data) {
        // Header
        doc.setFontSize(20);
        doc.setTextColor(40);
        doc.setFontStyle('normal');
        if (base64Img) {
            doc.addImage(base64Img, 'JPEG', data.settings.margin.left, 15, 10, 10);
        }
        doc.text("Report", data.settings.margin.left + 15, 22);

        // Footer
        var str = "Page " + doc.internal.getNumberOfPages()
        // Total page number plugin only available in jspdf v1.0+
        if (typeof doc.putTotalPages === 'function') {
            str = str + " of " + totalPagesExp;
        }
        doc.setFontSize(10);

        // jsPDF 1.4+ uses getWidth, <1.4 uses .width
        var pageSize = doc.internal.pageSize;
        var pageHeight = pageSize.height ? pageSize.height : pageSize.getHeight();
        doc.text(str, data.settings.margin.left, pageHeight - 10);
    },
    margin: {top: 30}
});

// Total page number plugin only available in jspdf v1.0+
if (typeof doc.putTotalPages === 'function') {
    doc.putTotalPages(totalPagesExp);
}

return doc;

变量必须有你的base64Img图像,我只用 base64 图像测试过,据说你可以添加一个超链接,如果你在本地有图像,它会起作用。


代码片段:

(function() {

  function imgToBase64(url, callback) {
    if (!window.FileReader) {
      callback(null);
      return;
    }
    var xhr = new XMLHttpRequest();
    xhr.responseType = 'blob';
    xhr.onload = function() {
      var reader = new FileReader();
      reader.onloadend = function() {
        callback(reader.result.replace('text/xml', 'image/jpeg'));
      };
      reader.readAsDataURL(xhr.response);
    };
    xhr.open('GET', url);
    xhr.send();
  }

  var base64Img;

  // Convert the image to base64
  // imgToBase64("https://placehold.it/50x50", function(base64) {
  //   base64Img = base64;
  // });

  // Static base64 for example purposes
  base64Img = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAG1BMVEXMzMyWlpaqqqq3t7exsbGcnJy+vr6jo6PFxcUFpPI/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAQUlEQVQ4jWNgGAWjgP6ASdncAEaiAhaGiACmFhCJLsMaIiDAEQEi0WXYEiMCOCJAJIY9KuYGTC0gknpuHwXDGwAA5fsIZw0iYWYAAAAASUVORK5CYII='

  var headRows = function() {
    return [{
      id: "ID",
      name: "Name",
    }];
  };

  var bodyRows = function(rowCount) {
    rowCount = rowCount || 10;
    let body = [];

    for (var i = 1; i <= rowCount; i++) {
      body.push({
        id: i,
        name: "Name " + i
      });
    }

    return body;
  }

  function generate() {
    var doc = new jsPDF();
    var totalPagesExp = "{total_pages_count_string}";

    doc.autoTable({
      head: headRows(),
      body: bodyRows(40),
      didDrawPage: function(data) {
        // Header
        doc.setFontSize(20);
        doc.setTextColor(40);
        doc.setFontStyle('normal');
        if (base64Img) {
          doc.addImage(base64Img, 'JPEG', data.settings.margin.left, 15, 10, 10);
        }
        doc.text("Example", data.settings.margin.left + 15, 22);

        // Footer
        var str = "Page " + doc.internal.getNumberOfPages()
        // Total page number plugin only available in jspdf v1.0+
        if (typeof doc.putTotalPages === 'function') {
          str = str + " of " + totalPagesExp;
        }
        doc.setFontSize(10);

        // jsPDF 1.4+ uses getWidth, <1.4 uses .width
        var pageSize = doc.internal.pageSize;
        var pageHeight = pageSize.height ? pageSize.height : pageSize.getHeight();
        doc.text(str, data.settings.margin.left, pageHeight - 10);
      },
      margin: {
        top: 30
      }
    });

    // Total page number plugin only available in jspdf v1.0+
    if (typeof doc.putTotalPages === 'function') {
      doc.putTotalPages(totalPagesExp);
    }

    doc.save("headerandfooterexample.pdf");
  }

  document.getElementById('download-btn').addEventListener('click', generate);

})()
<script src="https://unpkg.com/jspdf@latest/dist/jspdf.min.js"></script>
<script src="https://unpkg.com/jspdf-autotable"></script>
<button id="download-btn">Download PDF</button>

于 2017-03-21T23:15:37.560 回答