我目前正在使用Play开发Java应用程序!框架2。 在某些页面中,我需要在服务器上生成PDF文件,然后将其发送到浏览器并在iframe或embed标签上显示。
我使用Play将文件发送到客户端!结果机制:
File resultFile = new File(outputFilePath);
response().setHeader("Content-Length", Long.toString(resultFile.length()));
return ok(resultFile).as("application/pdf");
在客户端,我收到该文件,并使用createObjectUrl
以获取传递给我的iframe的网址
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
有没有人知道发生了什么?
谢谢!
Lauris
答案 0 :(得分:1)
有几种方法可以解决这个问题。
第一种方式,以及可能更适合您的实际问题。
生成PDF服务器端,然后将其转换为HTML
这并不像听起来那么困难,而且还有很多工具可以做到这一点,例如' PDF2DOM '(http://cssbox.sourceforge.net/pdf2dom/),这将采取现有的PDF表示并从中创建HTML dom,然后可以使用常规JavaScript技术将此HTML直接注入到文档中。
第二种方式(特别是如果你使用Java)
使用可以使用和显示PDF的基于浏览器的插件
由于您已经在Java中开发,您可以开发一个可以使用发送给它的PDF的Java Applet,并根据需要将其显示在IFrame中,您也可以扩展此Idea以使用基于Flash的PDF组件或其他任何内容浏览器可以作为插件运行。
问题您将采用这种方法,是浏览器制造商越来越倾向于采用HTML5并且不再允许在浏览器中使用第三方内容。 Chrome& FF仍然支持一些,就像IE11一样,但随着我们前进,特别是进入平板电脑的勇敢新世界,许多浏览器都不允许运行插件,这意味着从长远来看,这可能现在可以使用,但可能不会很久。
第三种方法是
利用原生浏览器支持
Chrome和Firefox今天都内置了PDF阅读器,可以直接在浏览器标签页中显示PDF文档,就像它是一个普通的HTML页面一样。
然而,这里的关键是“在TAB中”,在大多数情况下,可以显示PDF的浏览器会尝试将它们显示为完整标签资源。
可以在IFrame中呈现PDF,但是对于IE8及更低版本,浏览器与浏览器之间的支持差异很大,只显示如果您安装了Adobe Acrobat等插件。
您可以尝试的一种可能途径是使用“ PDFObject ”(http://cssbox.sourceforge.net/pdf2dom/)等内容将内容呈现为内联对象,这至少会尝试将浏览器设置为将PDF视为HTML5中的一个对象,然后您可以使用客户端上的JS中的其他一些代码来处理它。
我给你的建议是出于兼容性原因,如果你想尽可能地利用服务器端,那么选项一可能是你最好的选择。
至于你的chrome文档类型错误,这很容易解决。 : - )
您使用正确的MIME类型(application / pdf)发送了您的内容,但就chrome而言,当它收到它时,该文档看起来不像PDF文件。
当您将mime-type设置为PDF以发送PDF,然后发送HTML(EG:发生服务器端错误,Web服务器发送错误页面)时,通常会发生这种情况。
希望这里的某些东西会引导你朝着正确的方向前进。