GWT:显示创建为POST响应的PDF

时间:2012-03-24 10:04:56

标签: java gwt pdf servlets

我在GWT应用程序中有一个servlet,它创建一个包含post请求的数据的PDF文件,然后发回响应:

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? 我所要管理的就是显示带有“无数据”的pdf ..

谢谢你的帮助:)

3 个答案:

答案 0 :(得分:3)

您可以简单地使用Window.Location.setUrl(yourDowloadUrl?key=value)并将参数包含在查询字符串中,而不是使用RequestBuilder。但请注意,您必须设置Content-disposition header: attachment标头,以便浏览器提示您保存或打开文件,而不是替换您的GWT应用程序。 更好的是,在你的html页面中创建一个隐藏的iframe,并在该小部件上调用setUrl。

使用这种方法的缺点是,如果服务器端出现问题,它不允许客户端代码捕获反馈,而不是pdf,调用将返回带有来自Web服务器的错误字符串的HTML。如果这对您非常重要,您应该使用请求文档的轮询机制,然后生成并保存在服务器上,并且每n秒检查是否有要下载的内容。我已经实现了类似的东西,这也防止了大文档的超时问题。如果您有兴趣,请告诉我

答案 1 :(得分:3)

您应该从servlet创建pdf文件并存储在服务器上的某个位置。您需要返回存储在服务器上的文件路径。现在从GWT你可以提示用户下载文件的窗​​口。以下是从GWT下载文件的示例:

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

答案 2 :(得分:1)

我可以显示创建的pdf而无需在服务器上保存文件并保留唯一键。它适用于Chrome,但根据一些帖子,它可能是某些旧版浏览器的问题。

Window.open(“data:application / pdf; base64,”+ result,cRFTitle.replace(“”,“_”)+“。pdf”,“enabled”);

如建议结果需要Base64编码