【问题标题】:How do I display a PDF onto a JSF page如何在 JSF 页面上显示 PDF
【发布时间】:2011-04-21 15:27:53
【问题描述】:

我想在我的 JSF 页面上显示一个 PDF 文件,我已经检查了这个 how to display a pdf document in jsf page in iFrame,但我不想在 iframe 上显示它(因为它会生成滚动条)。我只想将 pdf 像图像一样显示在页面上,并能够为其提供宽度和高度。

编辑 Hi BalusC。我仍然无法显示 pdf 内联。这是我的代码。

@WebServlet(name = "pdfHandler", urlPatterns = {"/pdfHandler/*"})
public class pdfHandler extends HttpServlet {

    private static final int DEFAULT_BUFFER_SIZE = 10240;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String requestedFile = request.getPathInfo();
        File file = new File("/Users/KingdomHeart/Downloads/Test/pdf/" + requestedFile);
        response.reset();
        response.setContentType("application/pdf");
        response.setBufferSize(DEFAULT_BUFFER_SIZE);
        response.setHeader("Content-Length", String.valueOf(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{
            output.close();
            input.close();
        }
    }
    ...
}

它仍然提示我下载 pdf 文件。下载到我的电脑的 pdf 文件是正确的 pdf 文件。你能发现什么不对劲吗?

【问题讨论】:

  • 首先,检查您的浏览器是否安装了 Adobe Reader 插件。您可以在浏览器中查看 PDF 文档,还是仍然要求下载?

标签: html jsf pdf


【解决方案1】:

实际上并没有其他方法(HTML <object> 标签会有相同的“问题”),但您可以给 <iframe> 一个固定大小并禁用滚动,如下所示:

<iframe src="foo.pdf" width="600" height="400" scrolling="no"></iframe>

如果您还想隐藏(默认)边框,请同时添加 frameBorder="0"

【讨论】:

  • 当我在 iframe 中显示时,它不显示 pdf,它会立即提示我下载 pdf 文件。转换 pdf -> 图像是唯一的解决方案吗?
  • Content-Disposition 响应标头必须设置为inline(默认)而不是attachment。另请参阅您为执行此操作的代码行链接的答案。
  • 根据您的更新:然后这是一个浏览器设置,当检索到任何 PDF 时,它必须始终保存。你用火狐吗? 工具 > 选项 > 应用程序。请注意,默认情况下它不会这样做,您必须在之前获取 PDF 文件时勾选了一些 remember 选项。
  • 是的。我切换到 chrome,然后它按预期运行。处理pdf其实很痛苦。
【解决方案2】:

您应该看看ICEpdf,它会在服务器端创建一个图像,提供缩放和其他控件 (demo)。

【讨论】:

  • 你以前用过这个库吗?
  • 没有servlet部分,只有图像转换,但如果你下载发布它有一个JSF(ICEfaces)webapp示例。
【解决方案3】:

尝试进入 Adob​​e Reader,在“选项”对话框下有一些网络设置,您可以在其中指明您始终希望 PDF 类型的文档在浏览器中打开。

不幸的是,这是一个客户端修复,没有考虑到其他 PDF 阅读器。

【讨论】:

    【解决方案4】:

    你想要的都是不可能的。浏览器并不神奇,它们只是显示不同类型的文档,其中一些(HTML)可以嵌入插件提供的对象(flash、java)和 iframe 中的其他文档(pdf、flash、html)。如果要显示 pdf 缩影,则必须在服务器上生成图像。

    【讨论】:

    • 谢谢。关于将 pdf 转换为图像的 Java 开源 API 有什么建议吗?
    • java.net/projects/pdf-renderer 的 PDF 渲染器库(来自 SwingLabs)曾经运行良好(虽然我从未使用它来制作拇指,但它应该可以运行)。
    • 你在哪里下载可执行文件,jar文件?我看到的只是源代码。
    • Uhmpf...它已移至新的基础架构,看起来不同了。我想你会在这里找到二进制文件:swinglabs.org/downloads.jsp
    • 这是一篇让我开始使用它的文章:javaworld.com/javaworld/jw-06-2008/…
    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2012-02-28
    • 2019-02-14
    相关资源
    最近更新 更多