我在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 ..
谢谢你的帮助:)
答案 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编码
乙