2012-03-24 70 views
2

我有一個GWT應用這就是一個servlet創建與發佈請求中給出的數據的PDF文件,然後將responst回:GWT:顯示PDF創建爲POST響應

public void service(HttpServletRequest request, HttpServletResponse response) { 
     try { 
      String text = request.getParameter("text"); 
      if (text == null || text.trim().length() == 0) { 
       text = "no data"; 
      } 

      //PDF Creation with iText 
      Document document = new Document(); 
      ByteArrayOutputStream b = new ByteArrayOutputStream(); 
      PdfWriter.getInstance(document, b); 
      document.open(); 
      document.add(new Paragraph(text)); 
      document.close(); 

      response.setHeader("Expires", "0"); 
      response.setHeader("Cache-Control", 
        "must-revalidate, post-check=0, pre-check=0"); 
      response.setHeader("Pragma", "public"); 
      response.setContentType("application/pdf"); 

      response.setContentLength(b.size()); 
      OutputStream os = response.getOutputStream(); 
      b.writeTo(os); 
      os.flush(); 
      os.close(); 

     } catch (Exception ex) { 
      System.out.println(ex.toString()); 
     } 
    } 

我想展示爲用戶創建PDF。我得到這個遠在客戶端上:

final RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, 
       GWT.getModuleBaseURL() + "PdfServlet"); 

    rb.setHeader("Content-type", "application/x-www-form-urlencoded"); 
    StringBuffer postData = new StringBuffer(); 
    postData.append(URL.encode("text")).append("=") 
      .append(URL.encode(Text)); 

     rb.setRequestData(postData.toString()); 
     rb.setCallback(new RequestCallback() { 

      @Override 
      public void onResponseReceived(Request request, 
        Response response) { 
       if (200 == response.getStatusCode()) { 
        //What to do here? 
       } else { 
        //TODO:Something 
       } 
      } 

      @Override 
      public void onError(Request request, Throwable exception) { 
       /TODO:... 

      } 
     }); 
     try { 
      rb.send(); 
     } catch (RequestException e) { 
      e.printStackTrace(); 
     } 

所以我的問題是: 如何顯示這個PDF用戶? 所有我managaged做的是展現在它「無數據」的PDF ..

謝謝你的幫助:)

回答

3

而不是使用一個RequestBuilder,你可以簡單地使用Window.Location.setUrl(yourDowloadUrl?key=value)的,包括您在參數查詢字符串。但是請注意,您必須設置Content-disposition header: attachment標題,以便瀏覽器會提示您保存或打開文件,而不是替換您的GWT應用程序。 甚至更​​好,在您的html頁面中創建一個隱藏的iframe,並在該widget上調用setUrl。

使用此方法的缺點是,如果出現錯誤,它不允許您的客戶端代碼捕獲反饋服務器端而不是PDF該調用返回HTML與您的Web服務器中的錯誤字符串。如果這對你非常重要,你應該使用一個輪詢機制來請求文檔,然後生成並保存在服務器上,並且每隔n秒檢查是否有要下載的內容。我已經實現了這樣的事情,這也可以防止大文檔的超時問題。讓我知道你是否有興趣

+0

您好,感謝您的回答:)我無意中張貼着一些錯誤代碼;)我使用POST方法 - 這樣我就可以不使用URL將數據傳遞到服務器。您是否知道一種將PDF格式的回覆郵件作爲回覆的方式? – Morious 2012-03-24 15:50:56

+0

那麼,您可以使用'com.google.gwt.user.client.ui.FormPanel'使用POST方法發佈您的請求。您可以使用addSubmitCompleteHandler捕獲結果。但是,客戶端需要一個字符串結果而不是PDF。您可以保存PDF服務器端並返回一個唯一的ID,然後GWT客戶端在常規的GET請求中使用它:someIFrame.setUrl(http://acme.com/servlet?id=12345) – 2012-03-24 16:05:53

+0

Allright ..我會和GET一起去,然後像你之前提到的那樣。 :)它的工作方式。 – Morious 2012-03-26 07:54:00

3

你應該從你的servlet創建pdf文件並存儲在服務器上的某個地方。您需要返回存儲在服務器上的文件路徑。現在從GWT你可以提示窗口到用戶下載文件。下面是從GWT下載文件的例子:

Window.open(GWT.getHostPageBaseURL() + your return path from server, "", ""); 
+0

謝謝:)我設法在瀏覽器中打開文件,而不將它存儲在服務器上。有了上面顯示的代碼,你可以編寫代碼,它的工作正常。 – Morious 2012-03-26 07:56:47

+0

你好,好。你最終的解決方案是什麼?你最終使用了RequestBuilder嗎? – 2012-06-07 12:45:25

1

我可以顯示在創建的PDF,而不需要將文件保存在服務器上,並保持獨特的密鑰。它適用於Chrome,但根據某些帖子,它可能是一些舊瀏覽器的問題。 Window.open(「data:application/pdf; base64,」+ result,cRFTitle.replace(「」,「_」)+「.pdf」,「enabled」);

至於建議的結果必須是Base64編碼

B.