【问题标题】:How to display an image in two pages in PDF using jsPDF?如何使用jsPDF在PDF的两页中显示图像?
【发布时间】:2014-05-24 08:09:06
【问题描述】:

我有一个 html 页面。其中我有一个按钮,每当我单击此按钮时,它都会使用 html2canvas 将整个 html 页面转换为数据图像,并使用 jsPDF 库将其放入 PDF 中。 我使用的 javascript 是

$("#printButton").click(function(){
html2canvas([document.getElementById('form1')], {
        onrendered: function (canvas) {
            var imageData = canvas.toDataURL('image/jpeg',1.0); 
           var doc = new jsPDF('landscape');
           doc.addImage(imageData,'JPEG',5,20,200,150);
           doc.save('Test.pdf');
     }
    });
});

它只在第一页显示图像。但是每当html页面大小更大时,我想剪切图像数据并将其放在PDF的两页中。 请帮我解决这个问题。

【问题讨论】:

  • 这个问题有什么进展吗?有一个类似的,并计划使用画布将图像切成小块,然后将其放在单独的页面上。
  • 不是在创建后对图像进行切片,而是将你的html分成多个div并转换为图像并一个一个放。这就是我作为替代所做的。

标签: javascript jquery pdf html2canvas jspdf


【解决方案1】:

为了在多个页面上放一张长图,我想出了这样的东西:

var img = new Image();
img.onload = function(){
    while (croppingYPosition < image.height) {
        var sourceX = 0;
        var sourceY = croppingYPosition;
        var sourceWidth = image.width;
        var sourceHeight = maxHeight;
        var leftToCropHeight = image.height - croppingYPosition;
        if (leftToCropHeight < maxHeight) {
            sourceHeight = leftToCropHeight;
        }
        var destWidth = sourceWidth;
        var destHeight = sourceHeight;
        var destX = 0;
        var destY = 0;
        var canvas = document.createElement('canvas');
        canvas.setAttribute('height', destHeight);
        canvas.setAttribute('width', destWidth);
        var ctx = canvas.getContext('2d');
        ctx.drawImage(img, 
                        sourceX,
                        sourceY,
                        sourceWidth,
                        sourceHeight,
                        destX,
                        destY,
                        destWidth,
                        destHeight);
        croppedImages.push(CanvasToJPEGConversionService.toJPEG(canvas));
        croppingYPosition += destHeight;
    }
    retur croppedImages;
};
img.src = image.dataURL;

我基本上得到了一个带有 dataURL(裁剪图像)的对象数组。

