【问题标题】:how to display a pdf document in jsf page in iFrame如何在 iFrame 的 jsf 页面中显示 pdf 文档
【发布时间】:2010-12-28 17:27:56
【问题描述】:

谁能帮我在 JSF 页面中仅在 iframe 中显示 PDF 文档?

提前致谢,

苏雷什

【问题讨论】:

标签: pdf jsf iframe


【解决方案1】:

照常使用<iframe>

<iframe src="/path/to/file.pdf"></iframe>

如果您的问题是 PDF 不位于 WebContent 中,而是位于磁盘文件系统甚至数据库中的其他位置,那么您基本上需要一个 Servlet 来获得 InputStream并将其写入响应的OutputStream

response.reset();
response.setContentType("application/pdf");
response.setContentLength(file.length());
response.setHeader("Content-disposition", "inline; filename=\"" + file.getName() + "\"");
BufferedInputStream input = null;
BufferedOutputStream output = null;

try {
    input = new BufferedInputStream(new FileInputStream(file), DEFAULT_BUFFER_SIZE);
    output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    int length;
    while ((length = input.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    }
} finally {
    close(output);
    close(input);
}

这样你可以只指向这个 servlet :) 例如:

<iframe src="/path/to/servlet/file.pdf"></iframe>

您可以在this article 中找到类似 servlet 的完整示例。

假设您使用的是 JSF 1.2 或更新版本,&lt;iframe&gt; 在 JSF 中也可以正常工作。在 JSF 1.1 或更早版本中,您必须将普通的 HTML 元素(例如 &lt;iframe&gt;)包装在 &lt;f:verbatim&gt; 中,以便将它们放入 JSF 组件树中,否则它们将在输出中错位:

<f:verbatim><iframe src="/path/to/servlet/file.pdf"></iframe></f:verbatim>

【讨论】:

  • 如果我错了,请纠正我,您不必在 servlet 3.0 中的任何 web.xml 中注册 servlet,对吗?我这样做了@WebServlet(name="pdfHandler", urlPatterns={"/pdfHandler"}),并尝试&lt;iframe src="/pdfHandler/file.pdf"&gt;&lt;/iframe&gt;,但没有调用servlet。诡异的。知道为什么它会这样吗,BalusC?
  • @Harry:那么 URL 是完全错误的。您是否考虑了上下文路径?您的示例期望您的 webapp 部署在 ROOT 上。编辑:哦,等等,您的 URL 模式必须是 /pdfHandler/* 才能接受带有额外路径信息而不是请求参数的 URL。
  • 是的,我实际上必须使用整个网址http://localhost:8080/MyNote-war/pdfHandler,我认为/pdfHandler 就足够了
  • 另一个问题,所以我尝试按照您的建议使用request.getPathInfo() 获取文件名。我像http://localhost:8080/MyNote-war/pdfHandler 这样在我的网络浏览器上运行 servlet,然后我得到了null 路径的返回,这是正确的,但是如果我附加文件名,则 servlet 不再调用。所以就像这个http://localhost:8080/MyNote-war/pdfHandler/file.pdf,我得到了the requested resource is not available。有什么想法吗,BalusC?
  • @Harry:URL 模式必须是/pdfHandler/*。你注意到我之前评论中的修改了吗?
【解决方案2】:

我建议你看看http://www.jpedal.org/。您可以将每个 pdf 页面转换为图像,然后将它们分别传送到浏览器。

这种方法对您的应用程序更安全,因为 pdf 永远不会发送给客户端。

【讨论】:

  • 虽然它们不是免费的 :D 实际上也很贵
  • “这种方法对您的应用程序更安全,因为 pdf 永远不会发送给客户端” 怎么会?!浏览器中显示的所有内容不是第一次实际下载到客户端机器上吗?这包括所有的css、js、图像、html文件!
  • 每个页面都呈现为 jpg 并且最终用户不能“直接”访问 pdf。当然,他可能会利用“模拟漏洞”下载每一页。但是,请注意,用户必须遍历整个文档,这可能需要一段时间。此外,您可以在服务器上注册此信息并采取适当的措施。
猜你喜欢
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多