我正在尝试使用 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 会导致我的页面变成空白? https://stackoverflow.com/questions/9519673/why-does-google-load-cause-my-page-to-go-blank所以我尝试这样做 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 没有返回任何数据。