【问题标题】:Adding Footer to pdf using jsPDF使用jsPDF将页脚添加到pdf
【发布时间】:2021-05-26 10:27:54
【问题描述】:

我正在从 jsPDF api 生成 pdf,我想为每个页面添加页脚。

如何实现这一点。它可以选择从 fromHTML 插件添加页脚,但我正在编写没有 HTML。

var doc = new jsPDF("portrait","px","a4");

【问题讨论】:

  • github.com/MrRio/jsPDF这个年龄可以参考
  • 我已经尝试查看这个 api 文档,但没有找到任何添加页脚的方法。你知道怎么做吗?

标签: javascript html jspdf


【解决方案1】:

您必须自己实现它。你可以这样做:

var doc = new jsPDF();
doc.page=1; // use this as a counter.

function footer(){ 
    doc.text(150,285, 'page ' + doc.page); //print number bottom right
    doc.page ++;
};

// and call footer() after each doc.addPage()

【讨论】:

  • 我在 addPage() 方法之前调用页脚函数,但如果 pdf 仅是一页,则不会调用它,因为没有要添加的页面。
【解决方案2】:

Stephen Collins 是最佳答案!它适用于jspdf-autotable 插件。

有了这个是全部添加到doc之后的,所以我们可以很方便的使用总页码!

为 Stephen Collins 的答案添加一些风格:“page x of total

const addFooters = doc => {
  const pageCount = doc.internal.getNumberOfPages()

  doc.setFont('helvetica', 'italic')
  doc.setFontSize(8)
  for (var i = 1; i <= pageCount; i++) {
    doc.setPage(i)
    doc.text('Page ' + String(i) + ' of ' + String(pageCount), doc.internal.pageSize.width / 2, 287, {
      align: 'center'
    })
  }
}


let doc = new jsPDF()

doc.text(...)
doc.autoTable(...)
addFooters(doc)
doc.save()

