Let’s say, I have 5 graphs on my page and I want to generate a PDF which contains these graphs.
For that we will use jsPDF plugin.
Step 1. Create a hidden-empty DIV, to store graph-images:
1
| <div id= 'graph-images' style= 'display:none' ></div> |
Step 2. Update your ‘drawMyChart()’ function to get image of chart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| var data = ... var options = ... } var chart = new google.visualization.ComboChart(document.getElementById( 'chart_div' )); /* Define your ComboChart object */ google.visualization.events.addListener(chart, 'ready' , function () { var content = '<img src="' + chart.getImageURI() + '">' ; $( '#graphImages' ).append(content); }); /* Adds a listener to make a image of chart inside a #graph-images*/ chart.draw(data, options); /* draw the chart using above define 'data' and 'options' */ } |
Google Chart API provides access to a PNG image of a chart, using the getImageURI() method. When the chart object is ready a ‘img’ tag is appended in the ‘#graph-images’ DIV.
Step 3 : Include plugin javascript files : jspdf.js, FileSaver.js, zlib.js, png.js,jspdf.plugin.addimage.js, andjspdf.plugin.png_support.js
Step 4 : Add functionality to generate a PDF of the above saved chart-images :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| function generatePDF() { var doc = new jsPDF( 'p' , 'pt' , 'a4' , false ) /* Creates a new Document*/ doc.setFontSize( 15 ); /* Define font size for the document */ var yAxis = 30 ; var imageTags = $( '#graph-images img' ); for (var i = 0 ; i < imageTags.length; i++) { if (i % 2 == 0 && i != 0 ) { /* I want only two images in a page */ doc.addPage(); /* Adds a new page*/ yAxis = 30 ; /* Re-initializes the value of yAxis for newly added page*/ } var someText = 'Chart ' +(i+ 1 ); doc.text( 60 , yAxis, someText); /* Add some text in the PDF */ yAxis = yAxis + 20 ; /* Update yAxis */ doc.addImage(imageTags[i], 'png' , 40 , yAxis, 530 , 350 , undefined, 'none' ); yAxis = yAxis+ 360 ; /* Update yAxis */ } } doc.save( 'Chart_Report' + '.pdf' ) /* Prompts user to save file on his/her machine */ |
Here we are adding a chart heading and the image for all the charts drawn.
Step 5 : Whenever there’s an error adding any image in the PDF, jsPDF API throws a error ‘throw new Error()’ and stops any further processing. For this we can provide exception handling :
1
2
3
4
5
6
7
8
| try { doc.addImage(imageTags[i], 'png' , 40 , yAxis, 530 , 350 , undefined, 'none' ); yAxis = yAxis+ 360 ; /* Update yAxis */ } catch (e) { doc.text( 120 , yAxis + 30 , 'SOME ERROR OCCURRED WHILE ADDING IMAGE' ); yAxis = yAxis + 50 /* Update yAxis */ } |
Our code remains the same, we just need to move doc.addImage(*, *, *, *, *, *) into the try-catch block, so that whenever any error occurs while inserting image inside the PDF, we add this text : ‘SOME ERROR OCCURRED WHILE ADDING IMAGE’, and continue further.
Hope this helps everyone!
No comments:
Post a Comment