【问题标题】:Display generated PDF file on iFrame with Java server-side使用 Java 服务器端在 iFrame 上显示生成的 PDF 文件
【发布时间】:2014-07-16 13:33:09
【问题描述】:

我目前正在使用 Play! 开发 Java 应用程序!框架 2。 在某些页面中,我需要在我的服务器上生成一个 PDF 文件,然后将其发送到浏览器并在 iframe 或嵌入标签上显示。

我正在使用 Play 将文件发送到客户端!结果机制:

File resultFile = new File(outputFilePath);
response().setHeader("Content-Length", Long.toString(resultFile.length()));
return ok(resultFile).as("application/pdf");

在客户端,我收到文件,并使用createObjectUrl 来获取要传递给我的 iframe 的 URL

window.URL = window.URL || window.webkitURL;
var file = new window.Blob([result], { type: 'application/pdf' });
var fileUrl = window.URL.createObjectURL(file);
$("#displayDoc").attr("data", fileUrl);

所有这一切的结果很奇怪:iFrame 显示出来,显示的页面与我的文档中的页面一样多,但所有页面都是空的。我在 Chrome 的 Dev Tools 插件上收到此错误: resource interpreted as document but transferred with mime type application/pdf chrome

有人知道发生了什么吗?

谢谢!

劳里斯

【问题讨论】:

    标签: javascript iframe playframework pdf-generation


    【解决方案1】:

    有几种方法可以解决这个问题。

    第一种方式,哪种方式更适合您的实际问题。

    生成PDF服务器端,然后转换成HTML

    这并不像听起来那么困难,并且有许多工具可以做到这一点,例如“PDF2DOM”(http://cssbox.sourceforge.net/pdf2dom/),它需要一个现有的PDF 表示并从中创建一个 HTML dom,然后可以使用普通的 JavaScript 技术将这个 HTML 直接注入到文档中。

    第二种方式(特别是如果您使用 Java)是

    使用可以使用和显示 PDF 的基于浏览器的插件

    由于您已经使用 Java 进行开发,因此您可以开发一个 Java Applet 来使用发送给它的 PDF,并根据需要在 IFrame 中显示它,您还可以扩展此 Idea 以使用基于 Flash 的 PDF 组件或其他任何东西浏览器可以作为插件运行。

    使用这种方法您将遇到的问题是浏览器制造商越来越倾向于采用 HTML5 并放弃在浏览器中允许第三方内容。 Chrome 和 FF 仍然支持一些,IE11 也是如此,但随着我们向前发展,尤其是进入平板计算的勇敢新世界,许多浏览器将不允许运行插件,这意味着从长远来看,这可能现在可以工作,但是可能不会太久。

    第三种方法是

    利用本机浏览器支持

    今天的 Chrome 和 Firefox 都内置了 PDF 阅读器,并且可以直接在浏览器选项卡中显示 PDF 文档,就像它是一个普通的 HTML 页面一样。

    然而,这里的关键是“在 TAB 中”,在大多数情况下,可以显示 PDF 的浏览器会尝试将它们显示为完整的选项卡资源。

    可以在 IFrame 中渲染 PDF,但支持因浏览器而异,IE8 及以下版本仅在您安装了 Adob​​e Acrobat 等插件时才会显示。

    您可以尝试的一种可能的方法是使用类似 'PDFObject' (http://cssbox.sourceforge.net/pdf2dom/) 之类的东西将内容呈现为内联对象,这至少会尝试让浏览器看到PDF 作为 HTML5 中的对象,然后您可以在客户端使用 JS 中的其他代码对其进行处理。

    不过,我对您的建议是出于兼容性原因,如果您想尽可能多地利用服务器端,那么选项一可能是您最好的选择。

    至于您的 chrome 文档类型错误,这很容易解决。 :-)

    您使用正确的 MIME 类型 (application/pdf) 发送了您的内容,但就 chrome 而言,当它收到它时,该文档看起来不像 PDF 文件。

    当您将 mime-type 设置为 PDF 以发送 PDF,然后发送 HTML 时,通常会发生这种情况(例如:因为发生服务器端错误,而 Web 服务器发送了错误页面)

    希望这里的一些东西能引导你朝着正确的方向前进。

    【讨论】:

    • 感谢您的帮助!不幸的是,这个解决方案都不适合我。我尝试了 PDFObject 和 Pdf2Dom,但没有让它们工作。但我通过将我的播放控制器的 URL 设置为我的 iFrame 来解决我的问题,该 URL 提供 PDF 文件,并将 Content-Disposition 设置为“内联”。
    • 好东西,很高兴你整理好了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2013-02-27
    • 2010-10-11
    相关资源
    最近更新 更多