Screenshot of Highcharts on Button Click

by Chance Nursey-Bush

HTML

<script src="https://github.com/niklasvh/html2canvas/releases/download/0.4.1/html2canvas.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2014-11-29/FileSaver.min.js"></script>
<script src="https://rawgit.com/canvg/canvg/master/rgbcolor.js"></script>
<script src="https://rawgit.com/canvg/canvg/master/StackBlur.js"></script>
<script src="https://rawgit.com/canvg/canvg/master/canvg.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.5.0-beta1/html2canvas.svg.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.5.0-beta1/html2canvas.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>
<input type="button" id="btnSave" value="Save PNG" />

JavaScript

$(function() {
  $('#container').highcharts({
    title: {
      text: 'Monthly Average Temperature',
      x: -20 //center
    },
    subtitle: {
      text: 'Source: WorldClimate.com',
      x: -20
    },
    xAxis: {
      categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
        'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
      ]
    },
    yAxis: {
      title: {
        text: 'Temperature (°C)'
      },
      plotLines: [{
        value: 0,
        width: 1,
        color: '#808080'
      }]
    },
    tooltip: {
      valueSuffix: '°C'
    },
    legend: {
      layout: 'vertical',
      align: 'right',
      verticalAlign: 'middle',
      borderWidth: 0
    },
    series: [{
      name: 'Tokyo',
      data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
    }, {
      name: 'New York',
      data: [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]
    }, {
      name: 'Berlin',
      data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]
    }, {
      name: 'London',
      data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]
    }]
  });

  $("#btnSave").click(function() {
    var svgElements = $("#container").find('svg');

    //replace all svgs with a temp canvas
    svgElements.each(function() {
      var canvas, xml;

      // canvg doesn't cope very well with em font sizes so find the calculated size in pixels and replace it in the element.
      $.each($(this).find('[style*=em]'), function(index, el) {
        $(this).css('font-size', getStyle(el, 'font-size'));
      });

      canvas = document.createElement("canvas");
      canvas.className = "screenShotTempCanvas";
      //convert SVG into a XML string
      xml = (new XMLSerializer()).serializeToString(this);

      // Removing the name space as IE throws an error
      xml = xml.replace(/xmlns=\"http:\/\/www\.w3\.org\/2000\/svg\"/, '');

      //draw the SVG onto a canvas
      canvg(canvas, xml);
     ...