【问题标题】:Dynamically Created PDF Not Embedding/Rendering Inline in 64-bit IE9 Window在 64 位 IE9 窗口中动态创建的 PDF 未嵌入/呈现内联
【发布时间】:2011-12-09 15:11:32
【问题描述】:

我们正在使用 Reporting Services 生成 PDF 报告,我们需要将其呈现到浏览器窗口并嵌入到浏览器中。我们已经这样做了很长时间,并且一直有效......直到 IE9。

在 IE6、IE7 和 IE8 中,我们从 Reporting Services 生成表示 PDF 报告的字节数组,然后将其二进制写入浏览器,一切正常。 PDF 显示嵌入在浏览器中。

在 IE9 中,我们尝试了同样的事情并且 PDF 没有嵌入到浏览器窗口中。浏览器窗口保持打开状态并且为空白/空,并且 PDF 在 Adob​​e Reader 中的单独窗口中打开。

这是我们代码的 sn-p:

try 
{ 
    // Set all the Reporting Services variables and parameters and render the report 
    // ... 
    byte[] result = rs.Render(format, devInfo, out extension, out mimeType, out encoding, out warnings, out streamIDs); 

    // Force the render out of the report to the browser 
    Response.Clear(); 
    Response.ClearContent(); 
    Response.ClearHeaders(); 
    Response.AppendHeader("content-length", result.Length.ToString()); 
    Response.AppendHeader("Pragma", "cache"); 
    Response.AppendHeader("Expires", "3600"); 
    Response.Buffer = true; 
    Response.Cache.SetCacheability(HttpCacheability.Private); 
    Response.CacheControl = "private"; 
    Response.Charset = System.Text.UTF8Encoding.UTF8.WebName; 
    Response.ContentEncoding = System.Text.UTF8Encoding.UTF8; 

    switch (outputformat) 
    { 
        case "PDF": 
            Response.AppendHeader("content-disposition", "inline; filename=report.pdf"); 
            Response.ContentType = "application/pdf"; 
            break; 
        default: 
            break; 
    } 

    Response.BinaryWrite(result); 
    Response.Flush(); 
    Response.Close(); 
    Response.End(); 
} 
catch (System.Exception ex) 
{ 
    // ... 
} 

我们可以做些什么来让 PDF 呈现并嵌入到 IE9 浏览器窗口中?

谢谢!

【问题讨论】:

  • 能否包含 acrobat reader 版本信息? (在 IE 6/7/8 boxen 和与 IE9 结合使用的 boxen 上)
  • 感谢林恩提供的信息。这很有帮助。我尝试了 Adob​​e Reader 版本 9.4.6 和 10.1.1(在两台不同的计算机上 - 都是 Windows Server 2008 R2,带有 IE9),两个版本的 Reader 都有同样的问题。该问题似乎源于使用 64 位版本的 IE9。使用 64 位版本的 IE9 时,PDF 在 Adob​​e Reader 应用程序中打开,而不是在浏览器窗口中打开。如果我们使用 32 位版本的 IE9,PDF 在浏览器窗口中打开,就像我们在以前版本的 IE 和 Adob​​e Reader 中一样。因此,需要注意的是,在这种情况下使用 32 位 IE。
  • 添加到我已经存在的答案中。您是通过 http 还是 https 发送?

标签: c# pdf 64-bit pdf-generation internet-explorer-9


【解决方案1】:

希望这可能对其他人有所帮助,我发现了一个使用 jquery 的 hack/workaround

