使用 jspdf 创建的 PDF 文件太大
Pdf file size too big created using jspdf
我正在使用 jspdf 在浏览器中创建 PDF。我有多个图表将 svg 作为图表数据。为了向 pdf 添加数据,我使用 canvas 将 svg 转换为 png,然后使用 canvas.toDataURL
方法将 Base64 数据转换为 png。毕竟 jspdf 创建的文件的这种转换大小是巨大的(大约 50 MB)。
以下是图表数据 div 和 canvas.
的代码
newdiv = document.createElement("div");
newdiv.className = "big_Con_graph big_Con_graph0";
newdiv.style.height = "0px";
newdiv.id = "big_Con_graph" + id;
以下是 SVG 图表加载的尺寸。
document.getElementById("big_Con_graph" + id).style.display = "block";
var big_chartReference = FusionCharts("big_myChartId"+id);
if(big_chartReference != null){
big_chartReference.dispose();
}
var big_width = "1088";
var big_height = "604";
下面是将上述图形SVG数据转换并添加到PDF的代码。
var elem_graph = $($('.big_Con_graph,big_Con_graph0')[count]).clone(true);
svgString = $(elem_graph).find("span").html();
var img = document.createElement('img');
var DOMURL = self.URL || self.webkitURL || self;
var svg = new Blob([svgString], {type: "image/svg+xml;charset=utf-8"});
var url = DOMURL.createObjectURL(svg);
img.onload = pdfAfterImageLoad(img,pdf,imgLoadSequence,DOMURL,totalReports,reportName);
img.src = url;
这是 PDFAfterImageLoad 函数的代码:
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
var png = canvas.toDataURL("image/png");
pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270);
我用的是png,所以imagequality参数不能用
谁能帮我减小文件大小?
你试过canvg
了吗?它不太可能会减小文件大小,但至少你可以试试。
查看 this reply 中的片段。
您需要压缩正在生成的 PDF 中的图像。尝试使用 Deflate.js 和 adler32cs.js 并在您使用的 jsPDF 和 addImage 函数中使用压缩参数。例如:
var doc = new jsPDF('p', 'pt','a4',true);
确保将最后一个参数设置为 'true' 参考:https://github.com/MrRio/jsPDF/blob/ddbfc0f0250ca908f8061a72fa057116b7613e78/jspdf.js#L146
仔细看一下,可以清楚地看到最后一个参数是开启压缩的。
同时使用:
pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270,'','FAST');
而不是
pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270);
您可以在 NONE、快速、中等和慢速之间进行选择,以最适合您的方式进行选择。
如果您将多张图片添加到一个文档中,请使用
pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270, undefined,'FAST');
没有
pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270,'','FAST');
否则第一张图片将替换所有其他图片。
在我的例子中没有使用压缩参数。因此,我使用以下函数自行调整了当前图像的大小:
function resizeBase64Img(base64, width, height) {
var canvas = document.createElement("canvas");
canvas.width = width;
canvas.height = height;
var context = canvas.getContext("2d");
var deferred = $.Deferred();
$("<img/>").attr("src", "data:image/gif;base64," + base64).load(function() {
context.scale(width/this.width, height/this.height);
context.drawImage(this, 0, 0);
deferred.resolve($("<img/>").attr("src", canvas.toDataURL()));
});
return deferred.promise();
}
并按如下方式调用:
//select my image in base64
var imageStr64 = "/9j/4RiDRXhpZgAATU0AKgA...";
//resize image, add image and create the pdf
resizeBase64Img(imageStr64, 1000, 1000).then(function(newImg){
doc.addImage($(newImg).attr('src'), 15, 90, 180,180);
doc.save('mypdf.pdf');
});
您可以在 resizeBase64Img 函数中使用 'width' 和 'height' 参数来生成具有更好或最差图像质量的重 pdf。
完美。 PDF 大小 90mb 到 3mb,质量很好。
pdf.addImage(png, 'PNG', 0, 0, 485, 270, undefined,'FAST');
我尝试了压缩参数并传递了压缩:'MEDIUM' 按照建议使用 addImage 方法,但没有任何反应
对我有用的是将 canvas 转换为 DataUrl base64 字符串并传递压缩值
pdf.addImage({ imageData: canvas.toDataURL('image/jpeg', 0.6),format: 'JPEG', x: 2, y: 100, width: newImageWidth, height: newImageHeight});
这样图像在添加到 PDF 之前会被压缩
我正在使用 jspdf 在浏览器中创建 PDF。我有多个图表将 svg 作为图表数据。为了向 pdf 添加数据,我使用 canvas 将 svg 转换为 png,然后使用 canvas.toDataURL
方法将 Base64 数据转换为 png。毕竟 jspdf 创建的文件的这种转换大小是巨大的(大约 50 MB)。
以下是图表数据 div 和 canvas.
newdiv = document.createElement("div");
newdiv.className = "big_Con_graph big_Con_graph0";
newdiv.style.height = "0px";
newdiv.id = "big_Con_graph" + id;
以下是 SVG 图表加载的尺寸。
document.getElementById("big_Con_graph" + id).style.display = "block";
var big_chartReference = FusionCharts("big_myChartId"+id);
if(big_chartReference != null){
big_chartReference.dispose();
}
var big_width = "1088";
var big_height = "604";
下面是将上述图形SVG数据转换并添加到PDF的代码。
var elem_graph = $($('.big_Con_graph,big_Con_graph0')[count]).clone(true);
svgString = $(elem_graph).find("span").html();
var img = document.createElement('img');
var DOMURL = self.URL || self.webkitURL || self;
var svg = new Blob([svgString], {type: "image/svg+xml;charset=utf-8"});
var url = DOMURL.createObjectURL(svg);
img.onload = pdfAfterImageLoad(img,pdf,imgLoadSequence,DOMURL,totalReports,reportName);
img.src = url;
这是 PDFAfterImageLoad 函数的代码:
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
var png = canvas.toDataURL("image/png");
pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270);
我用的是png,所以imagequality参数不能用
谁能帮我减小文件大小?
你试过canvg
了吗?它不太可能会减小文件大小,但至少你可以试试。
查看 this reply 中的片段。
您需要压缩正在生成的 PDF 中的图像。尝试使用 Deflate.js 和 adler32cs.js 并在您使用的 jsPDF 和 addImage 函数中使用压缩参数。例如:
var doc = new jsPDF('p', 'pt','a4',true);
确保将最后一个参数设置为 'true' 参考:https://github.com/MrRio/jsPDF/blob/ddbfc0f0250ca908f8061a72fa057116b7613e78/jspdf.js#L146
仔细看一下,可以清楚地看到最后一个参数是开启压缩的。
同时使用:
pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270,'','FAST');
而不是
pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270);
您可以在 NONE、快速、中等和慢速之间进行选择,以最适合您的方式进行选择。
如果您将多张图片添加到一个文档中,请使用
pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270, undefined,'FAST');
没有
pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270,'','FAST');
否则第一张图片将替换所有其他图片。
在我的例子中没有使用压缩参数。因此,我使用以下函数自行调整了当前图像的大小:
function resizeBase64Img(base64, width, height) {
var canvas = document.createElement("canvas");
canvas.width = width;
canvas.height = height;
var context = canvas.getContext("2d");
var deferred = $.Deferred();
$("<img/>").attr("src", "data:image/gif;base64," + base64).load(function() {
context.scale(width/this.width, height/this.height);
context.drawImage(this, 0, 0);
deferred.resolve($("<img/>").attr("src", canvas.toDataURL()));
});
return deferred.promise();
}
并按如下方式调用:
//select my image in base64
var imageStr64 = "/9j/4RiDRXhpZgAATU0AKgA...";
//resize image, add image and create the pdf
resizeBase64Img(imageStr64, 1000, 1000).then(function(newImg){
doc.addImage($(newImg).attr('src'), 15, 90, 180,180);
doc.save('mypdf.pdf');
});
您可以在 resizeBase64Img 函数中使用 'width' 和 'height' 参数来生成具有更好或最差图像质量的重 pdf。
完美。 PDF 大小 90mb 到 3mb,质量很好。
pdf.addImage(png, 'PNG', 0, 0, 485, 270, undefined,'FAST');
我尝试了压缩参数并传递了压缩:'MEDIUM' 按照建议使用 addImage 方法,但没有任何反应
对我有用的是将 canvas 转换为 DataUrl base64 字符串并传递压缩值
pdf.addImage({ imageData: canvas.toDataURL('image/jpeg', 0.6),format: 'JPEG', x: 2, y: 100, width: newImageWidth, height: newImageHeight});
这样图像在添加到 PDF 之前会被压缩