В highcharts у вас есть встроенная кнопка для загрузки текущего графика (пример: http://www.highcharts. com/demo/, эта кнопка: arrow). Вы можете сохранить его в формате PNG, JPEG, PDF или SVG.

Что я хотел бы сделать, так это создать ссылку, которая сохраняет изображение на сервере, а не загружает его. Как я мог это сделать?

Я предполагаю, что мне нужно изменить функцию exportChart в файле exporting.src.js. Это выглядит так (но я недостаточно знаю javascript для этого):

exportChart: function (options, chartOptions) {
        var form,
            chart = this,
            svg = chart.getSVG(chartOptions);

        // merge the options
        options = merge(chart.options.exporting, options);

        // create the form
        form = createElement('form', {
            method: 'post',
            action: options.url
        }, {
            display: NONE
        }, doc.body);

        // add the values
        each(['filename', 'type', 'width', 'svg'], function (name) {
            createElement('input', {
                type: HIDDEN,
                name: name,
                value: {
                    filename: options.filename || 'chart',
                    type: options.type,
                    width: options.width,
                    svg: svg
                }[name]
            }, null, form);
        });

        // submit
        form.submit();

        // clean up
        discardElement(form);
    },
14
Benjamin Crouzier 10 Янв 2012 в 15:27

4 ответа

Это можно сделать очень просто с помощью PhantomJS. Вы можете визуализировать диаграмму Highchart и сохранить ее в формате SVG, PNG, JPEG или PDF. В приведенном ниже примере демонстрационная диаграмма Highcharts одновременно отображается в форматах SVG и PDF:

var system = require('system');
var page = require('webpage').create();
var fs = require('fs');

// load JS libraries
page.injectJs("js/jquery.min.js");
page.injectJs("js/highcharts/highcharts.js");
page.injectJs("js/highcharts/exporting.js");

// chart demo
var args = {
    width: 600,
    height: 500
};

var svg = page.evaluate(function(opt){
    $('body').prepend('<div id="container"></div>');

    var chart = new Highcharts.Chart({
        chart: {
            renderTo: 'container',
            width: opt.width,
            height: opt.height
        },
        exporting: {
            enabled: false
        },
        title: {
            text: 'Combination chart'
        },
        xAxis: {
            categories: ['Apples', 'Oranges', 'Pears', 'Bananas', 'Plums']
        },
        yAxis: {
            title: {
                text: 'Y-values'
            }
        },
        labels: {
            items: [{
                html: 'Total fruit consumption',
                style: {
                    left: '40px',
                    top: '8px',
                    color: 'black'
                }
            }]
        },
        plotOptions: {
            line: {
                dataLabels: {
                    enabled: true
                },
                enableMouseTracking: false
            },
            series: {
                enableMouseTracking: false, 
                shadow: false, 
                animation: false
            }
        },
        series: [{
            type: 'column',
            name: 'Andrii',
            data: [3, 2, 1, 3, 4]
        }, {
            type: 'column',
            name: 'Fabian',
            data: [2, 3, 5, 7, 6]
        }, {
            type: 'column',
            name: 'Joan',
            data: [4, 3, 3, 9, 0]
        }, {
            type: 'spline',
            name: 'Average',
            data: [3, 2.67, 3, 6.33, 3.33],
            marker: {
                lineWidth: 2,
                lineColor: 'white'
            }
        }, {
            type: 'pie',
            name: 'Total consumption',
            data: [{
                name: 'Andrii',
                y: 13,
                color: '#4572A7'
            }, {
                name: 'Fabian',
                y: 23,
                color: '#AA4643'
            }, {
                name: 'Joan',
                y: 19,
                color: '#89A54E'
            }],
            center: [100, 80],
            size: 100,
            showInLegend: false,
            dataLabels: {
                enabled: false
            }
        }]
    });

    return chart.getSVG();
},  args);

// Saving SVG to a file
fs.write("demo.svg", svg);
// Saving diagram as PDF
page.render('demo.pdf');

phantom.exit();

Если вы сохраните код как demo.js, просто запустите bin/phantomjs demo.js, чтобы сгенерировать demo.svg и demo.pdf.

14
gakhov 6 Дек 2012 в 14:59
Я использую базу данных, как я могу динамически интегрировать свои данные в demo.js? Спасибо
 – 
Hocine Ben
5 Ноя 2014 в 14:02
Если у вас есть HTTP-доступный скрипт, который может выполнять запросы к БД и возвращать элементы в формате json, xml, text и т. д., то интеграция довольно проста... просто вызовите его из demo.js github.com/ariya/phantomjs/blob/master/examples/…
 – 
gakhov
5 Ноя 2014 в 17:43
Спасибо, в моем случае я подключаюсь к своей БД с помощью php, я получаю данные с помощью fetchAll(), я не знаю, как продолжить дальше. Как передать данные в файл javascript, который, в свою очередь, возвращает элементы json? Я новичок в этом.
 – 
Hocine Ben
6 Ноя 2014 в 16:14
1
Самый простой способ - просто вызвать PHP-скрипт из JS и проанализировать ответ: page.open('http://yourdomain.org/your.php', function (status) { var content = page.content; console.log('Content: ' + content); phantom.exit(); }); phantomjs.org/api/webpage/property/content.html
 – 
gakhov
6 Ноя 2014 в 19:12
Я получаю сообщение об ошибке, когда запускаю ваш пример кода с помощью phantomJS (из командной строки): ReferenceError: Can't find variable: $ Создается пустой файл demo.svg, есть идеи?
 – 
Gideon
18 Ноя 2014 в 09:07

Я просто реализую это, используя метод Nobita. Я создавал опрос, который показывал результаты пользователя в диаграмме, загружал изображение на свой сервер, а затем отправлял электронное письмо с изображением. Вот несколько замечаний.

Мне пришлось внести несколько обновлений в файл highcharts/exporting-server/index.php, а именно:

Я изменил каталог с «temp» на что-то другое и просто отмечу, что он находится в 4 разных местах.

Мне пришлось изменить shell_exec(), добавив "-XX:MaxHeapSize=256m", потому что это выдавало мне ошибку:

$output = shell_exec("java -XX:MaxHeapSize=256m -jar ". BATIK_PATH ." $typeString -d $outfile $width /mypathhere/results/$tempName.svg");

Если вы хотите, чтобы он загрузил это изображение, вы можете оставить следующее:

header("Content-Disposition: attachment; filename=$filename.$ext");
header("Content-Type: $type");
echo file_get_contents($outfile);

Но я изменил это, потому что хотел отправить обратно путь к изображению, поэтому я удалил указанное выше и заменил его путем к изображению (Обратите внимание, что я просто использую временное имя.):

echo "/mypathhere/results/$tempName.$ext";

Кроме того, этот файл удаляет файл svg, а также новый файл, который вы создали. Вам нужно удалить код, который удаляет файл:

unlink($outfile);

И вы также можете удалить строку перед ней, если хотите сохранить файл svg.

Обязательно включите highcharts/js/modules/exporting.js

Затем в вашем JS вы можете сделать что-то вроде следующего:

var chart = new Highcharts.Chart();    
var imageURL = '';
var svg = chart.getSVG();
var dataString = 'type=image/jpeg&filename=results&width=500&svg='+svg;
$.ajax({
    type: 'POST',
    data: dataString,
    url: '/src/js/highcharts/exporting-server/',
    async: false,
    success: function(data){
        imageURL = data;
    }
});

URL-адрес, по которому вы публикуете, является новой версией /exporting-server/index.php. Затем вы можете использовать imageURL по своему усмотрению.

10
Anna 11 Мар 2012 в 23:08
Мне действительно помогло .. А для тех, кто не получил результат, пожалуйста, следите за комментариями nobita. Если вы не установили батик, вы не получите никакого вывода. Или, в качестве альтернативы, вы можете использовать магию изображений (в этом случае используйте shell_exec("convert /mypathhere/results/$tempName.svg $outfile")
 – 
Serjas
16 Мар 2013 в 15:44

Я не делал этого раньше, но я полагаю, что вы хотите поиграть с файлом index.php, расположенным в папке exporting-server. По умолчанию Highcharts предоставляет (бесплатно) веб-службу, но вы можете изменить ее и создать собственную веб-службу для экспорта или делать с диаграммой все, что захотите. Посмотрите эти инструкции, которые можно найти здесь модуль экспорта :

«Если вы хотите настроить эту веб-службу на своем собственном сервере, файл index.php, который обрабатывает POST, предоставляется в пакете загрузки в каталоге /exporting-server.

  1. Убедитесь, что на вашем сервере установлены PHP и Java.
  2. Загрузите файл index.php из каталога /exporting-server в пакете загрузки на свой сервер.
  3. В вашей FTP-программе создайте каталог с именем temp в том же каталоге, что и index.php, и измените этот новый каталог на 777 (только для серверов Linux/Unix).
  4. Загрузите батик с http://xmlgraphics.apache.org/batik/#download. Найдите бинарный дистрибутив для вашей версии jre
  5. Загрузите файл batik-rasterizer.jar и весь каталог lib на свой веб-сервер. В опциях вверху файла index.php укажите путь к batik-rasterier.jar.
  6. В параметрах диаграммы установите параметр exporting.url в соответствии с местоположением вашего файла PHP. "
4
carla 27 Фев 2015 в 00:57

Вы можете попробовать это

 var chart = $('#yourchart').highcharts();
    svg = chart.getSVG();   
    var base_image = new Image();
    svg = "data:image/svg+xml,"+svg;
    base_image.src = svg;
    $('#mock').attr('src', svg);

Возьмите html Mock и отправьте в БД или сохраните только двоичный код.

Сохранить highchart как бинарное изображение

0
Prashobh 20 Мар 2014 в 14:46