2012-03-25 32 views
4

我有一個PHP腳本,通過ajax調用被調用。值被髮送到這個腳本來建立一個pdf。我想將pdf發送到瀏覽器,但是由於構建pdf的腳本返回到帶有JavaScript的頁面,所以我無法看到如何執行此操作。有任何想法嗎?ajax調用後發送PDF到瀏覽器

回答

2

我會推薦一些有點不同。而不是AJAX呼叫重定向到這樣一個URL:

./path_to_pdf_script/script.php?param1=val1&param2=val2 

這個腳本將生成的PDF。某處放置在腳本的頂部這個頭:

header('Content-type: application/pdf'); 

,只需echo字符串PDF內容是如果你希望用戶下載該PDF,而不是看你可以做AJAX調用與發現的例子HERE

從php.net

如果你希望用戶被提示要發送的數據, 保存如生成PDF文件,你可以使用內容處置 頭提供一個推薦的文件名,並強制瀏覽器 顯示保存對話框。

<?php 
// We'll be outputting a PDF 
header('Content-type: application/pdf'); 

// It will be called downloaded.pdf 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 

// The PDF source is in original.pdf 
readfile('original.pdf'); 
?> 
+0

所有這些都是發送PDF文件的常用方式,我認爲它可以成爲處理問題的首選方式,但它並不回答這個問題。如果PDF是通過AJAX生成的,在網頁的後臺,那麼只有在準備好後才能發送文件? – 2012-03-25 15:59:01

+0

是的,你的權利,因爲這可能是一些臨時文件會做的伎倆,ajax調用去PDF生成器,它生成PDF並將其保存到臨時文件,保存PDF文件名會話,發送回客戶端,和從那裏重定向到一個從會話中獲取文件名的pdf服務器腳本,讀取它,提供並刪除它 – SinistraD 2012-03-25 19:08:54

2

您可以使用iframe而不是ajax請求並強制下載pdf文件。

0

Ajax請求不是直接可見的用戶,所以一個重定向是毫無意義的

您需要的Ajax返回後,這個PDF加載到現有或新的瀏覽器窗口。

+1

您是否嘗試過在發送一個AJAX重定向頭打電話?如果我記得它會重定向瀏覽器,即使這只是AJAX – SinistraD 2012-03-25 11:28:00

+0

不,因爲我認爲這很奇怪。根據http://stackoverflow.com/questions/2927044/redirect-on-ajax-jquery-call ajax重定向需要編程 – 2012-03-25 11:38:23

+0

考慮你有兩個Ajax調用運行。兩者都做重定向。誰應該贏? – 2012-03-25 11:39:50

1

當你發現,你的AJAX調用不能直接輸出PDF的瀏覽器。一種解決方法是刪除AJAX並將用戶直接發送到生成PDF的頁面。這種方法非常常見並且有據可查。但是有一種方法可以使用AJAX生成PDF,以便用戶可以保持在網頁上,直到文件準備就緒。

你的AJAX調用可以回答一個JSON對象有2個專屬領域:

  • 「pdfurl」如果PDF文件已成功創建並寫入磁盤,
  • 「ERRORMSG」如果有一個錯誤。

喜歡的東西(在PHP):

<?php 
//... 
if (writepdf($filename, ...)) { 
    $result = array('pdfurl' => '/files/' . $filename); 
} else { 
    $result = array('errormsg' => 'Error!'); 
} 
echo json_encode($result); 

然後在頁面的JavaScript可以包含(例如jQuery的):

$.ajax({ 
    type: "GET", 
    url: "ajaxcreatepdf.php", 
    data: {userid: 1}, 
    dataType: "json", 
    success: function(data, textStatus) { 
     if (data.pdfurl) { 
      window.location.href = data.pdfurl; 
     } 
     else { 
      $("#messagebox").html(data.errormsg); 
     } 
    } 
});