Sì, questo è possibile ma richiede alcune librerie diverse per funzionare. La prima libreria è jsPDF che consente la creazione di PDF nel browser. Il secondo è canvg che consente il rendering e l'analisi di SVG, il bit che è davvero interessante anche se è in grado di eseguire il rendering di un elemento di svg sull'elemento canvas. Infine, è Highcharts export module che ci permetterà di inviare lo svg al canvg per trasformarlo in un URL di dati che può essere poi dato a jsPDF per trasformarlo nel tuo pdf.
Ecco un esempio http://fiddle.jshell.net/leighking2/dct9tfvn/ è anche possibile vedere in là i file di origine che è necessario includere nel progetto.
Quindi, per avviare highcharts viene fornito un esempio di utilizzo di canvg con la sua esportazione per salvare un grafico come png. perché si desidera che tutti i iamges in un PDF Questo è stato leggermente alterato per il nostro scopo di restituire solo l'url dati
// create canvas function from highcharts example http://jsfiddle.net/highcharts/PDnmQ/
(function (H) {
H.Chart.prototype.createCanvas = function (divId) {
var svg = this.getSVG(),
width = parseInt(svg.match(/width="([0-9]+)"/)[1]),
height = parseInt(svg.match(/height="([0-9]+)"/)[1]),
canvas = document.createElement('canvas');
canvas.setAttribute('width', width);
canvas.setAttribute('height', height);
if (canvas.getContext && canvas.getContext('2d')) {
canvg(canvas, svg);
return canvas.toDataURL("image/jpeg");
}
else {
alert("Your browser doesn't support this feature, please use a modern browser");
return false;
}
}
}(Highcharts));
Quindi per l'esempio che ho creato l'esportazione su un pulsante di scatto. Questo cercherà tutti gli elementi di una determinata classe (quindi sceglierne uno da aggiungere a tutti gli elementi del grafico) e quindi chiama la funzione highcharts.createCanvas.
$('#export_all').click(function() {
var doc = new jsPDF();
// chart height defined here so each chart can be palced
// in a different position
var chartHeight = 80;
// All units are in the set measurement for the document
// This can be changed to "pt" (points), "mm" (Default), "cm", "in"
doc.setFontSize(40);
doc.text(35, 25, "My Exported Charts");
//loop through each chart
$('.myChart').each(function (index) {
var imageData = $(this).highcharts().createCanvas();
// add image to doc, if you have lots of charts,
// you will need to check if you have gone bigger
// than a page and do doc.addPage() before adding
// another image.
/**
* addImage(imagedata, type, x, y, width, height)
*/
doc.addImage(imageData, 'JPEG', 45, (index * chartHeight) + 40, 120, chartHeight);
});
//save with name
doc.save('demo.pdf');
});
importante da notare qui che se hai un sacco di grafici è necessario gestirli immissione in una nuova pagina. La documentazione di jsPDF sembra davvero superata (hanno una buona pagina di demo anche se non molto per spiegare tutte le opzioni possibili), c'è una funzione addPage() e quindi puoi giocare con larghezze e altezze fino a trovare qualcosa che lavori.
l'ultima parte consiste semplicemente nell'impostare i grafici con un'opzione aggiuntiva per non visualizzare il pulsante di esportazione su ciascun grafico che normalmente verrà visualizzato.
//charts
$('#chart1').highcharts({
navigation: {
buttonOptions: {
enabled: false
}
},
//this is just normal highcharts setup form here for two graphs see fiddle for full details
Il risultato non è male io sono impressionato con la qualità dei grafici, come non mi aspettavo molto da questo, con un po 'di gioco delle posizioni pdf e le dimensioni potrebbe apparire davvero buono.
Ecco uno screenshot che mostra le richieste di rete fatte prima e dopo l'esportazione, quando è fatta nessuna richiesta sono realizzati http://i.imgur.com/ppML6Gk.jpg
qui l'esportazione è un esempio di quello che sembra la pdf come http://i.imgur.com/6fQxLZf.png (guarda meglio quando vista in formato pdf effettivo)
esempio veloce per essere giudicato sulla locale https://github.com/leighquince/HighChartLocalExport
Grazie per il vostro aiuto, ma in questa soluzione i dati vengono inviati al server di esportazione Highcharts. E non voglio che ciò accada come ho detto nella domanda :)) – Leon
No Ho solo usato il modulo di esportazione per ottenere i dati SVG, stavo guardando la scheda di rete e non sono stati inviati dati – Quince
La conversione avviene tutto in il browser, questo è anche il motivo per cui ho disattivato il pulsante di esportazione su ciascun grafico – Quince