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