【问题标题】:HTML5 canvas, convert canvas to PDF with jspdf.jsHTML5 画布,使用 jspdf.js 将画布转换为 PDF
【发布时间】:2014-12-31 03:42:18
【问题描述】:

我正在尝试在 JavaScript 中将 HTML5 画布转换为 PDF,但我得到一个黑色背景 PDF。我试图改变背景颜色,但仍然变黑。以下是我正在尝试的代码:

Canvas = document.getElementById("chart");
Context = Canvas.getContext("2d");

var imgData = Canvas.toDataURL('image/jpeg');
var pdf = new jsPDF('landscape');
pdf.addImage(imgData, 'JPEG', 0, 0, 1350, 750);
pdf.save('download.pdf');

如果您有任何想法,我将不胜感激。

【问题讨论】:

    标签: javascript html pdf canvas jspdf


    【解决方案1】:

    首先,您需要在获取data 之前设置canvas 上所需的背景颜色。然后,您需要在canvas 上绘制jpeg 图像。

    【讨论】:

    • 感谢您的回复。我将背景颜色设置为 Canvas.style.color = "white" 但仍然是黑色。
    【解决方案2】:

    一个好的方法是结合使用 jspdf.js 和 html2canvas。我为你做了一个 jsfiddle。

     <canvas id="canvas" width="480" height="320"></canvas> 
          <button id="download">Download Pdf</button>
    

    '

            html2canvas($("#canvas"), {
                onrendered: function(canvas) {         
                    var imgData = canvas.toDataURL(
                        'image/png');              
                    var doc = new jsPDF('p', 'mm');
                    doc.addImage(imgData, 'PNG', 10, 10);
                    doc.save('sample-file.pdf');
                }
            });
    

    jsfiddle:http://jsfiddle.net/rpaul/p4s5k59s/5/

    【讨论】:

    • 为什么将 html2canvas 与 jspdf 结合使用是一种好方法。他已经有了画布。我的情况也是如此。我在使用与 onrendered 相同的代码,但由于我已经有一个画布,所以我没有使用 html2canvas。
    • 这是个好问题。这只是一种体验。几个月前,当我研究这个时,我发现 jspdf.js 本身并没有为 Flot 图提供一致的结果。使用 html2canvas 解决了我的问题。老实说,我并没有调查这些库的内部代码。哦,我记得,Flot 图表是用 Canvas 添加其他 HTML 元素的。如果只是canvas,那么jspdf大概就够了。
    【解决方案3】:

    我遇到了同样的问题,例如我第一次创建 pdf 时,画布图像还可以,但接下来的所有其他图像都变黑了。没有图片!

    我找到的解决方法如下:每次调用 pdf.addImage() 后,我都会在画布中重新绘制图片。它现在对我来说很好。

    编辑:根据要求,这里有更多细节:

    假设我有一个这样的画布绘图功能(只是一个例子,没关系):

    function drawCanvas(cv) {
      for(var i=0; i<cv.height; i++) {
        for(var j=0, d=0; j<cv.width; j++) {
          cv.data[d] = 0xff0000;
          d += 4;
        }
      }
    }
    

    我必须按如下方式修复我的打印功能:

    var cv=document.getElementById('canvas');
    printPDF(cv) {
        var imgData=cv.toDataURL("image/jpeg", 1.0);
        var doc=new jsPDF("p","mm","a4");
        doc.addImage(imgData,'JPEG',15,40,180,180);
        drawCanvas(cv); // <--- this line is needed, draw again
    }
    drawCanvas(cv); // <--- draw my image to the canvas, ok
    printPDF(cv); // first time is fine
    printPDF(cv); // second time without repaint would be black
    

    我承认,我没有进一步调查,只是很高兴这行得通。

    【讨论】:

    • 你能解释一下after each call to pdf.addImage() i redraw the picture in the canvas吗?如果您能分享一些代码,那将非常有帮助。
    【解决方案4】:

    一个非常简单的解决方案是将图像保存为 jpeg。保存为 png 对我的应用程序来说效果很好。值得注意的是,Blizzard 的响应还包括打印为 png,并且还为画布中的透明图层生成非黑色填充。

      var canvas = event.context.canvas;
      var data = canvas.toDataURL('image/png');
    

    而不是

      var canvas = event.context.canvas;
      var data = canvas.toDataURL('image/jpg');
    

    【讨论】:

      【解决方案5】:

      只需将 JPEG 格式更改为 PNG

      pdf.addImage(imgData, 'PNG', 0, 0, 1350, 750);
      

      【讨论】:

      • 欢迎来到 Stackoverflow。您是否介意为其他程序员提供更多答案?以便了解它究竟如何帮助解决问题。
      猜你喜欢
      • 2019-07-08
      • 2013-11-11
      • 2014-07-04
      • 2011-09-01
      • 1970-01-01
      • 2011-10-15
      • 2016-05-27
      • 2013-08-03
      相关资源
      最近更新 更多