Файлы PDF не открываются в Internet Explorer с Adobe Reader 10.0 - пользователи получают пустой серый экран. Как я могу исправить это для своих пользователей?

Существует известная проблема с открытием PDF-файла в Internet Explorer (v 6, 7, 8, 9) с помощью Adobe Reader X (версия 10.0. *). Окно браузера загружается с пустым серым экраном (и даже не имеет панели инструментов Reader). Он отлично работает с Firefox, Chrome или Adobe Reader 10.1. *.

Я обнаружил несколько обходных путей. Например, нажатие «Обновить» загрузит документ правильно. Обновление до Adobe Reader 10.1. * Или понижение до 9. * также решает проблему.
Однако для всех этих решений требуется, чтобы пользователь разобрался в этом. Большинство моих пользователей очень смущаются, видя этот серый экран, и в конечном итоге обвиняют файл PDF и обвиняют веб-сайт в том, что он сломан. Честно говоря, пока я не исследовал проблему, я тоже обвинял PDF-файл!

Итак, я пытаюсь найти способ решить эту проблему для своих пользователей.
Я подумал о том, чтобы предоставить ссылку «Загрузить PDF» (которая устанавливает для заголовка Content-Disposition значение attachment вместо inline), но моя компания этого не делает. это решение вообще не нравится, потому что мы действительно хотим, чтобы эти PDF-файлы отображались в браузере.

Кто-нибудь еще сталкивался с этой проблемой?

Какие есть возможные решения или обходные пути?

Я действительно надеюсь на решение, которое будет безупречным для конечного пользователя, потому что я не могу полагаться на них, чтобы знать, как изменить свои настройки Adobe Reader или автоматически установить обновления.

Вот ужасный серый экран:
Изменить: снимок экрана был удален с файлового сервера! Извините!
Изображение представляло собой окно браузера с обычной панелью инструментов, но сплошным серым фоном, без какого-либо пользовательского интерфейса.

Справочная информация:
Хотя я не думаю, что следующая информация связана с моей проблемой, я включу ее для справки:
Это приложение ASP.NET MVC, и в нем Доступен jQuery.
Ссылка на файл PDF имеет target=_blank, поэтому он открывается в новом окне.
Файл PDF создается на лету, и все заголовки содержимого устанавливаются надлежащим образом. URL-адрес НЕ включает расширение .pdf, но мы устанавливаем заголовок content-disposition с допустимым .pdf именем файла и настройкой inline.

Изменить: вот исходный код, который я использую для обслуживания файлов PDF.

Во-первых, действие контроллера:

public ActionResult ComplianceCertificate(int id){
    byte[] pdfBytes = ComplianceBusiness.GetCertificate(id);
    return new PdfResult(pdfBytes, false, "Compliance Certificate {0}.pdf", id);
}

А вот ActionResult (PdfResult, наследует System.Web.Mvc.FileContentResult):

using System.Net.Mime;
using System.Web.Mvc;
/// <summary>
/// Returns the proper Response Headers and "Content-Disposition" for a PDF file,
/// and allows you to specify the filename and whether it will be downloaded by the browser.
/// </summary>
public class PdfResult : FileContentResult
{
    public ContentDisposition ContentDisposition { get; private set; }

    /// <summary>
    /// Returns a PDF FileResult.
    /// </summary>
    /// <param name="pdfFileContents">The data for the PDF file</param>
    /// <param name="download">Determines if the file should be shown in the browser or downloaded as a file</param>
    /// <param name="filename">The filename that will be shown if the file is downloaded or saved.</param>
    /// <param name="filenameArgs">A list of arguments to be formatted into the filename.</param>
    /// <returns></returns>
    [JetBrains.Annotations.StringFormatMethod("filename")]
    public PdfResult(byte[] pdfFileContents, bool download, string filename, params object[] filenameArgs) 
        : base(pdfFileContents, "application/pdf")
    {
        // Format the filename:
        if (filenameArgs != null && filenameArgs.Length > 0)
        {
            filename = string.Format(filename, filenameArgs);
        }

        // Add the filename to the Content-Disposition
        ContentDisposition = new ContentDisposition
                                 {
                                     Inline = !download,
                                     FileName = filename,
                                     Size = pdfFileContents.Length,
                                 };
    }

