2009-04-17 71 views
7

我有一個servlet,把一個pdf文件寫成一個ByteArrayOutputStream到servlet的輸出流。 如果我打開servlet URL,瀏覽器將打開文件。 但是如果在servlet上發生錯誤,瀏覽器會打開一個空的pdf並顯示錯誤消息。 通過ServletResponse發送錯誤,瀏覽器打開默認的錯誤頁面。如何使用JavaScript打開文件?

我想發送一條錯誤消息,而不重定向到錯誤頁面或打開無效的pdf文件。

我想:

new Ajax.Request('/pdfservlet', {    
     onSuccess: function(response) { 
      docWindow = window.open('','title'); 
      docWindow.document.open('application/pdf'); 
      docWindow.document.write(response); 
      docWindow.document.close(); 
     }, 
     onFailure: function(response) { 
      alert(response); 
     } 
    }); 

但是,的onSuccess打開一個頁面 [對象對象]

我怎樣才能打開使用JavaScript PDF文件?

回答

10

注:我假設你正在使用從Ajax.Request呼叫原型框架。

response object並不意味着直接寫入,但它具有responseText屬性,該屬性應該包含返回的PDF。

你試過:

new Ajax.Request('/pdfservlet', {    
     onSuccess: function(response) { 
      docWindow = window.open('','title'); 
      docWindow.document.open('application/pdf'); 
      document.write(response.responseText); 
      docWindow.document.close(); 
     }, 
     onFailure: function(response) { 
      alert(response); 
     } 
    }); 

(注意添加.responseText

編輯:好了,沒有工作......嘗試是這樣的:

new Ajax.Request('/pdfservlet', {    
     onSuccess: function(response) { 
      window.open('/pdfservlet'); 
     }, 
     onFailure: function(response) { 
      alert(response); 
     } 
    }); 

這將做什麼是創建ajax請求,並且如果成功在新窗口中打開它。打開新窗口應該很快,並且實際上不需要再次請求PDF,因爲瀏覽器應該在Ajax.Request調用期間緩存它。

+0

這不會打開PDF應用程序。打開頁面%PDF-1.6 % 1 0 obj < 2009-04-17 19:32:58

+1

我添加了一個新的解決方案,它類似於rde6173的建議,但依賴於瀏覽器緩存。 – 2009-04-17 20:01:42

2

您可以嘗試一種「雙程」方法。您可以使用Ajax調用servlet(如果它在運行中生成PDF,請將其緩存)。如果成功,則使用參數將用戶重定向到servlet以加載緩存的PDF。

還有其他選項,但這取決於您如何使用PDF。

我的$ 0.02 ..

0

由於看起來您發送的PDF爲「inline」而不是「attachment」,因此您可以將PDF的URL放入動態創建的Iframe中,然後將該Iframe附加到疊加層上。這將工作。

-jP

0

但如果該servlet發生錯誤,瀏覽器打開並顯示錯誤消息的空PDF。

在我看來,最好在服務器端修復這個問題,而不是所有這些脆弱的AJAX和緩存。爲什麼servlet錯誤仍然會設置'Content-Type:application/pdf'標題及其錯誤信息?檢查在servlet中發送事物的順序;除非您已成功創建PDF並準備好返回,否則不要發送「Content-Type」。