31

使用 Adob​​e Reader X(版本 10.0.*)在 Internet Explorer(v 6、7、8、9)中打开 PDF 时存在一个已知问题。浏览器窗口加载一个空的灰色屏幕(甚至没有阅读器工具栏)。它与 Firefox、Chrome 或 Adob​​e Reader 10.1.* 完美配合。

我发现了几种解决方法。例如,点击“刷新”将正确加载文档。升级到 Adob​​e Reader 10.1.* 或降级到 9.* 也可以解决此问题。
但是,所有这些解决方案都需要用户自己弄清楚。我的大多数用户在看到这个灰屏时都会感到非常困惑,并最终将其归咎于 PDF 文件并归咎于网站被破坏。老实说,在我研究这个问题之前,我也把责任归咎于 PDF!

因此,我正在尝试找出一种方法来为我的用户解决此问题。
我考虑过提供“下载 PDF”链接(将Content-Disposition标题设置为attachment而不是inline),但我的公司根本不喜欢该解决方案,因为我们真的希望这些 PDF 文件显示在浏览器中。

有没有其他人遇到过这个问题?

有哪些可能的解决方案或解决方法?

我真的希望有一个对最终用户无缝的解决方案,因为我不能依赖他们知道如何更改他们的 Adob​​e Reader 设置或自动安装更新。

这是可怕的灰屏:
编辑:屏幕截图已从文件服务器中删除!对不起!
图像是一个浏览器窗口,带有常规的工具栏,但背景是纯灰色,没有任何 UI。

背景信息
虽然我认为以下信息与我的问题无关,但我将其包括在内以供参考:
这是一个 ASP.NET MVC 应用程序,并且有 jQuery 可用。
PDF 文件的链接已target=_blank在新窗口中打开。
PDF 文件正在即时生成,并且所有内容标题都已正确设置。URL 不包含.pdf扩展名,但我们确实content-disposition使用有效的.pdf文件名和inline设置设置了标题。

编辑:这是我用来提供 PDF 文件的源代码。

一、Controller Action:

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

10 回答 10

31

问这个问题已经4个月了,我仍然没有找到一个好的解决方案。
但是,我确实找到了一个不错的解决方法,如果其他人有同样的问题,我会分享。
如果我取得进一步的进展,我也会尝试更新这个答案。

首先,我的研究表明,用户设置和站点设置的几种可能组合会导致各种 PDF 显示问题。这些包括:

  • Adobe Reader 的损坏版本 (10.0.*)
  • 带有 Internet Explorer 和默认设置“不将加密文件保存到磁盘”的 HTTPS 站点
  • Adobe Reader 设置 - 禁用“在我的浏览器中显示 PDF 文件”
  • 缓慢的硬件(感谢@ahochhaus)

我花了一些时间在pdfobject.com研究 PDF 显示选项,这是一个极好的资源,我学到了很多东西。

我想出的解决方法是将 PDF 文件嵌入到一个空的 HTML 页面中。这很简单: 在 pdfobject.com 上查看一些类似的示例

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

但是,这里有一个警告列表:

  • 这会忽略 PDF 的所有用户首选项 - 例如,我个人喜欢在独立的 Adob​​e Reader 中打开 PDF,但这被忽略了
  • 如果您没有安装/启用 Adob​​e Reader 插件,这将不起作用,因此我在 html 中添加了“获取 Adob​​e Reader”部分,以及下载文件的链接,该文件通常被<object />标签完全隐藏, ... 但 ...
  • 在 Internet Explorer 中,如果插件加载失败,空对象仍然会隐藏“获取 Adob​​e Reader”部分,所以我不得不设置z-index显示它......但是......
  • Google Chrome 的内置 PDF 查看器还在 PDF顶部显示“获取 Adob​​e Reader”部分,因此我必须进行浏览器检测以确定是否显示“获取阅读器”。

这是一个巨大的警告清单。我相信它涵盖了所有基础,但我绝对不愿意将其应用于每个用户(其中​​大多数人没有问题)。
因此,我们决定仅embedded在用户选择加入时才执行此选项。在我们的 PDF 页面上,我们有一个部分显示“查看 PDF 时遇到问题?”,它允许您将设置更改为“嵌入”,我们将该设置存储在 cookie 中。
在我们的GetPDFAction 中,我们寻找embed=truecookie。这决定了我们是返回 PDF 文件,还是返回带有嵌入 PDF 的 HTML 视图。

啊。这甚至比编写兼容 IE6 的 JavaScript 更有趣。
我希望其他有同样问题的人知道他们并不孤单,可以找到安慰!

于 2012-01-24T20:27:57.907 回答
3

我没有确切的解决方案,但我会发布我的经验,以防他们帮助其他人。

根据我的测试,灰屏仅在较慢的机器上触发 [1]。迄今为止,我还无法在较新的硬件上重新创建它 [2]。我所有的测试都是在 IE8 中使用 Adob​​e 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 的哪个特定部分触发了 Adob​​e Reader 中的错误,但 jquery 可能具有与闭包库中使用的类似的插件检测代码。

