JSPDF - addHTML() Multiple Canvas Page

后端 未结 4 1173
[愿得一人]
[愿得一人] 2020-12-29 08:55

I noticed already have a release \"addHTML() can now split the canvas into multiple pages\" which can find through this link : https://github.com/MrRio/jsPDF/releases/tag/v1

相关标签:
4条回答
  • 2020-12-29 09:32

    None of the above helped me so I'll put this here for anyone who arrives at this page looking to use addHTML() to create a single pdf split into multiple pages with a different html element on each page. I used recursion so I'm not sure of the performance implications of this approach. It worked for me to create a 4 page pdf from 4 div elements.

    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);
            });
    }
    
    0 讨论(0)
  • 2020-12-29 09:35

    Splitting canvas into multiple pages work by providing a "pagesplit" option:

    var pdf = new jsPDF('p', 'pt', 'a4');
    var options = {
             pagesplit: true
        };
    
    pdf.addHTML($(".pdf-wrapper"), options, function()
    {
        pdf.save("test.pdf");
    });
    
    0 讨论(0)
  • 2020-12-29 09:35

    With using pagesplit: true it always stretches the pdf output. Try to use an old version of jsPDF with html2canvas of course.

    Sharing the result of my 2 days trial to achieve the multipage PDF generation with addHTML not fromHTML since it looses the CSS rules.

    <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>
    

    then the PDF should be just fine as follows:

    <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>
    

    Hope this would help. Thanks!

    0 讨论(0)
  • 2020-12-29 09:39

    pdf.addHtml doesnot work if there are svg images on the web page.. I copy the solution here: // suppose your picture is already in a canvas var imgData = canvas.toDataURL('image/png'); /* Here are the numbers (paper width and height) that I found to work. It still creates a little overlap part between the pages, but good enough for me. if you can find an official number from jsPDF, use them. */

    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');
    
    0 讨论(0)
提交回复
热议问题