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