2011-12-14 53 views
2

我有一個容器的innerHTML設置該函數的返回的字符串動態加載PDF文檔轉換爲網頁一些代碼:嵌入PDF - IE9發佈

function getPdfString(url) { 
    return '<object data="' + url + '" type="application/pdf" classid="clsid:ca8a9780-280d-11cf-a24d-444553540000" style="width:100%;height:600px"></object>'; 
} 

在IE瀏覽器與安裝了Adobe Reader插件(由檢測到Adobe ActiveX的代碼確定,代碼爲PDFObject),我的代碼將此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()方法,我已經能夠找到,遺憾的是,這樣的彈出指示用戶點擊內嵌視圖的打印按鈕)

沒有什麼是試圖阻止我其他的嵌入方法如iframe,但是當我第一次嘗試時,我有一些奇怪的問題(在這一切混亂之後,現在不記得他們現在是什麼了)。

我想這就是我知道的問題,現在一切......

回答

1

這似乎專門是一個問題,使用Adobe Reader和IE插件。我發現了幾個論壇帖子,表明這是一個常見的,可重現的錯誤(http://forums.adobe.com/thread/758489)。

解決方案似乎是通過<object>/<embed>標籤使用iFrame。

+0

我記得首先嚐試了一個iframe,但我有一些奇怪的問題。現在不記得了。儘管現在不重要;我的項目經理想要改變另一個項目,讓這個項目變得毫無意義。但是,從我所知道的情況來看,這可能會解決我現在遇到的問題。 – Taudris 2011-12-19 19:13:34