    protected override void WriteFile(System.Web.HttpResponseBase response)
    {
        // Add the filename to the Content-Disposition
        response.AddHeader("Content-Disposition", ContentDisposition.ToString());
        base.WriteFile(response);
    }
}

person Scott Rippey    schedule 28.09.2011    source источник
comment
Как правило, вы не можете гарантировать, что браузер конечного пользователя откроет PDF-документ каким-либо определенным образом. Однако я понимаю ваш вопрос и считаю его интересным.   -  person Pointy    schedule 28.09.2011
comment
Вы правы ... на самом деле, если пользователь открывает PDF-файл ЛЮБОЙ другой способ, он отлично работает! Но способ ПО УМОЛЧАНИЮ - это остановка шоу, и в этом моя проблема.   -  person Scott Rippey    schedule 28.09.2011
comment
Используйте HTTP-сниффер, чтобы проверить, обслуживаете ли вы правильные типы mime - вы можете установить их правильно, и тогда ваш сервер испортит его. Также убедитесь, что вы либо правильно его ПОТОКУЕТЕ, либо файл полностью отправлен в браузер (файлы журнала). Наконец, выведите файл на диск и используйте готовый файл как временную меру.   -  person mplungjan    schedule 29.09.2011
comment
@mplungjan Спасибо за предложения ... Я использовал Fiddler для проверки HTTP-заголовка, и все выглядит правильно (Content-Type, Content-Disposition и т. д.). Полный файл тоже транслировался. Поскольку проблема устраняется обновлением или обновлением Reader, само собой разумеется, что файл PDF и транспорт работают нормально.   -  person Scott Rippey    schedule 29.09.2011
comment
Вы очищаете ответ перед отправкой и т. Д.? Какой именно код вы используете для отправки PDF-файла?   -  person Steve    schedule 29.09.2011
comment
@Steve Я говорю вам, я очень сомневаюсь, что проблема в файле PDF или в методе транспортировки. Проблема характерна для IE с Reader 10.0. *. При этом я изменил исходный вопрос, включив в него класс PdfResult, ответственный за возврат результата.   -  person Scott Rippey    schedule 29.09.2011
comment
Как бы то ни было, я столкнулся с проблемой, похожей на эту. Оказывается, мы отправляли в ответ файл pdf И html. Некоторые комбинации IE и Adobe Reader (я полагаю, X) подавились этим. Убедитесь, что вы не передаете HTML-код.   -  person Aaron Daniels    schedule 29.09.2011
comment
вы можете добавить .pdf перед? или # в URL?   -  person mplungjan    schedule 29.09.2011
comment
@AaronDaniels: Это хороший момент, но я проверил с помощью Fiddler, что файл PDF передается правильно - ответ начинается с %PDF и заканчивается %%EOF, а длина содержимого также соответствует длине ответа.   -  person Scott Rippey    schedule 29.09.2011
comment
@mplungjan: В какой-то момент я добавил к своему маршруту расширение .pdf, которое создало URL-адрес типа ComplianceCertificate.pdf?id=1. Однако я удалил это и не помню почему. Я подумываю о повторном тестировании этого сценария, потому что, возможно, это может иметь эффект.   -  person Scott Rippey    schedule 29.09.2011
comment
Иногда IE требуется вся доступная помощь.   -  person mplungjan    schedule 30.09.2011
comment
@mplungjan: Хорошо, я добавил к URL-адресу расширение .pdf, но это не повлияло на эту проблему.   -  person Scott Rippey    schedule 01.10.2011


Ответы (10)


