【发布时间】:2010-12-28 17:27:56
【问题描述】:
谁能帮我在 JSF 页面中仅在 iframe 中显示 PDF 文档?
提前致谢,
苏雷什
【问题讨论】:
-
您想在哪里显示它 - 在新窗口中,还是在 iframe 中?
谁能帮我在 JSF 页面中仅在 iframe 中显示 PDF 文档?
提前致谢,
苏雷什
【问题讨论】:
照常使用<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 或更新版本,<iframe> 在 JSF 中也可以正常工作。在 JSF 1.1 或更早版本中,您必须将普通的 HTML 元素(例如 <iframe>)包装在 <f:verbatim> 中,以便将它们放入 JSF 组件树中,否则它们将在输出中错位:
<f:verbatim><iframe src="/path/to/servlet/file.pdf"></iframe></f:verbatim>
【讨论】:
@WebServlet(name="pdfHandler", urlPatterns={"/pdfHandler"}),并尝试<iframe src="/pdfHandler/file.pdf"></iframe>,但没有调用servlet。诡异的。知道为什么它会这样吗,BalusC?
/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?
/pdfHandler/*。你注意到我之前评论中的修改了吗?
我建议你看看http://www.jpedal.org/。您可以将每个 pdf 页面转换为图像,然后将它们分别传送到浏览器。
这种方法对您的应用程序更安全,因为 pdf 永远不会发送给客户端。
【讨论】: