У меня есть некоторый код, который динамически загружает документ PDF на веб-страницу, устанавливая значение параметра innerHTML контейнера для возвращаемой строки этой функции:
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
.
Я обнаружил, что атрибут classid
необходим для IE7 и IE8; в противном случае они будут делать несколько запросов на PDF и часто не смогут его загрузить. Это также значительно улучшает поведение кэширования IE9.
PDF-файл немного отличается при каждом получении. В настоящее время я не сохраняю его во временный файл или что-либо еще, хотя мог бы, если это абсолютно необходимо (поэтому я мог бы повторно отправить тот же PDF-файл в следующем запросе).
Ответ кодируется в gzip, но у меня та же проблема, включена ли она или нет.
Я заметил, что при возникновении проблемы прерывание AcroRd32.exe иногда временно устраняет проблему.
Примечание: Firefox и Opera используют один и тот же HTML-код во всплывающем окне, встраивающем PDF. Это прекрасно работает. (Плагин Adobe Reader NPAPI не имеет метода print (), который я смог найти, к сожалению, поэтому всплывающее окно предлагает пользователям нажать кнопку «Печать» во встроенном представлении)
Ничто не мешает мне попробовать другие методы встраивания, такие как iframe
, но у меня были некоторые странные проблемы с ним, когда я впервые попробовал (не могу вспомнить, какими они были сейчас, после всего этого беспорядка).
Я думаю, что это все, что я знаю о проблеме прямо сейчас ...