我正在尝试使用 Google Charts 在 PDF 中生成多个图表。对于 PDF,我将 CakePDF 与 Wkhtmltopdf 引擎一起使用。不过,我似乎在将 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 Charts 与 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 没有返回任何数据。