将PDF嵌入页面并打印
我有一些代码,它通过将容器的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日志来看,我对此表示怀疑。
我一直在仔细研究小提琴手,在这里和那里做小小的调整,看看有什么不同。 到目前为止,什么都没有。 唯一的区别是我可以看到的是Server
头。
我发现IE7和IE8需要classid
属性; 否则,他们会为PDF提出多个请求,并且经常无法加载它。 它也显着改善了IE9的缓存行为。
每次获取PDF时略有不同。 我目前没有将它保存到临时文件或任何东西,尽管如果它是绝对必要的(所以我可以在后续请求中重新发送相同的PDF)。
响应正在被gzip编码,但是无论是否启用,我都有同样的问题。
我注意到,当问题发生时,终止AcroRd32.exe有时会暂时解决问题。
附注:Firefox和Opera在嵌入PDF的页面内弹出窗口中使用相同的HTML。 这工作非常好。 (Adobe Reader NPAPI插件没有print()方法,我可以很容易地找到它,所以弹出框会指示用户单击嵌入视图的Print按钮)
没有什么能够阻止我试图嵌入其他嵌入方法,例如iframe
,但是当我第一次尝试时,我有一些奇怪的问题(在所有这些混乱之后,现在都不记得它们是什么了)。
我认为这就是我现在知道的关于这个问题的一切......
这似乎是专门针对Adobe Reader和IE插件的问题。 我发现了几个论坛主题,表明这是一个常见的,可重现的错误(http://forums.adobe.com/thread/758489)。
该解决方案似乎是通过<object>
/ <embed>
标签使用iFrame。