Вставить PDF в страницу и распечатать - IE9 выпуски - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть некоторый код, который динамически загружает документ 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, но у меня были некоторые странные проблемы с ним, когда я впервые попробовал (не могу вспомнить, какими они были сейчас, после всего этого беспорядка).

Я думаю, что это все, что я знаю о проблеме прямо сейчас ...

1 Ответ

1 голос
/ 15 декабря 2011

Это, похоже, проблема именно с Adobe Reader и плагином IE.Я нашел несколько веток форума, в которых указано, что это распространенная воспроизводимая ошибка (http://forums.adobe.com/thread/758489).

. Решение, похоже, заключается в использовании iFrame над тегом <object> / <embed>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...