【讨论】:

    【解决方案2】:

    这可能不是完美的答案,但仍然有效

                    $("#btnSaveAsPDF").click(function () {
                    html2canvas($("#tblSaveAsPdf_canvas"), {
                    onrendered: function (canvas) {
                    var imageData = canvas.toDataURL("image/jpeg");
                    var image = new Image();
                    image = Canvas2Image.convertToJPEG(canvas);
                    var doc = new jsPDF();
                    doc.addImage(imageData, 'JPEG', 12, 10);
                    var croppingYPosition = 1095;
                    count = (image.height) / 1095;
    
                    for (var i =1; i < count; i++) {
                            doc.addPage();
                            var sourceX = 0;
                            var sourceY = croppingYPosition;
                            var sourceWidth = image.width;
                            var sourceHeight = 1095;
                            var destWidth = sourceWidth;
                            var destHeight = sourceHeight;
                            var destX = 0;
                            var destY = 0;
                            var canvas1 = document.createElement('canvas');
                            canvas1.setAttribute('height', destHeight);
                            canvas1.setAttribute('width', destWidth);                         
                            var ctx = canvas1.getContext("2d");
                            ctx.drawImage(image, sourceX, 
                                                 sourceY,
                                                 sourceWidth,
                                                 sourceHeight, 
                                                 destX, 
                                                 destY, 
                                                 destWidth, 
                                                 destHeight);
                            var image2 = new Image();
                            image2 = Canvas2Image.convertToJPEG(canvas1);
                            image2Data = image2.src;
                            doc.addImage(image2Data, 'JPEG', 12, 10);
                            croppingYPosition += destHeight;              
                        }                  
                    var d = new Date().toISOString().slice(0, 19).replace(/-/g, "");
                    filename = 'report_' + d + '.pdf';
                    doc.save(filename);
                }
    
            });
        });
    

    【讨论】:

    • 当我应用这个转换时,第二页是黑色的。
    【解决方案3】:

    我已经更新了代码。现在可以处理多页和更精确的剪切,而不会在裁剪后的图像末尾出现黑色背景。

    代码

    $('#pdf').on('click', function(){
    
        html2canvas(document.body, {
            onpreloaded: function(){
                  $("#barra").hide(); 
            },
            onrendered: function(canvas) {
                $("#page").hide();
                var imgData = canvas.toDataURL('image/jpeg');              
                options = {
                    orientation: "0",
                    unit: "mm",
                    format: "a4"
                };
                var doc = new jsPDF(options, '', '', '');
                doc.addImage(imgData, 'jpeg', 10, 10, 190, 0);
                var corte = 1620; // configura tamanho do corte
                var image = new Image();
                image = Canvas2Image.convertToJPEG(canvas);
    
                var croppingYPosition = corte;
                var count = (image.height)/corte;
    
    
                for (var i =1; i < count; i++) {
                        doc.addPage();
                        var sourceX = 0;
                        var sourceY = croppingYPosition;
                        var sourceWidth = image.width;
                        var sourceHeight = corte;
                        var destWidth = sourceWidth;
                        var destHeight = sourceHeight;
                        var destX = 0;
                        var destY = 0;
                        var canvas1 = canvas;
                        canvas1.setAttribute('height', (image.height)-(corte*i));
                        canvas1.setAttribute('width', destWidth);                         
                        var ctx = canvas1.getContext("2d");
                        ctx.drawImage(image, sourceX, 
                                             sourceY,
                                             sourceWidth,
                                             sourceHeight, 
                                             destX, 
                                             destY, 
                                             destWidth, 
                                             destHeight);
                        var image2 = new Image();
                        image2 = Canvas2Image.convertToJPEG(canvas1);
                        image2Data = image2.src;
                        doc.addImage(image2Data, 'JPEG', 10, 10, 190, 0);
                        croppingYPosition += destHeight;              
                    }     
    
    
                doc.save('sample-file.pdf');
                $('canvas').remove();
                $('canvas1').remove();
                $("#page").show();
                $("#barra").show();
            }
        });
    });
    

    【讨论】:

    • 它的行为与user3687972的解决方案相同:最后添加了黑端部分,仅打印了部分文档。 @moknisofien 的解决方案很有魅力。
    【解决方案4】:

    我提出了这个解决方案,希望对您有所帮助:

    PDFConverter.prototype.exportToPDF = function (divID, filename, pdfHeight) {
    
    html2canvas($('#' + divID), {                                       //Plugin:html2canvas.min.js,Takes html and convert to canvas.
    
        onrendered: function (canvas) {
            var doc = new jsPDF();                                    //Plugin:jspdf.min.js Using to export html to pdf file
            var HtmltoPdfPageHeight;
            if (pdfHeight)
                HtmltoPdfPageHeight = pdfHeight;
            var image = new Image();
            image = Canvas2Image.convertToJPEG(canvas);
    
            var croppingYPosition;
            var count = Math.ceil((image.height) / HtmltoPdfPageHeight);
    
    
            for (var i = 1; i <= count; i++) {
    
                if (i == 1) 
                    croppingYPosition = 0;
                else 
                    doc.addPage();
    
    
                var sourceX = 0;
                var sourceY = croppingYPosition;
    
                var croppingImageHeight = (image.height - (HtmltoPdfPageHeight * (i-1))) > HtmltoPdfPageHeight ? HtmltoPdfPageHeight : (image.height - (HtmltoPdfPageHeight * (i-1)));
                var destX = 0;
                var destY = 0;
                var croppedCanvas = document.createElement('canvas'); //Canvas using to resize main canvas
                croppedCanvas.setAttribute('height', croppingImageHeight);
                croppedCanvas.setAttribute('width', image.width);
                var ctx = croppedCanvas.getContext("2d");
                ctx.drawImage(image, sourceX,                                //drawImage(img, startX, startY, originalW, originalH, destX, destY, destW, destH);
                                     sourceY,
                                     image.width,
                                     HtmltoPdfPageHeight,
                                     destX,
                                     destY,
                                     image.width,
                                     HtmltoPdfPageHeight);
                var imageToAddatPdf = new Image(); //Final image exporting in pdf page
                imageToAddatPdf = Canvas2Image.convertToJPEG(croppedCanvas);
                doc.addImage(imageToAddatPdf.src, 'JPEG', 10, 10, 185, 0);
                croppingYPosition += HtmltoPdfPageHeight;
            }
    
            doc.save(filename + '.pdf');
    
    
    
        }
     });
    };
    

    【讨论】:

      【解决方案5】:
      html2canvas($('#wrap')[0]).then(canvas => {
              try {
                  contentH = $('#wrap').height();
                  var img = canvas.toDataURL("image/png", 1.0);
                  $w = $actw = canvas.width;
                  $h = $acth = canvas.height;
                  var pdf = new jsPDF("p", "mm", "a4");
                  var width = $maxw = pdf.internal.pageSize.width;
                  var height = $maxh = pdf.internal.pageSize.height;
                  if (!$maxw) $maxw = width;
                  if (!$maxh) $maxh = height;
                  if ($w > $maxw) {
                      $w = $maxw;
                      $h = Math.round($acth / $actw * $maxw);
                  }
                  pdf.addImage(img, 'JPEG', 0, 0, $w, $h);
                  $count = Math.ceil($h) / Math.ceil($maxh);
                  $count = Math.ceil($count);
                  for (var i = 1; i <= $count; i++) {
                      position = - $maxh * i
                      alert(position);
                      pdf.addPage(img, 'JPEG', 0, 0, $w, $h);
                      pdf.addImage(img, 'JPEG', 0, position, $w, $h);
                  }
                  pdf.save("cart.pdf");
              } catch (e) {
                  alert("Error description: " + e.message);
              }
          });
      

      【讨论】:

      • 上述解决方案在文档末尾添加了一个空白页。我已经编辑了代码以将其删除。而不是计算 $count 变量的两行($count = Math.ceil($h) / Math.ceil($maxh);$ count = Math.ceil($count);),我使用了以下:$count = Math.ceil($h / $maxh) - 1;
      • @Victor,当为第二页数据生成 pdf 时没有填充 stackoverflow.com/questions/63378768/…
      【解决方案6】:
            var pdf = new jsPDF();
            pdf.addImage(image1, 'JPEG', 10, 10);
            pdf.addImage(image2, 'JPEG', 10, 90);
            pdf.addImage(image3, 'JPEG', 10, 170)
            pdf.addPage();
            pdf.addImage(image4, 'JPEG', 10, 10)
            pdf.addImage(image5, 'JPEG', 10, 140)
            pdf.save("download.pdf");
      

      【讨论】:

      • 你应该对你的答案做一些解释
      • pdf.addPage();此方法用于在 jsPDF 中添加新页面。
      【解决方案7】:

      我遇到了黑页问题,但想出了这个解决方案,效果很好(简短而简单)

      html2canvas($("#testId")[0], { allowTaint: true }).then(function (canvas) {
              try {
                  var imgData = canvas.toDataURL('image/jpeg');
                  let options = {
                      orientation: "0",
                      unit: "mm",
                      format: "a4"
                  };
                  var doc = new jsPDF(options, '', '', '');
                  doc.addImage(imgData, 'jpeg', 0, 0, 210, 0);
                  var corte = 1680;
                  var image = canvas.toDataURL('image/jpeg');
                  var count = (canvas.height) / corte;
                  for (var i = 1; i < count; i++) {
                      doc.addPage();
                      doc.addImage(image, 'JPEG', 0, -330 * i, 210, 0);
                  }
                  doc.save('sample-file.pdf');
                  } catch (e) {
                  console.log('error pdf', e);
              }
        
      

      【讨论】:

        猜你喜欢
        • 2020-05-04
        • 2014-07-26
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 2021-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多