1

我正在使用 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”)。我已经在几个地方阅读了如何在控制器中设置响应的标题和正文,但到目前为止没有任何效果。

4

1 回答 1

0

当您生成下载链接时。为什么不将 yourpath/public 替换为 domain.com?假设你的PDF是在目录public/downloads/blahblah中生成的

可能下一步会像

$path = '下载/'.$title.'.pdf';

Header("位置:http ://domain.com .$path");

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

于 2012-06-22T16:13:24.940 回答