A basic Node.js Highcharts export module for converting the SVG sent by Highcharts's export module into svg (i.e. unaltered), jpeg, png, or pdf.
In your node app file:
// Assume this is executed inside the POST handler for a server
// running on http://localhost:3000/export
var nhe = require('node-highcharts-exporter');
nhe.exportChart(highchartsExportRequest, function(error, exportedChartInfo){
if(error){
console.log('Uh oh!',error.message);
// Can send error message back to client
} else{
console.log('Exported chart. Here are the deets:', exportedChartInfo);
// Can send exported chart back to client here. The chart's
// path is in exportedChartInfo.filePath
}
});In your client-side Highcharts code:
new Highcharts.Chart({
// some chart options
exporting:{
url: 'http://localhost:3000/export'
}
// more chart options
});Start a server:
$ cd example; // The example directory inside this module
$ npm install; // Installs demo dependencies
$ node server.js; // Start the demo server listening on 'http://localhost:3000'
Now open example/demo.html in the browser and export the demo chart to any format.
One of its dependencies is netpbm utilities for conversion to jpeg. As described by node-netpbm, this needs some minor setup outside of npm and node. At this juncture, node-netpbm works on most *nix and OSX OSes, but no guarantees are made for Windows. It's not the end of the game, however, if you're running this on Windows and it doesn't work if your use case can do without jpeg exporting as it should work with png and pdf still. On OSX, a simple brew install netpbm takes care of the installation. After that, you can proceed to:
$ npm install -g node-highcharts-exporter
- exportChart(exportRequest, callback):
exportRequestis the requestPOSTed by Highcharts as described here.callbackis a function with two parameterserrorandexportedChartInfoas below:
// error object
{
message : 'Some error'
}
// exportedChartInfo object
{
fileName : 'myChart', // The name of the chart
file : 'myChart.png', // The name of the chart plus its extension
type : 'png', // The type of file (png,svg,pdf,jpeg)
parentDir : 'path/to/processingDir/exportRequestHash', // The directory where the file has been stored
filePath : 'path/to/processingDir/exportRequestHash/myChart.png' // Absolute path to exported chart
}- config.set(configPropertyName, configPropertyValue) and config.get(): Setter and getter for config object. The getter returns the entire config object. At the moment, the config object is simply:
{
processingDir : 'defaults/to/directory/of/this/module' // If doesn't exist, will be created.
}- Handles only
SVG, notJSONfor rendering server-side like other solutions out there. - Does exporting a quick and dirty way by converting everything that is not
SVGtoPNGfirst then toPDForJPEG.
- Handle chart sizes neatly to fit into PDF (if too big at the moment they'll get truncated)
- Make an
exportChartSync(if there is interest. It's hard with dependencies only having async methods themselves) - Enable a logging scheme (?)
- Investigate JSON-based server-side rendering as an option