Прошло 4 месяца с тех пор, как я задал этот вопрос, и я все еще не нашел хорошего решения.
Тем не менее, я нашел достойное решение, которым я поделюсь, если у других возникнет такая же проблема.
Я попробую чтобы обновить и этот ответ, если я добьюсь дальнейшего прогресса.

Во-первых, мое исследование показало, что существует несколько возможных комбинаций пользовательских настроек и настроек сайта, которые вызывают различные проблемы с отображением PDF. К ним относятся:

  • Неработающая версия Adobe Reader (10.0. *)
  • Сайт HTTPS с Internet Explorer и настройкой по умолчанию «Не сохранять зашифрованные файлы на диск»
  • Настройка Adobe Reader - отключите «Показывать PDF-файлы в моем браузере»
  • Медленное оборудование (спасибо @ahochhaus)

Я потратил некоторое время на изучение вариантов отображения PDF на сайте pdfobject.com, который является ОТЛИЧНЫМ ресурсом, и я многому научился.

Обходной путь, который я придумал, - встроить PDF-файл в пустую HTML-страницу. Это очень просто: Посмотрите несколько похожих примеров на pdfobject.com.

<html>
    <head>...</head>
    <body>
        <object data="/pdf/sample.pdf" type="application/pdf" height="100%" width="100%"></object>
    </body>
</html>

Однако вот список предостережений:

  • Это игнорирует все пользовательские настройки для PDF-файлов - например, мне лично нравится, когда PDF-файлы открываются в автономном Adobe Reader, но это игнорируется.
  • Это не работает, если у вас не установлен / не включен плагин Adobe Reader, поэтому я добавил в html раздел «Get Adobe Reader» и ссылку для загрузки файла, которая обычно полностью скрывается тегом <object />. , ... но ...
  • В Internet Explorer, если плагин не загружается, пустой объект все равно будет скрывать раздел «Get Adobe Reader», поэтому мне пришлось установить z-index, чтобы он отображался ... но ...
  • Встроенная программа просмотра PDF-файлов Google Chrome также отображает раздел «Get Adobe Reader» поверх PDF-файла, поэтому мне пришлось выполнить обнаружение браузера, чтобы определить, показывать ли «Get Reader».

Это огромный список предостережений. Я считаю, что он охватывает все основы, но мне определенно неудобно применять это для КАЖДОГО пользователя (у большинства из которых нет проблем).
Поэтому мы решили использовать этот embedded вариант ТОЛЬКО, если пользователь выбирает Это. На нашей странице PDF есть раздел «Проблемы с просмотром PDF-файлов?», Который позволяет вам изменить настройку на «встроенный», и мы сохраняем эту настройку в файле cookie.
В нашем GetPDF действии мы ищем embed=true cookie. Это определяет, вернем ли мы файл PDF или вернем представление HTML со встроенным PDF.

Фу. Это было даже менее увлекательно, чем писать IE6-совместимый JavaScript.
Я надеюсь, что другие, столкнувшиеся с такой же проблемой, смогут утешиться, зная, что они не одиноки!

person Scott Rippey    schedule 24.01.2012
comment
Я знаю, что это устарело, но я попробовал ваше встроенное решение в формате PDF, и, похоже, оно работает. За исключением части height="100%" width="100%". Кажется, это не работает, и PDF-файл отображается без высоты. Я тоже попробовал немного CSS, но ничего не работает. - person Daniel Marín; 06.10.2015

У меня нет точного решения, но я опубликую свой опыт с этим на случай, если они помогут кому-то еще.

Судя по моему тестированию, серый экран срабатывает только на более медленных машинах [1]. На сегодняшний день мне не удалось воссоздать его на новом оборудовании [2]. Все мои тесты проводились в IE8 с Adobe Reader 10.1.2. Для своих тестов я отключил SSL и удалил все заголовки, которые могли отключить кеширование.

Чтобы воссоздать серый экран, я выполнил следующие шаги:

