【问题标题】:JSPDF - addHTML() Multiple Canvas PageJSPDF - addHTML() 多画布页面
【发布时间】:2014-11-12 07:24:12
【问题描述】:

我注意到已经有一个版本“addHTML() 现在可以将画布拆分为多个页面”,可以通过此链接找到:https://github.com/MrRio/jsPDF/releases/tag/v1.0.138

我可以知道它是如何工作的吗?就我而言,我只是在单击“另存为 pdf”按钮时尝试了一下,它只是呈现单个页面而不是多个页面(有时没有工作,我认为是因为内容太长而无法生成为 pdf) .

如果有此案例的示例,将不胜感激。谢谢!

在下面附上我的代码:

var pdf = new jsPDF('p', 'pt', 'a4');

pdf.addHTML($(".pdf-wrapper"), function () {
    var string = pdf.output('datauristring');
    pdf.save("test.pdf");
});

【问题讨论】:

    标签: javascript jquery canvas html2canvas jspdf


    【解决方案1】:

    如果网页上有 svg 图像,pdf.addHtml 不起作用.. 我在这里复制解决方案://假设您的图片已经在画布中 var imgData = canvas.toDataURL('image/png'); /* 这是我发现有效的数字(纸张宽度和高度)。 它仍然会在页面之间产生一点重叠部分,但对我来说已经足够了。 如果您可以从 jsPDF 中找到官方编号,请使用它们。 */

    var imgWidth = 210; 
    var pageHeight = 295;  
    var imgHeight = canvas.height * imgWidth / canvas.width;
    var heightLeft = imgHeight;
    
    var doc = new jsPDF('p', 'mm');
    var position = 0;
    
    doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
    heightLeft -= pageHeight;
    
    while (heightLeft >= 0) {
      position = heightLeft - imgHeight;
      doc.addPage();
      doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
      heightLeft -= pageHeight;
    }
    doc.save( 'file.pdf');
    

    【讨论】:

    • var imgWidth = doc.internal.pageSize.getWidth(); var pageHeight = doc.internal.pageSize.getHeight();解决重叠问题
    • 是否可以添加页眉和页脚?
    【解决方案2】:

    以上都没有帮助我,所以我将把它放在这里,以供到达此页面并希望使用 addHTML() 创建单个 pdf 拆分为多个页面的任何人使用,每个页面上都有不同的 html 元素。我使用了递归,所以我不确定这种方法的性能影响。它对我有用,可以从 4 个 div 元素创建一个 4 页的 pdf。

    var pdf = new jsPDF('landscape');
            var pdfName = 'test.pdf';
    
            var options = {};
    
            var $divs = $('.myDivClass')                //jQuery object of all the myDivClass divs
            var numRecursionsNeeded = $divs.length -1;     //the number of times we need to call addHtml (once per div)
            var currentRecursion=0;
    
            //Found a trick for using addHtml more than once per pdf. Call addHtml in the callback function of addHtml recursively.
            function recursiveAddHtmlAndSave(currentRecursion, totalRecursions){
                //Once we have done all the divs save the pdf
                if(currentRecursion==totalRecursions){
                    pdf.save(pdfName);
                }else{
                    currentRecursion++;
                    pdf.addPage();
                    //$('.myDivClass')[currentRecursion] selects one of the divs out of the jquery collection as a html element
                    //addHtml requires an html element. Not a string like fromHtml.
                    pdf.addHTML($('.myDivClass')[currentRecursion], 15, 20, options, function(){
                        console.log(currentRecursion);
                        recursiveAddHtmlAndSave(currentRecursion, totalRecursions)
                    });
                }
            }
    
            pdf.addHTML($('.myDivClass')[currentRecursion], 15, 20, options, function(){
                recursiveAddHtmlAndSave(currentRecursion, numRecursionsNeeded);
            });
    }
    

    【讨论】:

    • 非常好的解决方案!代码需要稍微清理一下,但对我来说效果很好。这两行需要以分号结尾...var $divs = $('.myDivClass') 和 recursiveAddHtmlAndSave(currentRecursion, totalRecursions) 并且在最后一行似乎也是一个额外的右大括号。
    • 非常好。与 DOM 上的表格或 div 一起工作。但是我如何使它与绝对定位的 html 标签一起工作?
    • 当我尝试使用上面的代码下载 PDF 时,我有一个带有一些 HTML 的 div,但是当打开 pdf 时它没有任何内容,只有我可以看到黑色背景。下面我将添加屏幕截图,请帮助我。 div:ibb.co/5h89M4K pdf:ibb.co/cQGjDPS
    【解决方案3】:

    使用pagesplit: true 总是会拉伸 pdf 输出。 当然可以尝试使用旧版本的 jsPDF 和 html2canvas。

    addHTML 而不是fromHTML 共享我2 天试用的结果,因为它失去了CSS 规则。

    <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.0.272/jspdf.debug.js"></script>
    

    那么PDF应该可以如下:

    <script>
    
                $(window).on('load', function(){
    
                    var pdf = new jsPDF('p', 'pt', 'a4');
    
                    var pdfName = 'sample.pdf';
    
                    var options = {
                        format: 'JPEG',
    //                    pagesplit: true,
                        "background": '#000',
                    };
    
                    var fullPage = $('#Printout_21571')[0],
                        firstPartPage = $('#part-1')[0],
                        secondPartPage = $('#part-2')[0];
    
                    pdf.addHTML(firstPartPage, 15, 20, options, function(){ pdf.addPage() });
                    pdf.addHTML(secondPartPage, 15, 20, options, function(){});
    
                    setTimeout(function() {
    
    //                    pdf.save(pdfName);
                        var blob = pdf.output("blob");
                        window.open(URL.createObjectURL(blob));
    
                    }, 600);
                })
            </script>
    

    希望这会有所帮助。 谢谢!

    【讨论】:

    • 你在哪里使用html2canvas?
    【解决方案4】:

    通过提供“pagesplit”选项将画布分成多个页面:

    var pdf = new jsPDF('p', 'pt', 'a4');
    var options = {
             pagesplit: true
        };
    
    pdf.addHTML($(".pdf-wrapper"), options, function()
    {
        pdf.save("test.pdf");
    });
    

    【讨论】:

    • 嗨@diegocr,感谢您的快速回答。我刚刚尝试在 mrrio.github.io/jsPDF 上设置 pagesplit: true 为什么结果不好并且似乎“拉伸”成 2 页..虽然它只能在 1 页中生成?
    • addHTML 将尝试调整 html 元素/文档以适应 PDF 页面大小的整个宽度,这可能意味着拉伸。您可以通过提供直接传递给 html2canvas 的附加选项(例如“宽度”和“高度”)来进行游戏,或者您可以使用例如 options.dim = { w: 400, h : 600 } 将宽度/高度传递给 jsPDF 引擎.另外,检查github.com/MrRio/jsPDF/issues/339
    • 我相信在最新的 addHtml 插件代码中已经修复了拉伸问题。
    • 我面临同样的问题...... pdf 工作正常,但它没有正确拆分页面也看起来很拉伸。对此有任何更新的答案吗?
    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 2018-11-11
    • 2014-10-19
    • 2014-12-02
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多