【发布时间】:2016-10-07 06:15:33
【问题描述】:
我正在使用 jspdf 在浏览器中创建 PDF。我有多个将 svg 作为图表数据的图表。为了向 pdf 添加数据,我使用画布将 svg 转换为 png,然后使用 canvas.toDataURL 方法将 Base64 数据转换为。毕竟,由 jspdf 创建的文件的所有这些转换大小是巨大的(大约 50 MB)。
下面是图表数据和画布的div代码。
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参数。
谁能帮我减小文件大小?
【问题讨论】:
-
你转换成base64是因为jspdf需要吗?
-
我没有通过单击按钮获取 svg 数据并通过画布将其转换为 png 来存储图像,因此整个过程需要 base64 数据。即使我无法将所有图形数据存储在客户端存储。
-
我明白了。为什么你使用 png 而不是 jpeg?使用带有质量修饰符的 jpeg 会有所帮助(请参阅 developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/…)
-
是的,但 jpeg 与质量参数一起使用时质量也很差。即使我想用 pdf 放大和缩小,而 jpeg 是不可能的。
-
这张图片的尺寸是多少?你能告诉我们图像包含什么/它适用于你添加的任何图像吗?你能告诉我们你用来将它添加到jspdf的代码吗? (并且你的 onload 回调以错误的方式使用,应该是一个函数引用;现在它是一个使用 onload 的结果的调用)。
标签: javascript html5-canvas base64 jspdf fusioncharts