【问题标题】:JSF/Seam: How to download and print a dynamically generated PDF file without user intervention?JSF/Seam:如何在没有用户干预的情况下下载和打印动态生成的 PDF 文件?
【发布时间】:2011-11-17 19:46:38
【问题描述】:

我有一个 JSF/Seam Web 应用程序,它有一个带有表单的页面,当提交(单击按钮)时,会根据表单输入动态创建一个 PDF 文件(在 Java 中,服务器端)。目前我的工作是将生成的 PDF 作为文件下载返回到浏览器,因此用户可以选择保存它或在 Acrobat Reader 中打开它以进行后续打印。

我希望 PDF 被发送到浏览器并打印(客户端),无需用户进一步干预(好吧,除了可能出现的 Windows 打印机选项对话框,对此我无能为力)。

解决方案似乎基于在加载 PDF 的页面上隐藏 iframe,然后在 iframe 上调用 .contentWindow.print()。但是,我不知道如何通过HttpServletResponse(在 Java 中)将 PDF 放入 iframe,更不用说加载 pdf 后如何在 iframe 上自动调用 print()。

【问题讨论】:

  • 离题(至少与您的核心问题无关)但您至少可以绕过 Chrome > v38 上的打印对话框。请参阅stackoverflow.com/questions/31643913/…(@EnriqueSanMartin 找到的参考资料)

标签: java jsf jboss seam


【解决方案1】:

这不是您问题的答案,但您可以使用“kiosk”模式(跳过打印对话框)绕过 chrome 中的打印对话框,请参阅:

How to disable print preview on Google Chrome ver 38?

我希望这对你有用:)

引用自回答:

命令行参数 --disable-print-preview 适用于最新的 Chrome 的版本,我自己测试了一下。

【讨论】:

  • 我必须打印一些表格(比如 1000+),所以很高兴做一些脚本来自动化这个过程,类似地我认为提出的问题有一些类似的问题(比如将 pdf 发送到浏览器返回并触发打印过程),并且答案(我的)太长而无法将其添加到 cmets,并且我发布是因为阅读了我认为无法自动打印页面/doc/pdf 的问题(以便澄清这是我的答案)
  • “而答案(我的)太长了,无法添加到 cmets”, 可以,看我上面的评论
【解决方案2】:

但是,我不知道如何通过HttpServletResponse(Java 中)将 PDF 放入 iframe

<iframe src> 指向一个servlet URL,它获取PDF 的InputStream 并将其写入响应的OutputStream。如有必要,您可以将 JSF bean 属性作为附加的 GET 参数传递,以便控制 PDF 生成。

<iframe src="pdfServlet?foo=#{bean.foo}&amp;bar=#{bean.bar}"></iframe>

相关 servlet 的 doGet() 方法可能如下所示:

String foo = request.getParameter("foo");
String bar = request.getParameter("bar");

response.setContentType("application/pdf");

InputStream input = generatePdfSomehowBasedOn(foo, bar);
OutputStream output = response.getOutputStream();
// Now just write input to output.

更不用说在加载 pdf 后如何在 iframe 上自动调用 print()。

&lt;iframe onload&gt; 上挂钩一个函数。但是,您需要考虑浏览器的特定行为。更多提示可以在这个问题中找到:How do I print an IFrame from javascript in Safari/Chrome

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-20
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多