【问题标题】:How to save a image in multiple pages of pdf using jspdf如何使用jspdf将图像保存在多页pdf中
【发布时间】:2014-07-26 23:22:20
【问题描述】:

我有一个要保存为 pdf 的表格(列对齐方式不同)。我使用 html2canvas 将表格转换为图像,然后使用 jspdf 将图像保存为 pdf。如果图像的大小小于或等于 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);
          }
         });
       });

任何想法如何在 pdf 的第二页上获取图像的剩余部分。

【问题讨论】:

    标签: javascript jquery pdf html2canvas jspdf


    【解决方案1】:
                    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);
    

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

    drawImage(img, startX, startY, originalW, originalH, destX, dextY, destW, destH);
    

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

    【讨论】:

    • 如何展示多个页面?
    【解决方案2】:

    我用这个方法

    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');
      }
      });
      }
    

    希望对你有帮助

    灵感来自另一个堆栈溢出response

    【讨论】:

    • 它给出错误:“Window”类型上不存在属性“onePageCanvas”并且找不到名称“onePageCanvas”。并创建包含空白内容的 pdf
    • @BhartiLadumor - 如果您不在常规浏览器上下文中使用它,则 window 对象不可用。代替window.onePageCanvas =,使用var onePageCanvas =将其声明为循环范围内的局部变量
    • 看起来和真实来源很像stackoverflow.com/questions/19272933/…
    【解决方案3】:

    它适用于 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');
    

    【讨论】:

    • 效果很好,谢谢,一个小问题添加 position += heightLeft - imgHeight; 以在下一页中添加一些顶部填充
    • 我认为第三页及后续页面的位置计算有错误。赋值位置 += heightLeft - imgHeight 中的 += 表示 pageHeight 被扣除两次。因此,位置不是 0、-295、-590 等,而是 0、-295、-885 等。解决方案只是使用 = 赋值作为 position = heightLeft - imgHeight 或将循环中的位置计算替换为:x = x+1;位置 = (pageHeightx)-1;我希望这对某人有所帮助。
    • 如何根据图片设置pdf页面大小,图片后创建新页面和新页面上的新图片
    【解决方案4】:

    以类似的方式进一步回答了这个问题,但我觉得我想举一个例子,省略不必要的代码:

    您可以轻松地浏览所有页面并在每个页面上放置“水印”文本或其他项目,如下所示:

    let pdf = new jspdf();
    // do something that creates multiple pages
    for (let pageNumber = 1; pageNumber <= pdf.getNumberOfPages(); pageNumber++) {
      pdf.setPage(pageNumber)
      pdf.addImage('myImgOnEveryPage.png', 10,10,20,20);
      pdf.text('My text on every page, 12, 12);
    }
    

    (JSPDF 2.1.1 版)

    【讨论】:

    • 这个使用html2canvas吗?还是不需要?
    【解决方案5】:

    您可以通过在自己的代码中添加一些小调整来轻松做到这一点。

    $("#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();
        var totalPages = doc.internal.getNumberOfPages();
        for(let i = 1; i < totalPages; i++) {
            doc.setPage(i);
            doc.addImage(myImage, 'JPEG', 12, 10);
        }       
        doc.save(filename);
        }
      });
    });
    

    【讨论】:

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