[1] 机器出现灰屏:
Win Server '03 SP3
AMD Sempron 2400+ at 1.6GHz
256MB memory

[2] 机器未出现灰屏:
Win XP x64 SP2
AMD Athlon II X4 620 at 2.6 GHz
4GB 内存

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

于 2012-01-24T17:58:11.103 回答
1

适用于 Win7 Acrobat Pro X

由于我在没有重新检查之后问题是否仍然存在的情况下完成了所有这些操作,因此我不确定其中哪一个实际上解决了问题,但其中一个确实解决了问题。事实上,在执行 #3 并重新启动后,它工作得很好。

仅供参考:以下是我逐步完成维修的顺序。

  1. 转到Control Panel每个下的 > 文件夹选项GeneralViewSearch选项卡单击Restore Defaults按钮和Reset Folders按钮

  2. 转到Internet ExplorerTools>>> Options(我不需要删除个人设置AdvancedReset

  3. 打开Acrobat Pro X,在Edit>>下Preferences。 在页面底部选择。我选择了,然后单击。General
    Default PDF HandlerAdobe Pro XApply

您可能会被要求重新启动(我这样做了)。

最好的祝愿

于 2012-09-30T20:00:03.993 回答
1

我在 MVC1 首次发布时遇到了这个问题。有关Cache-Control 标头,请参阅生成 PDF、IE 和 HTTPS 错误。

于 2011-10-01T00:17:05.110 回答
1

就我而言,解决方案非常简单。我添加了此标头,浏览器在每次测试中都打开了该文件。header('Content-Disposition: attachment; filename="filename.pdf"');

于 2013-09-23T07:32:11.167 回答
1

我有这个问题。重新安装最新版本的 Adob​​e Reader 没有任何效果。Adobe Reader 在 Chrome 中工作,但在 IE 中不工作。这对我有用...

1) 进入 IE 的工具-->兼容性视图菜单。
2) 输入包含您希望查看的 PDF 的网站。单击确定。
3) 重新启动 IE 4) 转到您输入的网站并选择 PDF。它应该出现。
5) 返回兼容性视图并删除您所做的条目。
6) Adob​​e Reader 现在可以在所有网站的 IE 中正常工作。

这是一个奇怪的修复,但它对我有用。重新安装后,我需要通过 Adob​​e 接受屏幕,该屏幕仅在我执行兼容性视图技巧后出现。一旦被接受,它似乎无处不在。很脆的东西。希望这可以帮助某人。

于 2014-05-26T01:59:51.657 回答
0

嗯,是否可以简单地这样做:

当您的用户第一次使用 Javascript 打开 pdf 时,您会弹出一个基本上说“如果您看不到您的文档,请单击此处”的弹出窗口。让“这里”成为一个大按钮,它将向您的用户解释问题所在。还要制作另一个按钮“一切都很好”。如果用户点击了这个,你会记住它,所以以后不会显示。

我试图变得实用。竭尽全力尝试为一小部分 Adob​​e Reader 版本“正确”解决此类问题对我来说听起来不是很有成效。

于 2011-09-28T19:56:36.520 回答
0

进行更多实验后,我的应用程序(调用 goog.userAgent.adobeReader)中的根本原因是通过页面上的 ActiveXObject 访问 Adob​​e Reader,并带有 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

于 2012-01-25T00:36:48.480 回答
0

我意识到这是一个相当晚的帖子,但仍然是 OP 的可能解决方案。我在 Win 7 上使用 IE9,并且在尝试在线打开 pdf 银行和信用卡对帐单时遇到 Adob​​e Reader 的灰屏问题已有几个月了。我可以在 Firefox 或 Opera 中打开所有内容,但不能在 IE 中打开。我终于尝试了 PDF-Viewer,在其首选项中将其设置为默认的 pdf 查看器,没有更多问题。我敢肯定还有其他免费的查看器,例如 Foxit、PDF-Xchange 等,它们会比 Reader 提供更好的结果,而且不会让人头疼。Adobe 就像其他一些以接受或离开为基础开发软件的大公司......所以我离开了它。

于 2013-06-16T11:34:15.190 回答
0

即使更新到最新的 Adob​​e Reader 版本,我们也遇到了这个问题。

两种不同的方法为我们解决了这个问题:

  • 使用免费版 Foxit Reader 应用程序代替 Adob​​e Reader
  • 但是,由于我们的大多数客户都使用 Adob​​e Reader,所以我们没有要求用户使用 Foxit Reader,而是开始使用window.open(url)打开 pdf 而不是window.location.href = url. window.location.href当使用该方法打开 pdf 时,由于某种原因,Adobe 在不同的 iframe 中丢失了文件句柄。
于 2015-09-04T15:53:31.860 回答