javascript - 如何减小 JSPDF 创建的文件大小?

标签 javascript jquery html5-canvas fabricjs jspdf

我正在使用 jspdf.js 从 HTML 5 Canvas 创建 pdf。但是,无论内容是什么以及 Canvas 大小有多大,生成的文件大小始终为 32,874 KB,即使 Canvas 完全为空也是如此。为什么文件大小总是相同? jsPDF 版本是 1.1.135。我的代码是这样的:

  var imgData = canvas.toDataURL("image/jpeg", 1.0);
  var width = $("canvas").attr('width');
  var height = $("canvas").attr('height');
  var pdf = new jsPDF('p', 'pt', [width,height]);
  pdf.addImage(imgData, 'JPEG', 0, 0, width, height);
  pdf.save("download.pdf");

enter image description here

更新:完整代码:

  $scope.rasterizePDF = function() {
    if (!fabric.Canvas.supports('toDataURL')) {
      alert('This browser doesn\'t provide means to serialize canvas to an image');
    }
    else {
      var imgData = canvas.toDataURL("image/jpeg", 1.0);
      var width = $("canvas").attr('width');
      var height = $("canvas").attr('height');
      var pdf = new jsPDF('p', 'pt', [width,height]);
      pdf.addImage(imgData, 'JPEG', 0, 0, width, height);
      pdf.save("download.pdf");
      }
  };

最佳答案

由于我什至不知道 Fabric.js 是什么,所以我从头开始重写它。

首先,更改 Canvas 大小应该可以实现。它正在我的示例中运行,如果可以的话请测试一下(我将在下面发布)。

我相信这行代码不起作用:

var imgData = canvas.toDataURL("image/jpeg", 1.0);

我尝试更改质量,但没有成功。我发现here如何解决这个问题。新代码:

var imgData = canvas.toDataURL({
    format: 'jpeg',
    quality: 0.9 // compression works now!
});

因此,在此之前,更改图像大小或任何与此相关的元素都不会更改最终的 .PDF 大小,因为它可能是在完全没有压缩的情况下保存的

这是我更新的示例(如果可能,尝试不同的 Canvas 尺寸):

<!DOCTYPE html>
<html>
<body>
<canvas id="canvas" width="1024" height="768"></canvas>

<script src='jquery-2.1.4.js'></script>
<script src='jspdf.min.js'></script>
<script src='fabric.min.js'></script>
<script src='fabricPdf.js'></script>

</body>
</html>

这是fabricPdf.js 文件:

function createPdf() {
    var imgData = canvas.toDataURL({
        format: 'jpeg',
        quality: 0.2
    });

    var width = $("canvas").attr('width');
    var height = $("canvas").attr('height');
    var pdf = new jsPDF('p', 'pt', [width,height]);
    pdf.addImage(imgData, 'JPEG', 0, 0, width, height);
    pdf.save("download.pdf");
}

var canvas = new fabric.Canvas('canvas');
var image = new Image();

image.setAttribute('crossOrigin', 'anonymous');
image.src = "http://i.imgur.com/eD9pJBy.jpg"; // 625x469
// image.src = "http://i.imgur.com/EDllPEW.jpg"; // 2816x2112

image.onload = function() {

    var fabricImage = new fabric.Image(image, {
      width: 625, height: 469, angle: 0, opacity: 1
    })

    canvas.add(fabricImage);
    createPdf();

}

结果:

Different File Sizes

“柠檬”的 Canvas 尺寸为 1024 x 768,但图像较小:

Lemon Full Size

“女孩”也有 1024 x 768 Canvas ,但图像更大并填满了整个区域:

Girl

这是“压缩柠檬”版本:

Lemonade

我认为它现在可以工作了!请尝试一下!

关于javascript - 如何减小 JSPDF 创建的文件大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31573097/

相关文章:

javascript - 查明嵌套的 ng-repeat 是否显示任何内容

javascript - 停止表单在提交时刷新页面

javascript - 要返回哪种 MIME 类型?

javascript - Bootstrap 3 :navbar not working

javascript - 如何使用 cakePHP 执行 ajax 请求?

java - 使用struts2 mvc架构如何将Canvas图像存储到服务器

javascript - 用于简单游戏的 Canvas 与 SVG

java - 传递给 servlet 的 JSP 表单值

javascript - 基于json文件的不同覆盖内容

javascript - JS Canvas 游戏碰撞检测有问题