Google Charts未与Wkhtmltopdf合作

Isa*_*ior 6 javascript google-visualization wkhtmltopdf

我正在尝试使用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>
Run Code Online (Sandbox Code Playgroud)

问题是,当我为可视化软件包执行google.load时,它会导致Wkhtmltopdf返回错误,指出引擎没有返回任何数据.我发现了一个我认为类似的问题为什么google.load会导致我的页面空白?所以我试着做setTimeout(function(){google.load('visualization','1.0',{'packages':['corechart']});},100); 这个解决方案的问题是,如果延迟太低,页面将返回没有错误,但它将完全空白; 但是,如果我将延迟设置得太高,页面将不会加载包,Javascript将会中断

var data = new google.visualization.DataTable();
Run Code Online (Sandbox Code Playgroud)

当我调用该函数时.另外,那张海报说明了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>';
}
Run Code Online (Sandbox Code Playgroud)

它似乎传递了所有正确的数据.在调用该函数时,我有调试行打印参数,并且所有参数都被正确打印.我还注意到,如果我在chart.draw()的同一个地方执行document.write('test'),它将编写'test'而不会出现任何错误.出于某种原因,如果我做chart.draw(),它只是说Wkhtmltopdf没有返回任何数据.

小智 7

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

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

<script src="http://www.gstatic.com/charts/loader.js"></script>
Run Code Online (Sandbox Code Playgroud)

通过

<script src="http://www.google.com/jsapi"></script>
Run Code Online (Sandbox Code Playgroud)

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


And*_*708 3

我今天自己解决了这个问题,所以这对我来说是可行的。如需更详细的演练,欢迎您阅读我关于该主题的博客文章

我只需要进行两个简单的更改即可使其工作:

  1. 提供javascript-delay参数,例如javascript-delay 1000。这会延迟 JavaScript 代码的执行 1000 毫秒
  2. 加载 Google Visualization API 时添加回调

function init() {
  google.load("visualization", "1.1", {
    packages: ["corechart"],
    callback: 'drawCharts'
  });
}
Run Code Online (Sandbox Code Playgroud)

然后您可以简单地实现该drawCharts功能,您可以像平常一样绘制图表。

确保您的标记包含以下内容:

<body onload="init()">
    <div id="my-chart"></div>
</body>
Run Code Online (Sandbox Code Playgroud)

只需将图表绘制到具有上述 ID 的 div 上,就可以开始了。

注意:我使用的是最新的可用二进制文件(截至目前为 0.12.0)。在 64 位 Ubuntu 安装上进行了测试。