2012-03-24 63 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.