PDF文件在使用Adobe Reader 10.0和Internet Explorer打开时,用户会看到一个空白的灰色屏幕。如何为我的用户修复这个问题?

31
Internet Explorer(版本6、7、8、9)与Adobe Reader X(版本10.0.*)打开PDF存在已知问题。浏览器窗口加载一个空的灰色屏幕(甚至没有读者工具栏)。使用Firefox、Chrome或Adobe Reader 10.1.*可以完美地解决这个问题。
我已经发现了几个解决方法。例如,单击“刷新”会正确加载文档。升级到Adobe Reader 10.1.*,或降级到9.*也可以解决该问题。
然而,所有这些解决方案都要求用户自行解决。我的大多数用户看到这个灰色屏幕会感到非常困惑,并且会责怪PDF文件和网站出现问题。说实话,在我调查问题之前,我也责怪PDF文件!
所以,我正在尝试找出一种为我的用户解决此问题的方法。我考虑提供一个“下载PDF”链接(将Content-Disposition标头设置为附件而不是内联),但我的公司根本不喜欢这个解决方案,因为我们真的希望这些PDF文件在浏览器中显示。
有其他人遇到过这个问题吗?
有哪些可能的解决方案或解决方法?
我真的希望有一种对最终用户来说无缝的解决方案,因为我不能指望他们知道如何更改其Adobe Reader设置,或自动安装更新。
这里是可怕的灰屏:
编辑:截图已从文件服务器中删除! 抱歉!
该图像是一个带有常规工具栏的浏览器窗口,但是有着纯灰色背景,没有任何用户界面。
背景信息:
尽管我认为以下信息与我的问题无关,但我会将它包含在内供参考:
这是一个ASP.NET MVC应用程序,并且具有jQuery。
PDF文件链接具有target=_blank,以便在新窗口中打开。
PDF文件是动态生成的,并且所有内容标头都已适当设置。URL不包括.pdf扩展名,但我们确实使用有效的.pdf文件名和inline设置设置了content-disposition标头。
编辑:下面是我用来提供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);
    }
}

1
一般情况下,您无法保证最终用户的浏览器以任何特定方式打开PDF文档。不过,我理解您的问题,并认为这是一个有趣的问题。 - Pointy
你说得对...实际上,如果用户以任何其他方式打开PDF,它都可以正常工作!但是默认方式会导致问题,这就是我的问题所在。 - Scott Rippey
@mplungjan 感谢您的建议...我使用Fiddler来检查HTTP头,一切看起来都非常正确(Content-TypeContent-Disposition等)。整个文件也被流式传输了。由于问题可以通过“刷新”或更新Reader来解决,因此可以推断PDF文件和传输工作正常。 - Scott Rippey
2
就我所知,我曾经遇到过一个非常类似的问题。事实证明,我们在响应中同时发出了PDF文件和HTML。某些IE和Adobe Reader(我相信是X版本)的组合对此感到困扰。请确保您没有发出任何HTML。 - Aaron Daniels
3
有时IE需要尽可能多的帮助。 - mplungjan
显示剩余7条评论
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的偏好 - 例如,我个人喜欢将PDF文件在独立的Adobe Reader中打开,但被忽略了
  • 如果您没有安装/启用Adobe Reader插件,则无法使用此方法,因此我添加了一个"获取Adobe Reader"部分到HTML中,并提供了一个下载链接,该链接通常会被<object />标记完全隐藏,但是......
  • 在Internet Explorer中,如果插件加载失败,空对象仍将隐藏“获取Adobe Reader”部分,因此我不得不设置z-index来显示它......但是......
  • Google Chrome内置的PDF查看器也会在PDF文件之上显示“获取Adobe Reader”部分,因此我需要使用浏览器检测来确定是否显示“获取Reader”。

