JSF / Seam:如何在没有用户干预的情况下下载和打印动态生成的PDF文件?

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

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

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

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

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

  

有问题的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()更少。

上挂钩一个函数。 但是,您需要考虑浏览器特定的行为。 在这个问题中可以找到更多提示: 如何在Safari / Chrome中从javascript打印IFrame

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

如何在Google Chrome ver 38上禁用打印预览?

我希望对你有用:)

引述答案:

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