如何使用jspdf在pdf的多个页面中保存图像

use*_*972 5 javascript pdf jquery html2canvas jspdf

我有一个表(列不同的列)将保存为pdf.I使用html2canvas将表转换为图像,然后将图像保存为pdf usng jspdf.如果图像的大小小于或等于pdf的页面大小,但如果图像大小大于页面大小,则它仅保存pdf的第一页(仅包含图像的一部分)并且休息图像不以pdf格式显示/保存.这里是我使用的javascript代码.

       $("#btnVC_saveGLSummary").click(function () {
        html2canvas($("#tblSaveAsPdf1"), {
        onrendered: function (canvas) {
        var myImage = canvas.toDataURL("image/jpeg");            
        var d = new Date().toISOString().slice(0, 19).replace(/-/g, "");
        filename = 'report_' + d + '.pdf';
        var doc = new jsPDF();
        doc.addImage(myImage, 'JPEG', 12, 10);
        doc.save(filename);
          }
         });
       });
Run Code Online (Sandbox Code Playgroud)

任何想法如何在PDF的第二页上获得图像的剩余部分.

Car*_*uez 8

我用这种方法

function makePDF(){
var quotes = document.getElementById('container-fluid');
html2canvas(quotes, {
    onrendered: function(canvas) {
    //! MAKE YOUR PDF
    var pdf = new jsPDF('p', 'pt', 'a4');

    for (var i = 0; i <= quotes.clientHeight/980; i++) {
        //! This is all just html2canvas stuff
        var srcImg  = canvas;
        var sX      = 0;
        var sY      = 1120*i; // start 980 pixels down for every new page
        var sWidth  = 778;
        var sHeight = 1120;
        var dX      = 0;
        var dY      = 0;
        var dWidth  = 778;
        var dHeight = 1120;

        window.onePageCanvas = document.createElement("canvas");
        onePageCanvas.setAttribute('width', 778);
        onePageCanvas.setAttribute('height', 1120);
        var ctx = onePageCanvas.getContext('2d');
        // details on this usage of this function: 
        // https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Using_images#Slicing
        ctx.drawImage(srcImg,sX,sY,sWidth,sHeight,dX,dY,dWidth,dHeight);

        // document.body.appendChild(canvas);
        var canvasDataURL = onePageCanvas.toDataURL("image/png", 1.0);

        var width         = onePageCanvas.width;
        var height        = onePageCanvas.clientHeight;

        //! If we're on anything other than the first page,
        // add another page
        if (i > 0) {
            pdf.addPage(595, 842); //8.5" x 11" in pts (in*72)
        }
        //! now we declare that we're working on that page
        pdf.setPage(i+1);
        //! now we add content to that page!
        pdf.addImage(canvasDataURL, 'PNG', 0, 0, (width*.72), (height*.71));

    }
    //! after the for loop is finished running, we save the pdf.
    pdf.save('Test3.pdf');
  }
  });
  }
Run Code Online (Sandbox Code Playgroud)

我希望它会有所帮助


小智 5

它适用于html2canvas和jspdf。

var imgData = canvas.toDataURL('image/png');
var imgWidth = 210; 
var pageHeight = 295;  
var imgHeight = canvas.height * imgWidth / canvas.width;
var heightLeft = imgHeight;
var doc = new jsPDF('p', 'mm');
var position = 10; // give some top padding to first page

doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
heightLeft -= pageHeight;

while (heightLeft >= 0) {
  position += heightLeft - imgHeight; // top padding for other pages
  doc.addPage();
  doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
  heightLeft -= pageHeight;
}
doc.save( 'file.pdf');
Run Code Online (Sandbox Code Playgroud)

  • 我认为第三页及后续页的位置计算有错误。赋值位置中的 += += heightLeft - imgHeight 表示减去 pageHeight 两次。因此,位置不再是 0、-295、-590 等,而是变成 0、-295、-885 等。解决方案只是使用 = 赋值作为position = heightLeft - imgHeight 或将循环中的位置计算替换为: x = x+1;位置 = (页高*x)*-1; 我希望这可以帮助别人。 (6认同)
  • 我认为最重要的是“position = heightLeft - imgHeight + 10”(第一页上的原始填充将导致后续页面偏移 10。) (2认同)

yod*_*zzy 0

                var ctx = canvas.getContext("2d");
                ctx.drawImage(image, 0, 1025, sectionWidth, 1250, 0, 0, 1800, 950);
                var image2 = new Image();
                image2 = Canvas2Image.convertToJPEG(canvas);
                image2Data = image2.src;
                doc.addImage(image2Data, 'JPEG', -105, 5, 440, 325);
Run Code Online (Sandbox Code Playgroud)

基本上,您可以获得画布的上下文,然后可以使用该drawImage函数创建一个新图像,该图像是原始画布的一部分。的参数drawImage为:

drawImage(img, startX, startY, originalW, originalH, destX, dextY, destW, destH);
Run Code Online (Sandbox Code Playgroud)

其中 startX 和 Y 是原始图像上剪辑的起始位​​置,原始 W 和 H 是剪辑的高度和宽度(在原始图片上),基本上要剪辑多少,destX 和 Y 是 PDF 上的位置放置新的剪辑,destH 和 W 定义剪辑在画布上时的大小(剪辑后它们会拉伸图像)
希望这有帮助,
干杯