Подтвердить что ты не робот

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);
    }
}
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Из моего тестирования серый экран запускается только на более медленных машинах [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

Ответ 3

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

Ответ 4

Для Win7 Acrobat Pro X

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

FYI: Ниже приведен порядок, в котором я прошел ремонт.

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

  • Перейдите к Internet Explorer, Tools > Options > Advanced > Reset (мне не нужно было удалять личные настройки)

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

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

Мы получили эту проблему даже после обновления до последней версии Adobe Reader.

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

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