1

我是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 对象
>流
x�+�r
�26S�00S
5 0 对象
>
结束对象
6 0 对象
>
结束对象
外部参照
0 7
0000000000 65535 f
0000000320 00000
0000000015 00000 n
0000000408 00000
0000000163 00000
0000000459 00000
0000000504 00000
预告片
]/信息 6 0 R/尺寸 7>>
%iText-5.4.1
起始外部参照
645
%%EOF

有没有人好心告诉我怎么了?

4

4 回答 4

1

您应该在设置响应标头之前调用 document.close(),这是一个详细示例,其中它们显式写入 servlet 的输出流

希望能帮助到你。

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

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

于 2013-05-04T17:41:18.900 回答
0

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

于 2013-05-05T14:24:24.453 回答
0

正如天行者指出的那样,您正在直接写入响应,您需要在设置响应之前使用中间流(如他的链接示例中的 a )并且最后OutputStream不要忘记它。flush()close()

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

于 2013-05-04T18:15:21.887 回答
0

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

于 2013-05-05T13:24:55.237 回答