【问题标题】:Download a generated pdf from client从客户端下载生成的 pdf
【发布时间】:2013-05-04 17:15:19
【问题描述】:

我是 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

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

【问题讨论】:

  • 看看下载一个可以在开发工具中使用的 PDF,它和你的有什么不同?
  • 我不确定我是否理解您的评论。你能改写一下吗?

标签: java google-app-engine gwt itext


【解决方案1】:

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

希望对你有帮助。

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

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

【讨论】:

  • 感谢天行者的快速回答。不幸的是,它不起作用。浏览器没有要求我下载
  • 其实@mnds应该在response.getOutputStream()之前设置所有需要的响应头...
  • 我想这样做@skywalker,但我必须传输许多数据,因为我可以有 1000 个联系人来打印。所以我认为我不能使用 GET 方法
  • 对我来说,当我使用 GET 时它也可以工作,但我不会传输所有需要的数据
【解决方案2】:

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

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

【讨论】:

  • 我现在按照@skywalker 向我展示的页面中的说明制作代码,但我仍然遇到同样的问题
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2019-10-13
      • 2012-08-11
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多