这是一长串的注意事项。我相信它涵盖了所有方面,但是我绝对不想将其应用于每个用户(其中大多数人没有问题)。
因此,我们决定仅在用户选择此选项时才使用嵌入式选项。在我们的PDF页面上,我们有一个部分写着“无法查看PDF文件?”,它可以让您更改设置为“嵌入式”,我们将该设置存储在一个cookie中。
在我们的GetPDF Action中,我们查找embed=true cookie。 这决定了我们是返回PDF文件还是返回带有嵌入式PDF的HTML视图。

呃,这比编写兼容IE6的JavaScript还要糟糕。
我希望其他遇到同样问题的人可以感到安慰,知道他们并不孤单!


我知道这很老了,但我尝试了你的“嵌入式pdf”解决方案,似乎有效。除了height="100%" width="100%"部分。它似乎不起作用,PDF没有显示高度。我也尝试了一些CSS,但是都没有起作用。 - Daniel Marín

3

我没有确切的解决方案,但我会分享我的经验,以帮助其他人。

通过测试,灰屏只会在较慢的机器上触发[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可能具有类似于closure-library中使用的插件检测代码。

[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 memory

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


非常感谢您如此详细地描述了您的问题!对我来说,这仍然是一个问题,并且我已经找到了几种复现它的方法。我将编写一个答案,描述我的当前解决方法,这可能也会对您有所帮助。 - Scott Rippey
另外,我刚刚有了一个快速的“似曾相识”的瞬间,我想你描述了一个我没有意识到的症状...PDF第一次正确加载,但是在所有后续的浏览器会话中不会再次加载。 我想我记得同样的行为。 - Scott Rippey
谢谢Scott,描述一下你的调试历史和当前的解决方法可能会非常有帮助。 - ahochhaus

1
我曾遇到这个问题。重新安装最新版本的Adobe Reader没有任何作用。Adobe Reader在Chrome中可以使用,但在IE中无法使用。这对我有用...
1)进入IE的“工具”->“兼容性视图”菜单。 2)输入一个包含所需PDF文件的网站。点击确定。 3)重新启动IE 4)转到您输入的网站并选择PDF。它应该出现。 5)返回兼容性视图并删除您创建的条目。 6)Adobe Reader现在在所有网站上都可以在IE中正常工作。
这是一个奇怪的修复方法,但对我有效。我需要在重新安装后通过Adobe接受屏幕,而此屏幕只在我执行了兼容性视图技巧后才出现。一旦接受,似乎就可以在任何地方使用。相当靠不住的东西。希望这能帮助某人。

1
谢谢,这可能有助于识别问题...也许“灰屏”是由应用程序尝试但未能显示首次运行消息引起的。然而,原始问题是从开发者的角度而不是用户的角度来看“如何修复此问题”。 - Scott Rippey

1
在我的情况下,解决方案非常简单。我添加了这个标题,浏览器在每次测试中都打开了该文件。 header('Content-Disposition: attachment; filename="filename.pdf"');

1

适用于Win7 Acrobat Pro X

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

提示:以下是我进行修复的顺序。

  1. 进入 控制面板 > 在每个标签页的 常规查看搜索 下,点击 恢复默认设置重置文件夹 按钮。

  2. 进入 Internet Explorer,在 工具 > 选项 > 高级选项 下,点击 重置(我不需要删除个人设置)。

  3. 打开 Acrobat Pro X,在 编辑 > 首选项 > 常规 中,选择页面底部的 默认PDF处理程序。我选择了 Adobe Pro X,然后点击 应用

你可能会被要求重新启动电脑(我需要)。

祝你好运!


1
感谢你的建议,但我认为你误解了问题所在…问题是那些试图查看这些PDF文件的人不懂电脑知识…他们不会更新应用程序,也不知道如何更改偏好设置,而且他们把责任推到我身上。所以我想找出如何从我的端解决他们的问题。 - Scott Rippey
我最近遇到了这个问题,这是我找到的唯一解决方法。我看到的行为是IE总是表现得好像没有安装Reader一样。因此,在我的页面上,有关如何安装Reader的说明中,我只需添加文本,说如果您已安装Reader,请执行上述第2步骤。 - Lane Goolsby

