2013-10-30 133 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.