从客户端下载生成的pdf

时间:2013-05-04 17:15:20

标签: java google-app-engine gwt itext

我是stackoverflow的新手,因此这是我的第一篇文章。请原谅我可怜的英语......我花了几个小时讨论相关话题但没有满足我的需求。 我正在编写一本地址簿,我希望我的用户能够随时下载pdf联系人列表。一切似乎都顺利但实际上客户端从不下载pdf文件,尽管我可以使用chrome开发人员工具在请求中看到它。 这是我的代码:

public void doPost( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException {

    try {
        Document document = new Document();
        PdfWriter.getInstance( document, response.getOutputStream() );
        document.open();
        document.add( new Paragraph( "You've selected " + request.getParameter("number") + " contacts." ) );

        response.setContentType("application/pdf");
        response.setHeader( "Content-Disposition", "attachment; filename=\"contacts.pdf\"" );

        document.close();
    }
    catch( DocumentException e ) {
        e.printStackTrace();
    }
}

在检查响应时,我得到这样的结果:

%PDF-1.4
%����
2 0 obj
>stream
x�+�r
�26S�00S
5 0 obj
>
endobj
6 0 obj
>
endobj
xref
0 7
0000000000 65535 f 
0000000320 00000 n 
0000000015 00000 n 
0000000408 00000 n 
0000000163 00000 n 
0000000459 00000 n 
0000000504 00000 n 
trailer
]/Info 6 0 R/Size 7>>
%iText-5.4.1
startxref
645
%%EOF

有人有善意告诉我出了什么问题吗?

4 个答案:

答案 0 :(得分:1)

你应该在设置响应头之前调用document.close(),这里有一个详细的example,它们明确写入servlet的输出流

希望它有所帮助。

- [编辑] 我使用itext-2.1.7运行相同的代码,但是使用doGet,对我有用,可能问题是你使用的是使用POST http请求(doPost)的servlet方法,而如果你在服务器中点击基本url直接,这将发送一个GET请求。

您可以覆盖服务方法,也可以从doGet调用doPost,或者从表单或ajax中提交相同的url,以确保http Post调用。

答案 1 :(得分:0)

正如天行者指出的那样,你是直接写回答OutputStream,你需要在设置响应之前使用中间流(比如他的链接样本中的一个),不要忘记{{1}最后和flush()它。

此外,通过将内容类型设置为close(),您告诉浏览器根据需要处理此类流(例如,它可以决定打开pdf,而不是允许您下载它)。为了始终强制浏览器弹出下载对话框,我建议使用application/pdf内容类型。

答案 2 :(得分:0)

我将帖子REQUEST标题设置为“application / x-www-form-urlencoded”。这不是问题吗?

答案 3 :(得分:0)

我终于使用post方法辞职了。在这种情况下似乎无法使用。谢谢大家的帮助!