Sunday, May 19, 2024
2
rated 0 times [  3] [ 1]  / answers: 1 / hits: 53930  / 8 Years ago, tue, june 7, 2016, 12:00:00

I am using jspdf for creating PDF inside browser. I am having multiple charts having svg as chart Data. For adding data to pdf I am converting svg to png using canvas and then Base64 Data using canvas.toDataURL method. After all this conversions size of the file created by jspdf is huge (about 50 MB).
Below is the code for div of chart data and canvas.



newdiv = document.createElement(div);
newdiv.className = big_Con_graph big_Con_graph0;
newdiv.style.height = 0px;
newdiv.id = big_Con_graph + id;




below is the dimensions for SVG chart load.



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;


now below is the code for conversion of above graph SVG data and adding to 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;


this is the code for PDFAfterImageLoad function:



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


I am using png, so imagequality parameter can not be used.



Can anyone help me decrease the file size?


More From » html5-canvas

 Answers
39

You need to compress the images in the PDF's that you are generating. Try using Deflate.js and adler32cs.js and use the compress parameter in both jsPDF and addImage functions that you are using. For eg :



var doc = new jsPDF('p', 'pt','a4',true);


make sure you set the last parameter as 'true' refer to : https://github.com/MrRio/jsPDF/blob/ddbfc0f0250ca908f8061a72fa057116b7613e78/jspdf.js#L146



Go through it and you can clearly see that the last parameter is for enabling compression.



Also use :



pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270,'','FAST');


instead of



pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270);


you can choose between NONE, FAST, MEDIUM and SLOW, whichever suits you best.


[#61869] Monday, June 6, 2016, 8 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
blaisep

Total Points: 748
Total Questions: 95
Total Answers: 108

Location: Federated States of Micronesia
Member since Sun, May 16, 2021
3 Years ago
blaisep questions
Wed, Dec 16, 20, 00:00, 4 Years ago
Sun, Aug 16, 20, 00:00, 4 Years ago
Tue, Nov 12, 19, 00:00, 5 Years ago
Mon, Nov 11, 19, 00:00, 5 Years ago
;