web-dev-qa-db-ja.com

JSPDF-addHTML()複数のキャンバスページ

このリンクから「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");
});
10
Dion Alexander

「pagesplit」オプションを提供することにより、キャンバスを複数のページに分割できます。

var pdf = new jsPDF('p', 'pt', 'a4');
var options = {
         pagesplit: true
    };

pdf.addHTML($(".pdf-wrapper"), options, function()
{
    pdf.save("test.pdf");
});
13
diegocr

webページにsvg画像がある場合、pdf.addHtmlは機能しません。ここにソリューションをコピーします。//画像がすでにキャンバスにあると仮定します/ *ここに、私が見つけた数字(用紙の幅と高さ)があります。それでもページ間のオーバーラップ部分が少し作成されますが、私には十分です。 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');
7

上記のどれも私を助けなかったので、addHTML()を使用して各ページに異なるhtml要素を持つ複数のページに分割された単一のpdfを作成することを探しているこのページに到達する人のためにこれをここに配置します。再帰を使用したため、このアプローチのパフォーマンスへの影響がわかりません。 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);
        });
}
6
Paddy

pagesplit: trueを使用すると、常にpdf出力が拡大されます。もちろん、html2canvasでjsPDFの古いバージョンを使用してみてください。

2日間のトライアルの結果を共有して、マルチページPDFを生成し、CSSルールを失うため、addHTMLではなくfromHTMLを生成します。

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

これが役立つことを願っています。ありがとう!

2
Abhijeet K.