Zend PHP - 将Google Chart保存为PDF

时间:2012-06-22 16:09:36

标签: php ajax zend-framework fpdf google-visualization

我正在使用Zend PHP框架开发一个站点。在页面上,我有一个使用Google Chart API创建的图表 - https://developers.google.com/chart/。我想添加一个按钮,允许用户将图表下载为PDF文件(基本上将图表转换为图像并将其嵌入PDF中)。

我已经能够使用生成图像数据字符串的javascript函数将谷歌图表转换为图像 - http://www.battlehorse.net/attach/topics/charts/google_charts_to_image.html

function getImgData(chartId) {
    var chartContainer = document.getElementById(chartId);
    var chartArea = chartContainer.getElementsByTagName('iframe')[0].
    contentDocument.getElementById('chartArea');
    var svg = chartArea.innerHTML;
    var doc = chartContainer.ownerDocument;
    var canvas = doc.createElement('canvas');
    canvas.setAttribute('width', chartArea.offsetWidth);
    canvas.setAttribute('height', chartArea.offsetHeight);   
    canvas.setAttribute(
        'style',
        'position: absolute; ' +
        'top: ' + (-chartArea.offsetHeight * 2) + 'px;' +
        'left: ' + (-chartArea.offsetWidth * 2) + 'px;');
    doc.body.appendChild(canvas);
    canvg(canvas, svg);
    var imgData = canvas.toDataURL("image/png");
    canvas.parentNode.removeChild(canvas);
    return imgData;
}

我还下载了一个免费的PHP类来处理生成PDF - http://www.fpdf.org/

我已经能够使用ajax函数将图像数据字符串传递给zend控制器。然后我可以在本地保存图像并使用它来构建PDF文件并在本地保存。

//store the image locally
    $data = substr($image,strpos($image,",")+1); //removing the "data:image/png;base64," part
    file_put_contents ('downloads/'.$title.'.png', base64_decode($data));

    // create PDF document
    $pdf = new FPDF();
    $pdf->AliasNbPages();
    $pdf->AddPage();
    $pdf->Image('downloads/'.$title.'.png',10,6,30);

    //destroy the local copy of the image
    fclose('downloads/'.$title.'.png');
    unlink('downloads/'.$title.'.png');

    //save the PDF document
    $pdf->Output('downloads/'.$title.'.pdf');

我现在卡住了,因为我找不到提供下载PDF文件的方法。我需要使用Ajax请求来生成PDF,因为图像数据字符串对于标准URL来说太长了。所以我认为我需要在生成文件后将用户重定向到该文件的下载链接(然后再将其删除)。

有没有人知道如何提供文件供下载,如果我在浏览器中输入文件路径,我会收到路径未找到错误(例如“MyApp / public / downloads / myChart.pdf”)。我已经在几个地方读过如何在控制器中设置响应的标题和正文,但到目前为止还没有任何工作。

1 个答案:

答案 0 :(得分:0)

您是否正在生成下载链接。为什么不用domain.com替换你的路径/公共?假设您的PDF是在目录public / downloads / blahblah

中生成的

可能下一步将是喜欢

$ path ='downloads /'.$ title。'。pdf';

标题(“位置:http://domain.com。$ path”);

现在,当用户使用Ajax调用此脚本文件时,将生成PDF并将位置转移到pdf的路径!