1) Перейдите на страницу, которая ссылается на PDF-файл
2) Откройте PDF-файл в новом окне или на вкладке (либо через контекстное меню, либо target = "_ blank")
3) В моих тестах этот PDF-файл будет открывать без ошибок (однако я получил отчеты пользователей, указывающие на сбой при первой загрузке PDF-файла)
4) Закройте недавно открытое окно или вкладку
5) Откройте PDF-файл (снова) в новом окне или вкладке
6) Этот PDF-файл не откроется, а вместо этого покажет только «серый экран», упомянутый первым пользователем (все последующие загруженные PDF-файлы также не будут отображаться - пока все окна браузера не будут закрыты)

Я выполнил вышеуказанный тест с несколькими разными PDF-файлами (как статическими, так и динамическими), созданными из разных источников, и проблема с серым экраном всегда возникает при выполнении вышеуказанных шагов (на «медленном» компьютере).

Чтобы смягчить проблему в моем приложении, я «разорвал» страницу, которая ссылается на PDF (удалял части по частям, пока серый экран не исчез). В моем конкретном приложении (построенном на библиотеке закрытия) удаление всех ссылок на goog.userAgent.adobeReader [3], похоже, устранило проблему. Это точное решение не будет работать с jquery или .net MVC, но, возможно, этот процесс поможет вам изолировать источник проблемы. Я еще не удосужился определить, какая конкретная часть goog.userAgent.adobeReader вызывает ошибку в Adobe Reader, но вполне вероятно, что jquery может иметь код обнаружения плагинов, аналогичный тому, который используется в библиотеке закрытия.

[1] На компьютере отображается серый экран:
Win Server '03 SP3
AMD Sempron 2400+ на 1,6 ГГц
256 МБ памяти

[2] На компьютере не отображается серый экран:
Win XP x64 SP2
AMD Athlon II X4 620 с частотой 2,6 ГГц
4 ГБ памяти

[3] http://closure-library.googlecode.com/svn/docs/closure_goog_useragent_adobereader.js.source.html

person ahochhaus    schedule 24.01.2012
comment
Большое спасибо за подробное описание вашей проблемы! Для меня это все еще проблема, и я нашел несколько способов ее воспроизвести. Я напишу ответ с описанием моего текущего обходного пути, который также может вам помочь. - person Scott Rippey; 24.01.2012
comment
Кроме того, только что был момент быстрого дежавю, я думаю, вы описали симптом, который я не осознавал ... PDF загружается правильно в первый раз, но не во всех последующих сеансах браузера. Думаю, я помню такое же поведение. - person Scott Rippey; 25.01.2012
comment
Спасибо, Скотт, обновление, описывающее вашу историю отладки и текущую работу, может быть очень полезным. - person ahochhaus; 25.01.2012

Я столкнулся с этой проблемой примерно во время первого выпуска MVC1. См. Создание PDF, ошибка с IE и HTTPS относительно Cache-Control заголовок.

person Todd Smith    schedule 01.10.2011
comment
Спасибо за ссылку. Хотя симптомы не совсем те же, я собираюсь попробовать несколько из этих решений и посмотреть, изменит ли это что-нибудь для моей проблемы. - person Scott Rippey; 02.10.2011

Для Win7 Acrobat Pro X

Поскольку я сделал все это, не перепроверив, существует ли проблема после этого, я не уверен, какой из них действительно устранил проблему, но один из них сделал. Фактически, после выполнения пункта 3 и перезагрузки все заработало отлично.

К вашему сведению: Ниже приведен порядок, в котором я прошел ремонт.

  1. Перейдите к Control Panel> параметры папок под каждой из вкладок General, View и Search нажмите кнопку Restore Defaults и кнопку Reset Folders

  2. Заходим в Internet Explorer, Tools> Options> Advanced> Reset (личные настройки удалять не нужно)

  3. Откройте Acrobat Pro X в разделе Edit> Preferences> General.
    Внизу страницы выберите Default PDF Handler. Я выбрал Adobe Pro X и нажал Apply.