function MyFunction(someprams) {
    if (navigator.userAgent.indexOf("x64") == -1) {
        window.open("yourpage2.aspx?PramName=PramVal, 'winowname', 'window opions here')
    } else {
        $.get("yourpage1.aspx", { PramName1: PramVal1, PramName1: PramVal1 },
          function(data) {
              $('#divid').html(data);
          });
    }
 }

那么只需在页面中添加一个 div :

yourpage1 是调用和流式传输 pdf 并设置缓存标头的页面

然后 yourpage2 是一个 aspx 页面,上面有一个 ifram,我动态设置了 src: iframeid.Attributes.Add("src", "yourpage1.aspx?"pram1=" & Request.QueryString("PramVal1") ) 注意 ifram 需要在服务器标签上运行,因为你可能希望它加载 ifram 高度 100%,你可以这样做 css:

html { height: 100%;}
body { height: 100%;}

html:

<iframe id="iframeid"  runat="server" scrolling="no" marginwidth="0" marginheight="0"
        frameborder="0" vspace="0" hspace="0" style="overflow: visible; width: 100%;
        height: 100%;"></iframe>

如果用户是 IE 32 位,那么这个剂量是多少,然后会打开一个新窗口,显示其中的 pdf(实际上是在一个框架中,但你不知道),或者如果他们是 IE 64,则完全跳过使用窗口并加载将 pdf 直接流式传输到我们的页面的页面。这会强制 adobe pdf 不是在浏览器窗口中打开,而是直接以 pdf 格式打开,所以所有这些都可以正常工作,并且在 64 和 32 IE 中看起来都不错

我确实发现流阅读器引起了问题,但这很好用,

Dim oWebClient As System.Net.WebClient = Nothing
Dim data() As Byte
try
 oWebClient = New System.Net.WebClient
 data = oWebClient.DownloadData(pdfurl)
//add Response.AddHeader stuff here e.g.
 Response.AddHeader("Content-Length", data.Length.ToString)
 Response.BinaryWrite(data)

【讨论】:

    【解决方案2】:

    Internet Explorer 64 位只能运行 64 位插件。 Adobe PDF 插件是 32 位的,无法在 64 位 IE 中运行。

    【讨论】:

      【解决方案3】:

      看看这个论坛帖子: http://forums.adobe.com/message/3331557#3331557#3331557

      此外,整个线程讨论了使不同版本的 IE 工作的不同修复。有多种因素会导致此问题。

      http://forums.adobe.com/thread/758489

      一位读者还指出,它必须以 PDF 结尾,看起来您正在这样做。

      请记住,如果您使用的是不同版本的 acrobat reader,这个问题实际上可能与 Reader 的变化有关,而不是 IE。


      在您的评论中,您提到了 64 位问题。查看这个关于 IE8/64bit vista 的 SO 答案:
      Can't display PDF from HTTPS in IE 8 (on 64-bit Vista)

      在他的最终答案中,您似乎已经在做他说他需要做的所有事情(即将缓存控制设置为私有,not 设置 Pragma: no-cache。)

      有趣的是,各种响应已经通过手动添加标题的方式:

      response.setHeader("Cache-Control","private");
      

      而不是调用

      Response.Cache.SetCacheability(HttpCacheability.Private);  
      Response.CacheControl = "private";
      

      不确定是否有区别,但可能值得一试。

      【讨论】:

      • 这对评论很有用.. 这是 adobe 的 kb 文章,他们真的让它听起来好像不支持。不确定这个 kb 是否是最新的:kb2.adobe.com/cps/328/328233.html
      【解决方案4】:

      请务必注意,实际上可以通过 Acrobat Reader 设置控制显示内联 PDF。

      在菜单Edit &gt; Preferences... 中,从左侧导航中选择Internet 并确保选中Display PDF in browser

      【讨论】:

        【解决方案5】:

        64位IE9似乎有bug;如果用于要显示的 PDF 文件的 outputStream 的文件扩展名是大写的,例如'myFile.PDF' 而不是像 'myFile.pdf' 这样的小写字母,outputStream 的 mimeType 未被识别为 application/pdf。它默认为 mimeType 文本。这种页面根本不渲染,或者部分渲染或者以一些不可读的字体渲染。尝试使用小写的 .pdf 文件扩展名,以防它是大写的。 祝你好运!

        【讨论】:

          猜你喜欢
          • 2019-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-07
          相关资源
          最近更新 更多