Tak, jest to możliwe, ale wymaga kilku bibliotek do pracy. Pierwsza biblioteka to jsPDF, która umożliwia tworzenie plików PDF w przeglądarce. Druga to canvg, która pozwala na renderowanie i parsowanie SVG, bit, który jest naprawdę fajny, choć może renderować element SVV na element canvas. Wreszcie jest Highcharts export module, który pozwoli nam wysłać svg do canvg, aby zmienić adres URL danych, które następnie można przekazać jsPDF, aby przekształcić go w plik pdf.
Oto przykład http://fiddle.jshell.net/leighking2/dct9tfvn/ można również zobaczyć tam pliki źródłowe, które należy uwzględnić w projekcie.
Rozpoczęcie highcharts daje przykład użycia canvg z jego eksportem do zapisania wykresu jako png. ponieważ chcesz wszystkie iamges w pdf ten został nieznacznie zmienione dla naszego celu, aby tylko wrócić url danych
// 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));
Następnie na przykład mam skonfigurować eksport na kliknięcia przycisku. Spowoduje to wyszukanie wszystkich elementów danej klasy (wybierz więc jeden element do dodania do wszystkich elementów wykresu), a następnie wywołaj ich funkcję 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');
});
Ważne jest, aby pamiętać, że jeśli masz dużo wykresów, musisz zająć się umieszczaniem ich na nowej stronie. Dokumentacja dla jsPDF wygląda naprawdę nieaktualnie (mają dobrą stronę demonstracyjną, ale nie wiele, aby wyjaśnić wszystkie możliwe opcje), istnieje funkcja addPage(), a następnie możesz po prostu grać z szerokością i wysokością, aż znajdziesz coś, Prace.
ostatnią częścią jest ustawienie wykresów z dodatkową opcją, aby nie wyświetlać przycisku eksportu na każdym wykresie, który normalnie byłby wyświetlany.
//charts
$('#chart1').highcharts({
navigation: {
buttonOptions: {
enabled: false
}
},
//this is just normal highcharts setup form here for two graphs see fiddle for full details
Wynik nie jest tak źle, że jestem pod wrażeniem jakości wykresów, bo nie spodziewałem się wiele od tego, z jakiegoś grania stanowisk i rozmiarach pdf mogłaby wyglądać naprawdę dobrze.
Oto zrzut ekranu przedstawiający żądania sieciowe wykonane przed i po eksporcie, gdy eksport jest wykonane żadne wnioski są http://i.imgur.com/ppML6Gk.jpg
Oto przykład tego, co pdf wygląda http://i.imgur.com/6fQxLZf.png (wygląda lepiej, gdy widok jako rzeczywistego pdf)
szybkie przykład być sądzony na lokalnym https://github.com/leighquince/HighChartLocalExport
Dziękuję za pomoc, ale w tym roztworze dane są wysyłane do Highcharts Export Server. I nie chcę, żeby tak się stało, jak powiedziałem w pytaniu :)) – Leon
Nie Użyłem tylko modułu eksportu, aby uzyskać dane SVG, oglądałem kartę sieci i żadne dane nie zostały wysłane. – Quince
Konwersja wszystko dzieje się w przeglądarka, dlatego też wyłączyłem przycisk eksportu na każdym wykresie – Quince