Вас могут попросить перезагрузить компьютер (я это сделал).

С наилучшими пожеланиями

person FCWatson    schedule 30.09.2012
comment
Спасибо за ввод, но я думаю, вы упустили суть ... проблема в том, что люди, пытающиеся просмотреть эти PDF-файлы, не обладают компьютерной грамотностью ... они не обновляют свои приложения, они не знают, как изменить свои предпочтения, и они обвиняют МЕНЯ в своих бедах. Поэтому я хочу выяснить, как решить их проблему со своей стороны. - person Scott Rippey; 01.10.2012
comment
Недавно я столкнулся с этой проблемой, и это был единственный способ решить ее. Я наблюдал, как IE всегда будет вести себя так, как будто Reader не установлен. Итак, на моей странице с инструкциями по установке Reader я просто добавил текст, говорящий, что если у вас установлен Reader, выполните шаги из пункта 2 выше. - person Lane Goolsby; 29.09.2014

В моем случае решение было довольно простым. Я добавил этот заголовок, и браузеры открывали файл в каждом тесте. заголовок ('Content-Disposition: attachment; filename = "filename.pdf"');

person David Alexandru    schedule 23.09.2013

У меня была такая проблема. Переустановка последней версии Adobe Reader ничего не дала. Adobe Reader работал в Chrome, но не в IE. Это сработало для меня ...

1) Перейдите в меню Инструменты IE -> Просмотр в режиме совместимости.
2) Войдите на веб-сайт, на котором есть PDF-файл, который вы хотите просмотреть. Нажмите OK.
3) Перезапустите IE. 4) Перейдите на указанный вами веб-сайт и выберите PDF-файл. Он должен появиться.
5) Вернитесь в режим совместимости и удалите сделанную вами запись.
6) Adobe Reader теперь работает нормально в IE на всех веб-сайтах.

Странное исправление, но у меня оно сработало. Мне нужно было пройти через экран принятия Adobe после переустановки, который появился только после того, как я проделал трюк с представлением совместимости. После того, как он был принят, казалось, что он работает везде. Довольно непонятная штука. Надеюсь, это кому-то поможет.

person Lisa    schedule 26.05.2014
comment
Спасибо, это может помочь определить проблему ... возможно, серый экран вызван тем, что приложение пытается, но не может показать сообщение о первом запуске. Однако исходный вопрос заключается в том, как исправить это с точки зрения разработчика, а не пользователя. - person Scott Rippey; 28.05.2014

Хм, а можно ли просто сделать это:

В первый раз, когда ваш пользователь открывает PDF-файл, используя Javascript, вы создаете всплывающее окно, в котором в основном говорится: «Если вы не видите свой документ, нажмите ЗДЕСЬ». Сделайте «ЗДЕСЬ» большой кнопкой, которая объяснит вашему пользователю, в чем проблема. Также сделайте еще одну кнопку «все нормально». Если пользователь нажимает на него, вы его запоминаете, поэтому в будущем он не будет отображаться.

Я пытаюсь быть практичным. Попытки решить эту проблему «должным образом» для небольшого подмножества версий Adobe Reader не кажутся мне очень продуктивными.

person darioo    schedule 28.09.2011
comment
Acrobat Reader X или 10 не будет небольшим подмножеством во всех версиях IE. - person mplungjan; 29.09.2011
comment
@darioo Я согласен, создавать большое исправление для небольшой проблемы не очень практично. Надеюсь, проблема исчезнет, ​​когда люди будут обновлять Reader. Однако в настоящее время он затрагивает многих пользователей, причем в значительной степени. Я действительно надеюсь на правильное решение - это означает, что пользователь не осознает проблему. - person Scott Rippey; 29.09.2011

