我们有一个有趣的方法在这里使用自定义内部框架进行ajax,基本上在某些javascript函数中我做的一些:
CT.postSynch('report/index/downloadProjectsInProgress', {}, function(data){
});
这告诉ajax要查找名为Report
的模块,名为Index
的控制器和名为ajazDownloadProjectInprogress
我写了一个函数ajazDownloadProjectInprogress,它所做的就是根据我要回来的一些数据创建一个简单的PDF。在该函数中,我有以下(使用DOMPDF),如下所示:
$dompdf = new DOMPDF();
$content = $this->raw('./report.header','./projectsInProgressReport','./report.footer');
$dompdf->load_html($content);
$dompdf->render();
$dompdf->output();
header('Pragma:');
header('Cache-Control: private,no-cache');
return $dompdf->stream("Structure Report - ProgressReports.pdf", array('Attachment' => 1));
我在这里所做的就是根据我们将视图渲染为html或原始数据的方式来抓取一些内容,并尝试通过ajax将pdf流回来。
在上面的代码中,我向您展示了我们如何处理ajax调用,我做了:
CT.postSynch('report/index/downloadProjectsInProgress', {}, function(data){
return data;
});
现在网络标签显示我:
%PDF-1.3
1 0 obj
<< /Type /Catalog
/Outlines 2 0 R
/Pages 3 0 R >>
endobj
2 0 obj
<< /Type /Outlines /Count 0 >>
endobj
3 0 obj
<< /Type /Pages
/Kids [6 0 R
]
/Count 1
/Resources <<
/ProcSet 4 0 R
/Font <<
/F1 8 0 R
/F2 9 0 R
>>
/XObject <<
/I1 10 0 R
/I2 11 0 R
这只是回归的样本....如果我没有通过ajax这样做,我只是直接调用了这个动作,实际的PDF将下载我想要的内容。
任何人都知道你想通过ajax调用下载PDF的想法吗?我知道ajax它的自我不会下载文件 - 但我设置了所有这些功能应该只是开始下载过程。
答案 0 :(得分:4)
使用AJAX下载PDF意味着,最简单的形式是,您必须逐位请求PDF的二进制数据。有关通过AJAX请求然后解析和显示PDF文件的二进制块的示例,请查看Mozilla的PDF.js library,尤其是network code。
如果您只是想从服务器请求PDF并将其下载或显示在浏览器中,您只需获取相关PDF的URL(可以是您的自定义控制器或其他内容)并设置window.location
达到该值。使用示例中的大纲,它可以像这样简单:
window.location.href = 'report/index/downloadProjectsInProgress';
您需要确保服务器代码添加Content-disposition: attachment; filename=file.pdf
标头,这将强制window.location
更改下载文件而不是尝试显示它。 Here's a StackOverflow post that describes how to do exactly that.