これは理想的なソリューションではありませんでしたが、 PhantomJSで同じ最終目標を達成するために node.js に代わるものを見つけました。チャートを含む HTML ファイル (test.html) を作成し、node.js と同様に、コードを含む JS ファイル (test.js) を作成するだけです。次に、JS ファイルを PhantomJS で実行します。
JS ファイルで、HTML ファイルを Web ページとして開き、レンダリングして、画像バッファーをファイルに保存します。
var page = require('webpage').create();
page.open('test.html', function () {
page.render('test.png');
phantom.exit();
});
次に実行します。
phantomjs test.js
グラフを動的に作成するには、次の JS ファイル (test2.js) を作成します。
var system = require('system');
var page = require('webpage').create();
page.onCallback = function(data)
{
page.clipRect = data.clipRect;
page.render('test.png');
phantom.exit();
};
page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js', function()
{
page.includeJs('https://www.google.com/jsapi', function()
{
page.evaluate(function(chartType, data_json, options_json)
{
var div = $('<div />').attr('id', 'chart').width(900).height(500).appendTo($('body'));
google.load("visualization", "1",
{
packages:[chartType == 'GeoChart' ? 'geochart' : 'corechart'],
callback: function()
{
data_arr = $.parseJSON(data_json);
data = google.visualization.arrayToDataTable(data_arr);
options = $.parseJSON(options_json);
chart = new google.visualization[chartType]($(div).get(0));
google.visualization.events.addListener(chart, 'ready', function()
{
window.callPhantom(
{
clipRect: $(div).get(0).getBoundingClientRect()
});
});
chart.draw(data, options);
}
});
}, system.args[1], system.args[2], system.args[3]);
});
});
次に実行します。
phantomjs test2.js LineChart '[["Date","Steve","David","Other"],["Dec 31",8,5,3],["Jan 1",7,10,4],["Jan 2",9,4,3],["Jan 3",7,5,3]]' '{"hAxis.slantedText":true}'
phantomjs test2.js PieChart '[["Employee","Calls"],["Steve",31],["David",24],["Other",13]]' '{"is3D":true}'
phantomjs test2.js GeoChart '[["State","Calls"],["US-CA",7],["US-TX",5],["US-FL",4],["US-NY",8]]' '{"region":"US","resolution":"provinces"}'
外部スクリプトから画像データを取得するには、test2.js (test3.js) のコピーを作成して変更します
page.render('test.png');
に
console.log(page.renderBase64('png'));
次に、それを呼び出します (たとえば、PHP から):
<?php
$data = array(
array("Employee", "Calls"),
array("Steve", 31),
array("David", 24),
array("Other", 13)
);
$options = array(
"is3D" => true
);
$command = "phantomjs test3.js PieChart '" . json_encode($data) . "' '" . json_encode($options) . "'";
unset($output);
$result = exec($command, $output);
$base64_image = implode("\n", $output);
$image = base64_decode($base64_image);
?>
注: このプロセス全体を振り返ってみると、node.js で発生していた問題は、チャートが「準備完了」になるまで待機するコールバックまたはタイムアウトを設定していなかった可能性があります。