Google 图表无法与 Wkhtmltopdf 配合使用

2024-01-16

我正在尝试使用 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 没有返回任何数据。


Problem:当使用 wkhtmltopdf / wkhtmltoimage html 页面上的 pdf / 图像(使用 Google 图表)时,它不包含 Google 图表。输出(pdf / png)在 Google 图表应显示的位置处只是空白。当然,原来的 html 页面是没问题的。

解决方案:我通过替换解决了这个问题(Google Charts + wkhtmltopdf):

<script src="http://www.gstatic.com/charts/loader.js"></script>

by

<script src="http://www.google.com/jsapi"></script>

不知何故,wkhtmltopdf 库无法处理包含第一个 javascript 的 Google Chart html 页面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google 图表无法与 Wkhtmltopdf 配合使用 的相关文章

随机推荐