2013-10-30 106 views
1

我们从事的是Ajax在这里工作,在内部框架定制的一种有趣的方式,基本上是一些JavaScript函数一些,我做的事:Ajax和下载PDF

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或原始数据,并试图流的方式是抓住了一些内容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

为什么不只是'function downloadPdf(){window.location.href ='report/index/downloadProjectsInProgress?...'; ''? – Andreas

+0

因为我们做ajax的方式不行 - 我没有创建框架 - 我只是用它工作。调用“控制器动作”的方式基本上与您的做法相同...接受我们的方式将报告转换为报告和索引以将索引和downloadProjectsInProgress转换为ajaxDownloadProjectsInProgress – LogicLooking

+2

为什么要使用Ajax来编写pdf?只要做重定向和下载对话框将弹出而不离开页面... – Andreas

回答

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.