1

谢谢提供链接。虽然症状不完全相同,但我会尝试其中的一些解决方案,看看是否能解决我的问题。 - Scott Rippey

0

进行更多实验后,我发现我的应用程序(调用goog.userAgent.adobeReader)是通过在链接到PDF的页面上使用ActiveXObject访问Adobe Reader引起的。这个最小化的测试案例对我来说会导致灰色屏幕(但是删除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


感谢您的屏幕截图!就我所知,我无法在您的测试中重现该错误。我使用的是IE8,Reader 10.1.1,并且让我的1.6Ghz计算机“负载”使PDF花费了约10秒钟,但仍然加载。 - Scott Rippey
此外,当我遇到灰色屏幕时,我可以点击“刷新”按钮,它就能正常加载。您尝试这样做会发生什么? - Scott Rippey
好的想法。我看到小文件也有同样的行为(第一次加载正常,第二次加载灰色屏幕)。当我看到灰色屏幕时,按下刷新按钮可以成功显示PDF。如果我注释掉ActiveXObject,我就不会看到灰色屏幕(无论是第一次加载、第二次加载还是刷新)。 - ahochhaus
我在几个不同版本的Adobe Reader上尝试了这个测试用例。在10.1.3或9.5.0上,我没有看到灰色屏幕。然而,在10.1.2上,每次都会出现灰色屏幕。如果有人有时间,了解其他版本(ftp://ftp.adobe.com/pub/adobe/reader/win/10.x/)存在问题可能会很有帮助。 - ahochhaus

0

即使更新到最新的Adobe Reader版本,我们仍然遇到了这个问题。

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

  • 使用免费版本的Foxit Reader应用程序代替Adobe Reader
  • 但是,由于我们的大多数客户使用Adobe Reader,所以我们开始使用window.open(url)打开pdf文件,而不是window.location.href = url。当使用window.location.href方法打开pdf时,由于某些原因,Adobe在不同的iframe中丢失了文件句柄。

0

我意识到这是一个相当晚的帖子,但仍然是OP的一种可能解决方案。我在Win 7上使用IE9,在尝试在线打开pdf银行和信用卡对账单时已经遇到Adobe Reader的灰屏问题数个月。我可以在Firefox或Opera中打开所有东西,但不能在IE中打开。最后我尝试了PDF-Viewer,并将其设置为默认的pdf查看器,避免了问题。我相信还有其他免费的查看器,如Foxit、PDF-Xchange等,会比Reader提供更好的结果,让人少些头痛。Adobe就像其他一些大公司一样,是按照接受或离开的方式开发软件的...所以我选择了离开。


谢谢提供信息!我相信很多人都有和你一样的经历...而且我敢打赌大多数用户会把责任归咎于网站(而不是Adobe)。 - Scott Rippey

0

嗯,这样做可能行吗:

第一次用户打开PDF时,使用JavaScript制作一个弹出窗口,基本上说“如果您无法看到文档,请单击此处”。将“此处”设置为一个大按钮,其中将向用户解释问题。还要创建另一个按钮“一切正常”。如果用户单击此按钮,则会记住它,因此在未来不会显示。

我试图变得实际。为了小部分Adobe Reader版本的问题而费尽心思地“正确”解决这种问题对我来说听起来并不是很有效率。


Acrobat Reader X或10在所有IE版本中都不会成为一个小子集。 - mplungjan
@darioo 我同意,为了解决一个小问题而创建一个巨大的修复程序并不是很实际。希望随着人们更新阅读器,这个问题会逐渐减少。然而,它目前影响了许多用户,并且对他们产生了重大影响。我真的希望有一个“适当”的解决方案——“适当”意味着用户对问题毫不知情。 - Scott Rippey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接