我有一些代码通过将容器的 innerHTML 设置为此函数的返回字符串来将 PDF 文档动态加载到网页中:
function getPdfString(url) {
return '<object data="' + url + '" type="application/pdf" classid="clsid:ca8a9780-280d-11cf-a24d-444553540000" style="width:100%;height:600px"></object>';
}
在安装了 Adobe Reader 插件的 IE 中(由在 PDFObject 处检测 Adobe ActiveX 的代码确定),我的代码将此 HTML 插入到一个隐藏的容器中,将对对象元素的引用放入 el
,然后运行这段代码(Repeater 是自定义类):
log("** start repeater **");
var r = _repeater = new Repeater(function() {
try {
var delta = timeInterval();
log("iteration - " + delta + "ms");
el.gotoFirstPage(); //throws exceptions until the PDF is loaded
log("** assuming success, stop **");
r.stop();
r = undefined;
setTimeout(function() {
el.print(); //should succeed, can't tell because it doesn't throw or return anything
}, 100);
} catch(e) { }
}, 0, 100);
这非常复杂,但很有必要,因为无法判断 PDF 何时加载,也无法判断 el.print()
是否成功。我花了很长时间才弄清楚,但它似乎在 IE7 和 IE8 中运行良好。 IE9 时好时坏,通常在我的本地机器(运行 IIS7.5)上工作,但有时不能。当站点在我的测试服务器上运行时,IE9 从未工作过,它运行 IIS6 是出于必要。我不知道我运行的 IIS 版本是否导致了我的问题,但从 Fiddler 日志来看,我对此表示怀疑。
我一直在仔细研究 Fiddler,在这里和那里进行小的调整,看看是否有什么不同。到目前为止,什么都没有。我能看到的唯一区别是 Server
header 。
我发现IE7和IE8需要classid
属性;否则,他们会对 PDF 发出多次请求,并且经常加载失败。它还显着改进了 IE9 的缓存行为。
每次获取的 PDF 都略有不同。我目前没有将它保存到临时文件或任何其他文件中,但如果绝对必要我可以(这样我可以在后续请求中重新发送相同的 PDF)。
响应是 gzip 编码的,但无论是否启用,我都遇到同样的问题。
我注意到当问题发生时,终止 AcroRd32.exe 有时会暂时解决问题。
旁注:Firefox 和 Opera 在嵌入 PDF 的页内弹出窗口中使用相同的 HTML。这工作得很好。 (遗憾的是,Adobe Reader NPAPI 插件没有我能够找到的 print() 方法,因此弹出窗口指示用户单击嵌入式 View 的“打印”按钮)
没有什么能阻止我尝试其他嵌入方法,例如 iframe
,但是当我第一次尝试它时遇到了一些奇怪的问题(毕竟现在不记得它们是什么了)这个烂摊子)。
我想这就是我现在所知道的关于这个问题的一切......
最佳答案
这似乎是 Adobe Reader 和 IE 插件特有的问题。我发现一些论坛帖子表明这是一个常见的、可重现的错误 (http://forums.adobe.com/thread/758489)。
解决方案似乎是在 <object>
上使用 iFrame/<embed>
标签。
关于javascript - 在页面中嵌入 PDF 并打印 - IE9 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8510728/