Zend PHP - 将谷歌图表另存为 PDF


Zend PHP - Save Google Chart as PDF

我正在使用Zend PHP框架开发一个网站。在一个页面上,我有一个使用谷歌图表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")。我已经在几个地方阅读了如何在控制器中设置响应的标头和正文,但到目前为止没有任何效果。

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

可能下一步会是喜欢

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

header("Location: http://domain.com.$path");

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