在页面中嵌入PDF并打印- IE9问题

Embed PDF in page and print - IE9 issues

本文关键字:打印 IE9 问题 PDF      更新时间:2023-09-26

我有一些代码通过将容器的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插入到一个隐藏的容器中,将对object元素的引用放入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头。

我发现IE7和IE8需要classid属性;否则,他们将对PDF发出多次请求,并且通常无法加载它。它还显著改善了IE9的缓存行为。

每次获取的PDF都略有不同。我目前没有把它保存到一个临时文件或任何东西,虽然我可以如果它是绝对必要的(所以我可以在随后的请求中重新发送相同的PDF)。

响应正在被gzip编码,但我有同样的问题,无论它是否启用。

我注意到,当问题发生时,终止AcroRd32.exe有时会暂时解决问题。

旁注:Firefox和Opera在嵌入PDF的页面内弹出中使用相同的HTML。这工作得很好。(Adobe Reader NPAPI插件没有一个print()方法,我已经能够找到,可悲的是,所以弹出提示用户点击嵌入视图的print按钮)

没有什么能阻止我尝试其他的嵌入方法,比如iframe,但是当我第一次尝试的时候,我遇到了一些奇怪的问题(在所有这些混乱之后,我记不清它们现在是什么了)。

我想这就是我目前对这个问题所知道的一切了。

这似乎是adobereader和IE插件特有的问题。我发现一些论坛线程表明这是一个常见的,可重复的错误(http://forums.adobe.com/thread/758489)。

解决方案似乎是在<object>/<embed>标签上使用iFrame。