Google チャートを使用して PDF に複数のチャートを生成しようとしています。PDF については、Wkhtmltopdf エンジンで CakePDF を使用しています。ただし、実際に Google Chart コードを PDF に読み込む際に問題が発生しているようです。これは私の Javascript の現在のコードです。
<script type="text/javascript" src="https://www.google.com/jsapi">
</script>
<script type="text/javascript">
google.load('visualization', '1.0', {'packages':['corechart']});
//setTimeout(function() {google.load('visualization', '1.0', {'packages':['corechart']});}, 100);
google.setOnLoadCallback(drawChart);
function drawChart(doIt,taken, total, element)
{
if (typeof doIt === 'boolean')
{
var data = new google.visualization.DataTable();
data.addColumn('string', 'Type');
data.addColumn('number', 'Courses');
data.addRows([
['Taken', taken],
['Remaining', total - taken]
]);
var options = {
'width':40,
'height':40};
var chart = new google.visualization.PieChart(document.getElementById(element));
chart.draw(data, options);
}
}
</script>
問題は、視覚化パッケージの google.load を実行すると、エンジンがデータを返さなかったというエラーで Wkhtmltopdf が返されることです。同様の問題を見つけたのは、なぜ google.load によってページが空白になるのですか? だから私は setTimeout(function() {google.load('visualization', '1.0', {'packages':['corechart']});}, 100); をやろうとしました このソリューションの問題点は、遅延が短すぎると、ページはエラーなしで返されますが、完全に空白になることです。ただし、遅延を高く設定しすぎると、ページはパッケージをロードせず、Javascript は次の時点で壊れます。
var data = new google.visualization.DataTable();
関数を呼び出すとき。さらに、そのポスターは document.write() に問題があると述べましたが、コンテンツをページに追加する前後に document.write() 行を追加しても問題はありません。Google チャートを Wkhtmltopdf で動作させる方法を知っていて、私を助けてくれる人がいれば幸いです。
API の読み込み時間を増やすために、関数を呼び出す場所を PHP の最後に移動しました。ここで、グラフを描画する必要がある要素の配列と適切な値を設定し、配列の値を使用して関数を呼び出します。現在問題が発生しているため、現在何が問題なのかはわかりませんchart.draw(data, options);
。ただし、正しい値と要素が渡されているようです。
これは本当に回りくどいように思えます。なんらかの理由で、Wkhtmltopdf は、javascript タグに入れたものを読み取ることができません。私はそれを読むためにできる限りのことを試みましたが、そうではありません。ただし、CakePDF プラグインは Javascript を読み取ることができるため、私の JS コードはデフォルトの PDF レイアウトになっています。次に、WkhtmltoPdf によってレンダリングされる実際のビューで、要素と値の配列を作成します。次に、これを行います(さまざまな可能な解決策の後、これがJS関数を呼び出すことができた唯一の方法です)
for ($i = 0; $i < sizeof($grade_array); $i++)
{
$element = $grade_array[$i][2];
echo '<script type="text/javascript">drawChart(true, '.$this->Js->value($grade_array[$i][0]).', '.$this->Js->value($grade_array[$i][1]).','.json_encode($element).');</script>';
}
すべての正しいデータを渡すように見えます。関数を呼び出すと、パラメーターを出力するデバッグ行があり、すべてのパラメーターが正しく出力されます。また、chart.draw() と同じ場所で document.write('test') を実行すると、エラーなしで 'test' が書き込まれることにも気付きました。何らかの理由で、chart.draw() を実行すると、Wkhtmltopdf がデータを返さなかったと表示されます。