我正在运行Windows 7,64位。我最近更新了我的操作系统以安装最新的更新。从那时起,大多数PDF文档都停止在我的程序中呈现。我的程序想要在单独的iFrame中显示PDF文档。我这样做是通过获取PDF文档的URL并设置window.frames['docview'].location = url;
在大多数情况下,iframe视图保持空白(如果先前显示了某些内容,则清除)。如果我使用相同的URL并在新的选项卡或窗口中打开它,它会呈现正常。
如果无法在我的iframe中呈现,我会在Chrome控制台中看到以下消息:
Resource interpreted as Document but transferred with MIME type application/pdf.
Firefox在其错误控制台或FireBug控制台上不提供任何类型的消息。
我无法控制PDF文件的来源,因此我无法更改其标题信息。
奇怪的是,有些文件可以正确加载。
查看Chrome中的网络请求,对于无法加载的文档,我看到了(例如):
Request URL:http://es.csiro.au/pubs/paradis_mdm03.pdf
Request Method:GET
Status Code:200 OK
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Host:es.csiro.au
Referer:http://querium.fxpal.net:8080/querium/ui/query?searcherId=2&compact=true&sidx=rank&topicId=2&queryId=1&lastEventId=1490893682130103&highlight=undefined
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1
Response Headers
Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:71764
Content-Type:application/pdf
Date:Tue, 06 Sep 2011 04:59:26 GMT
ETag:"1f48c8-11854-43e4ee482ef40"
Keep-Alive:timeout=15, max=100
Last-Modified:Wed, 07 Nov 2007 04:07:49 GMT
Server:Apache/2.0.55 (Ubuntu) PHP/5.1.2 mod_ssl/2.0.55 OpenSSL/0.9.8a
当从单独的选项卡(文档渲染的位置)打开时,我得到以下内容:
Request URL:http://es.csiro.au/pubs/paradis_mdm03.pdf
Request Method:GET
Status Code:304 Not Modified
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:es.csiro.au
If-Modified-Since:Wed, 07 Nov 2007 04:07:49 GMT
If-None-Match:"1f48c8-11854-43e4ee482ef40"
Range:bytes=0-71763
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1
Response Headers
Connection:Keep-Alive
Date:Tue, 06 Sep 2011 05:07:15 GMT
ETag:"1f48c8-11854-43e4ee482ef40"
Keep-Alive:timeout=15, max=100
Server:Apache/2.0.55 (Ubuntu) PHP/5.1.2 mod_ssl/2.0.55 OpenSSL/0.9.8a
一个奇怪的事情是状态的差异,但也许服务器很聪明或者与缓存有一些有趣的交互。谁知道呢。
非常感谢任何帮助。
基因
编辑:2011年9月6日
当我删除标签
时 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
来自我的HTML页面的<head>
元素,许多(但不是全部)PDF正式开始渲染。这是标题中另一个元标记的明显副本:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
这是否有助于揭示潜在问题?
答案 0 :(得分:2)
不是将iframe的src
属性设置为PDF,而是将其设置为包装HTML文件,其中包含一个简单的div:
<!DOCTYPE html>
<html style="height:100%;">
<head>
</head>
<body style="height:100%;">
<div id="divContents" style="height:100%;"></div>
</body>
</html>
在javascript中,div
的内容设置为object
元素。不幸的是,在所有浏览器上都可以使用稍微不同的版本(在IE,Firefox和Chrome上测试):
(我简化了divContents元素的检索和浏览器检测)
var embed = '<object type="application/pdf" width="100%" height="100%"';
if (msie) {
embed += '><param name="src" value="' + pdf + '"/>';
}
else if (chrome) {
embed += ' src="' + pdf + '">';
}
else {
embed += ' data="' + pdf + '">';
}
embed += '</object>';
$("#divContents").html(embed);
<强>已更新强>
我终于在Chrome中找到了失败的真正原因:它是Accept-Ranges:bytes
字段,如果没有它,则在使用data
属性时Chrome无效。
Accept-Ranges
字段,则应确保将其返回给客户端。在这种情况下,您可以使用pdfobject库在框架或div中显示PDF。答案 1 :(得分:0)
过去,在iframe中加载了pdf的一些问题,包括Firefox和Chrome(特别是当Content-Type和Content-Disposition等标题未正确设置时)。
您可能应该使用<object>
标记在页面中嵌入pdf而不是iframe,但更简单的解决方案是 pdfobject 库。要验证这是否有效,您可以使用Chrome和Firefox浏览this jsfiddle 。
此外,您可以在服务器中使用代理脚本来流式传输PDF:您的页面将指向代理脚本并传递一个标识符(这样就不会轻易入侵)该脚本将下载并使用正确的标题将匹配的pdf发送到浏览器。
最后关于不同状态代码的说明:在服务器向浏览器发送的第一个响应中,Last-Modified
和ETag
包含时间戳和文件的哈希值;因此浏览器,在第二个请求中只要求资源
If-Modified-Since:Wed, 07 Nov 2007 04:07:49 GMT
If-None-Match:"1f48c8-11854-43e4ee482ef40"
由于资源未被更改,第二个响应是304。