Подтвердить что ты не робот

Как сохранить изображение диаграммы на сервере с помощью высокоскоростных диаграмм?

С помощью высокочастотных диаграмм у вас есть встроенная кнопка для загрузки текущей диаграммы (например: 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);
    },
4b9b3361

Ответ 1

Это можно сделать очень легко с 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

Ответ 2

Я просто реализую это, используя метод 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, как вам нравится.

Ответ 3

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

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

  • Убедитесь, что на вашем сервере установлены PHP и Java.
  • Загрузите файл index.php из каталога /exporting -server в пакет загрузки на ваш сервер.
  • В вашей программе FTP создайте каталог под названием temp в том же каталог как index.php и chmod этот новый каталог для 777 (Только для серверов Linux/Unix).
  • Загрузите Batik из http://xmlgraphics.apache.org/batik/#download. Найдите бинарный дистрибутив для вашей версии jre
  • Загрузите batik-rasterizer.jar и весь каталог lib в на вашем веб-сервере. В вариантах в верхней части index.php, укажите путь к batik-rasterier.jar.
  • В параметрах диаграммы установите для параметра exporting.url значение, соответствующее Расположение файла PHP. "

Ответ 4

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

 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 как двоичное изображение