По мере того, как я экспериментирую, основная причина в моем приложении (вызов goog.userAgent.adobeReader) заключалась в доступе к Adobe Reader через ActiveXObject на странице со ссылкой на PDF. Этот минимальный тестовый пример вызывает у меня серый экран (однако удаление ActiveXObject не вызывает серого экрана).

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>hi</title>
    <meta charset="utf-8">
  </head>
  <body>
    <script>
      new ActiveXObject('AcroPDF.PDF.1');
    </script>
    <a target="_blank" href="http://partners.adobe.com/public/developer/en/xml/AdobeXMLFormsSamples.pdf">link</a>
  </body>
</html>

Мне очень интересно, смогут ли другие воспроизвести проблему с помощью этого тестового примера и следуя шагам из другого моего сообщения («У меня нет точного решения ...») на «медленном» компьютере.

Извините за публикацию нового ответа, но я не мог понять, как добавить блок кода в комментарий к моей предыдущей публикации.

Видео-пример этого минимального тестового случая см .: http://youtu.be/IgEcxzM6Kck

person ahochhaus    schedule 25.01.2012
comment
Спасибо за снимок экрана! Как бы то ни было, я не смог воспроизвести эту ошибку с помощью вашего теста. У меня IE8, Reader 10.1.1, и загрузка моего компьютера с частотой 1,6 ГГц заставила PDF-файл занять ~ 10 секунд, но он все равно загрузился. - person Scott Rippey; 25.01.2012
comment
Кроме того, когда у меня появляется серый экран, я могу нажать «Обновить», и он загрузится правильно. Что произойдет, если вы попробуете это сделать? - person Scott Rippey; 25.01.2012
comment
Хорошие идеи. Я вижу такое же поведение с небольшим файлом (первая загрузка работает, серый экран при второй загрузке). Когда у меня серый экран, нажатие кнопки «Обновить» успешно отображает PDF-файл. Если я закомментирую ActiveXObject, у меня не будет серого экрана (при первой загрузке, второй загрузке или обновлении). - person ahochhaus; 25.01.2012
comment
Я пробовал этот тестовый пример на нескольких разных версиях Adobe Reader. У меня не серый экран на 10.1.3 или 9.5.0. Однако я действительно получаю серый экран на 10.1.2 (каждый раз). Если у кого-то есть время, было бы полезно узнать, какие версии у других возникают проблемы с. - person ahochhaus; 26.04.2012

Я понимаю, что это довольно поздняя публикация, но все же возможное решение для OP. Я использую IE9 на Win 7, и в течение нескольких месяцев у меня возникали проблемы с серым экраном Adobe Reader при попытке открыть онлайн-банк pdf и выписки по кредитной карте. Я мог открывать все в Firefox или Opera, но не в IE. Я наконец попробовал PDF-Viewer, установил его как программу просмотра PDF по умолчанию в его настройках, и больше никаких проблем. Я уверен, что есть и другие бесплатные программы просмотра, такие как Foxit, PDF-Xchange и т. Д., Которые дадут лучшие результаты, чем Reader, с меньшей головной болью. Adobe похожа на некоторые другие крупные компании, которые разрабатывают программное обеспечение на основе принципа «взять или оставить» ... так что я оставил это.

person puterfx    schedule 16.06.2013
comment
Спасибо за информацию! Я уверен, что у многих людей был тот же опыт, что и у вас ... и я уверен, что большинство пользователей винят веб-сайт (а не Adobe). - person Scott Rippey; 20.06.2013

У нас возникала эта проблема даже после обновления до последней версии Adobe Reader.

Для нас эту проблему решили двумя разными способами:

  • Использование бесплатной версии приложения Foxit Reader вместо Adobe Reader
  • Но поскольку большинство наших клиентов используют Adobe Reader, вместо того, чтобы требовать от пользователей использования Foxit Reader, мы начали использовать window.open(url) для открытия pdf вместо window.location.href = url. Adobe по какой-то причине теряла дескриптор файла в разных фреймах, когда PDF-файл был открыт с использованием метода window.location.href.
person thecoolmacdude    schedule 04.09.2015