【讨论】:

    【解决方案3】:

    我知道这篇文章很旧,但我将提供另一种解决方案。 首先定义您的总页数。有多种方法可以确定这一点,所以我不会深入探讨。

            var doc = new jsPDF('p', 'pt', 'letter');
            doc.page = 1; // use this as a counter.
            var totalPages = 10; // define total amount of pages
            // HEADER
            doc.setFontSize(20);//optional
            doc.setTextColor(40);//optional
            doc.setFontStyle('normal');//optional
            doc.text("Report", 50, 22);// set your margins
            // FOOTER
            var str = "Page " + doc.page  + " of " +  totalPages;
            doc.setFontSize(10);// optional
            doc.text(str, 50, doc.internal.pageSize.height - 10);//key is the interal pageSize function
    
    
            // Add Page content
            .....
    
    
            //Add new page and increase page count
            doc.addPage();
            doc.page ++;
            //Begin process all over again.
    

    这在循环中效果很好,因为您可以通过将 array.length + 1 设置为页数(因为它是从零开始的)。

    【讨论】:

    • 感谢回答,我遇到了 jspdf 的另一个问题。因为它不支持utf8或者多字符支持
    【解决方案4】:

    在运行doc.save()之前运行这个函数

    function addFooters() {
        const pageCount = doc.internal.getNumberOfPages();
        for(var i = 1; i <= pageCount; i++) {
            doc.text(String(i), 196, 285);
        }
    }
    

    【讨论】:

    • 有很多复杂的答案,但这个简单的答案对我有用。与多个自动表完美配合。 (请务必更改单位以匹配您的文档单位)
    【解决方案5】:

    这对我有用:

    我只是为 A4 纸放了坐标;

    像这样在 doc.save() 之前添加 for 即可;

    // 创建一个文档

    var doc = new jsPDF('p','mm','a4');
    
    // Some stuff
    doc.text("Some text", 74, 150);
    doc.addPage();
    doc.text("Some text", 74, 150);
    doc.addPage();
    doc.text("Some text", 74, 150);
    doc.addPage();
    doc.text("Some text", 74, 150);
    doc.addPage();
    doc.text("Last page", 74, 150);
    
    // PAGE NUMBERING
    // Add Page number at bottom-right
    // Get the number of pages
    const pageCount = doc.internal.getNumberOfPages();
    
    // For each page, print the page number and the total pages
    for(var i = 1; i <= pageCount; i++) {
         // Go to page i
        doc.setPage(i);
         //Print Page 1 of 4 for example
        doc.text('Page ' + String(i) + ' of ' + String(pageCount),210-20,297-30,null,null,"right");
    }
    
    // Save the doc
    doc.save('test.pdf');
    

    【讨论】:

      【解决方案6】:

      如果您需要为每个页面显示“当前页面/总页面”之类的内容。 使用 jspdf v1.0+ 中提供的“总页码”插件

      使用方法:

              var doc = new jsPDF();
              doc.page=1; // use this as a counter.
              var totalPagesExp = "{total_pages_count_string}";
      
      
              function footer(){ 
                var str = "Page " + doc.page;           
                if (typeof doc.putTotalPages === 'function') {
                  str = str + "/" + totalPagesExp;
                }
                doc.text(150,285, str); //print number bottom right
              }
      
              // call footer() after each doc.addPage()
      
              // and before doc.save() do not forget put
              if (typeof doc.putTotalPages === 'function') {
                  doc.putTotalPages(totalPagesExp);
              }
      

      它应该工作。希望这会有所帮助。

      【讨论】:

        【解决方案7】:

        深入研究代码后,我认为您要求的功能没有实现。但是有一个从 html 生成页脚的功能,您可以使用此代码来满足您的需求。但要注意代码的某些部分被标记为“bad hack”。

        来自plugins/from_html.js

        checkForFooter = function (elem, renderer, elementHandlers) {
            //check if we can found a <footer> element
            var footer = elem.getElementsByTagName("footer");
            if (footer.length > 0) {
        
                footer = footer[0];
        
                //bad hack to get height of footer
                //creat dummy out and check new y after fake rendering
                var oldOut = renderer.pdf.internal.write;
                var oldY = renderer.y;
                renderer.pdf.internal.write = function () {};
                DrillForContent(footer, renderer, elementHandlers);
                var footerHeight = Math.ceil(renderer.y - oldY) + 5;
                renderer.y = oldY;
                renderer.pdf.internal.write = oldOut;
        
                //add 20% to prevent overlapping
                renderer.pdf.margins_doc.bottom += footerHeight;
        
                //Create function render header on every page
                var renderFooter = function (pageInfo) {
                    var pageNumber = pageInfo !== undefined ? pageInfo.pageNumber : 1;
                    //set current y position to old margin
                    var oldPosition = renderer.y;
                    //render all child nodes of the header element
                    renderer.y = renderer.pdf.internal.pageSize.height - renderer.pdf.margins_doc.bottom;
                    renderer.pdf.margins_doc.bottom -= footerHeight;
        
                    //check if we have to add page numbers
                    var spans = footer.getElementsByTagName('span');
                    for (var i = 0; i < spans.length; ++i) {
                        //if we find some span element with class pageCounter, set the page
                        if ((" " + spans[i].className + " ").replace(/[\n\t]/g, " ").indexOf(" pageCounter ") > -1) {
                            spans[i].innerHTML = pageNumber;
                        }
                        //if we find some span element with class totalPages, set a variable which is replaced after rendering of all pages
                        if ((" " + spans[i].className + " ").replace(/[\n\t]/g, " ").indexOf(" totalPages ") > -1) {
                            spans[i].innerHTML = '###jsPDFVarTotalPages###';
                        }
                    }
        
                    //render footer content
                    DrillForContent(footer, renderer, elementHandlers);
                    //set bottom margin to previous height including the footer height
                    renderer.pdf.margins_doc.bottom += footerHeight;
                    //important for other plugins (e.g. table) to start rendering at correct position after header
                    renderer.y = oldPosition;
                };
        
                //check if footer contains totalPages which shoudl be replace at the disoposal of the document
                var spans = footer.getElementsByTagName('span');
                for (var i = 0; i < spans.length; ++i) {
                    if ((" " + spans[i].className + " ").replace(/[\n\t]/g, " ").indexOf(" totalPages ") > -1) {
                        renderer.pdf.internal.events.subscribe('htmlRenderingFinished', renderer.pdf.putTotalPages.bind(renderer.pdf, '###jsPDFVarTotalPages###'), true);
                    }
                }
        
                //register event to render footer on every new page
                renderer.pdf.internal.events.subscribe('addPage', renderFooter, false);
                //render footer on first page
                renderFooter();
        
                //prevent footer rendering
                SkipNode['FOOTER'] = 1;
            }
        };
        

        【讨论】:

          猜你喜欢
          • 2015-06-04
          • 2015-12-05
          • 1970-01-01
          • 2018-02-11
          • 2020-01-02
          • 2021-03-22
          • 1970-01-01
          • 1970-01-01
          • 2015-02-16
          相关资源
          最近更新 更多