如何在JSF页面中使用iFrame显示PDF文档

5

有没有人能帮我在JSF页面中仅通过iframe显示PDF文档?

提前感谢,

Suresh


你想把它显示在哪里呢?是在一个新窗口还是在一个 iframe 中? - Bozho
相关链接:https://dev59.com/SXI-5IYBdhLWcg3wlpiW - skaffman
2个回答

11

只需按照通常的方式使用 <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>

这篇文章中,您可以找到一个类似的Servlet的完整示例。

在JSF中,<iframe>同样可以正常工作,假设您使用的是JSF 1.2或更新版本。在JSF 1.1或更早版本中,您必须将纯HTML元素(例如<iframe>)包装在<f:verbatim>中,以便它们被视为JSF组件树的一部分,否则它们会在输出中错位:

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

如果我没记错的话,在Servlet 3.0中,你不需要在web.xml文件中注册servlet,对吧?我使用了这个代码@WebServlet(name="pdfHandler", urlPatterns={"/pdfHandler"}),然后尝试使用<iframe src="/pdfHandler/file.pdf"></iframe>,但是servlet没有被调用。很奇怪。BalusC,你有什么想法吗? - Thang Pham
1
@Harry:那URL完全错误了。你考虑到上下文路径了吗?你的示例期望你的Web应用程序部署在ROOT上。编辑:哦等等,你的URL模式必须是/pdfHandler/*,才能接受带有额外路径信息而不是请求参数的URL。 - BalusC
另一个问题,所以我尝试像您建议的那样使用request.getPathInfo()来获取文件名。我在Web浏览器上运行Servlet,像这样http://localhost:8080/MyNote-war/pdfHandler,然后我的路径返回null,这是正确的,但是如果我附加文件名,Servlet就不再调用了。因此,像这样http://localhost:8080/MyNote-war/pdfHandler/file.pdf,我得到了the requested resource is not available。有什么想法,BalusC? - Thang Pham
1
@Harry:URL模式必须是/pdfHandler/*。你注意到我之前评论中的编辑了吗? - BalusC
@Harry:不,它不会缩放文件。然而,默认的Adobe Reader插件接受URL片段,您可以将其用作“参数”,例如src="/pdfHandler/file.pdf#zoom=50"表示50%缩放。您可以在此处找到所有这些参数。请注意,您以这种方式依赖于插件。 - BalusC
显示剩余6条评论

1

我建议您查看http://www.jpedal.org/。您可以将每个PDF页面转换为图像,并将它们分别传递到浏览器。

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


好吧,它们并不是免费的:D 实际上相当昂贵。 - Thang Pham
这种方法对您的应用程序更安全,因为PDF文件永远不会发送到客户端。怎么可能?!难道不是在第一次加载时将浏览器中显示的所有内容都下载到客户端计算机上吗?这包括所有的CSS、JS、图像和HTML文件! - Nabeel
每个页面都被渲染为JPG格式,PDF文件不是“直接”可供最终用户访问的。当然,他可能会利用“模拟漏洞”下载每一页。但请注意,用户必须遍历整个文档,这可能需要一些时间。此外,您可以在服务器上注册此信息并采取适当的措施。 - Dani Cricco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接