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

Существует известная проблема с открытием 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);
    }
}

Ответы [ 10 ]

30 голосов
/ 25 января 2012

Прошло 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Поэтому я добавил раздел «Get Adobe Reader» в html и ссылку для загрузки файла, который обычно полностью скрывается тегом <object />, ... но ...
  • В ИнтернетеПроводник, если плагин не загружается, пустой объект все равно будет скрывать раздел «Get Adobe Reader», поэтому мне пришлось установить z-index, чтобы показать его ... но ...
  • Google Chrome'sвстроенный просмотрщик PDF также отображает раздел «Get Adobe Reader» поверх PDF, поэтому мне пришлось выполнить обнаружение браузера, чтобы определить, показывать ли «Get Reader».

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

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

3 голосов
/ 24 января 2012

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

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

1 голос
/ 26 мая 2014

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

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

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

1 голос
/ 23 сентября 2013

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

1 голос
/ 01 октября 2012

Для 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.

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

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

1 голос
/ 01 октября 2011

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

0 голосов
/ 04 сентября 2015

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

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

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

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

0 голосов
/ 25 января 2012

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

0 голосов
/ 28 сентября 2011

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

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

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

...