模态iframe中的PDF在IE中呈现空白

时间:2010-09-17 17:25:58

标签: c# internet-explorer pdf iframe simplemodal

编辑2

似乎在Dom中移动对象标签是导致问题的原因。我直接在页面上添加了一个iframe,它没有任何问题。

但是,当我将iFrame移动到模式对话框(http://www.ericmmartin.com/projects/simplemodal/)时,PDF会消失(对象标签不再正确呈现)。

所以它似乎不再是关于我的处理程序的问题,而是更多关于为什么在DOM(生活在iFrame中)中移动“对象”(或嵌入)标记的问题导致它“空白”。 “

此外,当pdf从模态对话框移回其原始位置时,它会正确显示。所以,也许我应该更多地关注模态对话本身。

想法?感谢您的建议。


编辑1

所以我对测试做了一些修改。

我有iframe输出pdf请求的对象标记以及服务器时间。

Response.AddHeader("content-type", "text/html");
WebClient client = new WebClient();
Response.Write("<html><head></head><body><h1>"+ DateTime.Now.ToString() + "</h1><object height='100%' width='100%' name='plugin' data='" + Request.Url.ToString() + "&embed=true' type='application/pdf' /></body></html>");
Response.Flush();
Response.Close();
Response.End();

现在我正确地获得了一个包含当前时间的页面,但该对象仅在我发布aspx页面后第一次显示PDF。所以它似乎是某种缓存问题?除了对象没有加载任何东西(甚至不是以前加载的PDF)。

如果右键单击iframe并刷新页面,则对象加载正常。 (如果我使用embed标签也是如此)。


原始问题

我知道有很多问题......

但他们要么没有回答,要么答案没有用。

环境

  • .Net 4
  • Adob​​e 9.3.4
  • IIS 5.1
  • XP sp3
  • VS 2010
  • IE 8.0.6001.18702

背景

我正在流式传输的pdf来自存储库,其中的文件没有任何扩展(这是为了安全起见)。我在数据库中查找文件,并通过以下代码将其传回客户端:

Response.Clear();
WebClient client = new WebClient();
Byte[] buffer = client.DownloadData(sPath);
Response.AddHeader("content-length", buffer.Length.ToString());
Response.AddHeader("content-disposition", "inline;filename=" + fileName);
Response.AddHeader("expires", "0");
Response.AddHeader("Content-Type", "application/pdf"); //this is usually dynamic to support other types (doc, xls, txt, etc.)
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
Response.Close();
Response.End();

当直接在浏览器或iframe(显示为模式弹出窗口)中使用 pdf 异常时,这适用于每种文件类型(doc,txt,xls,html) 文件。通过iframe访问时它们无法可靠地工作,但在浏览器中直接访问时工作正常。

它唯一有效的工作是我在发布提供这些文件的aspx页面后第一次请求文档。所有后续命中都会返回一个空白页面(即使是新选项卡或浏览器窗口)。无论如何, Firefox每次都可靠地显示pdf。

尝试解决方案

我尝试了各种流媒体文件:

Response.TransmitFile(sPath);
Response.WriteFile(sPath);
//As well as some others

我尝试在请求结尾处的参数中添加.pdf

http://www.myurl.aspx?File=test.pdf

我尝试通过添加时间戳

来使URL唯一
http://www.myurl.aspx?File=test.pdf&Unique=Friday__September_17__2010_12_02_16_PM

取消尝试

我读过有关IIS压缩导致问题的内容,但它是针对较新版本的IIS。

没有尝试使用embed标签,因为我想尽可能坚持iFrame(现有的基础设施使用它)。

非常感谢任何帮助!!!

感谢。

4 个答案:

答案 0 :(得分:1)

我遇到类似的问题,当PDF通过SSL流式传输时(仅IE浏览器,FF没有出现问题)只能通过以下方式解决:

Response.ClearHeaders();
Response.ClearContent();
Response.Buffer = true;

Response.AppendHeader("Content-Disposition", "inline; attachment; filename=Filename.pdf");
Response.ContentType = "application/pdf";

Response.WriteFile(path);

Response.Flush();
Response.End();

答案 1 :(得分:1)

所以我放弃了,决定使用标准的IE弹出窗口。

window.open(URL, 'Window', 'height=' + pageHeight + ',width=' + pageWidth + ',top=0,left=0,resizable');

我必须在一个对象标签中呈现pdf,然后在弹出窗口内的iframe内的所有其他内容才能生效,但它可以工作......

if (sDocType == "pdf")
{
    Response.AddHeader("content-type", "text/html");
    WebClient client = new WebClient();
    Response.Write("<html style='margin:0px;padding:0px;'><head></head><body style='margin:0px;padding:0px;'><object height='100%' width='100%' name='plugin' data='" + Request.Url.ToString() + "&embed=true' type='" + zGetContentType(HttpContext.Current.Request.QueryString["docType"]) + "'><param name='src' value='" + Request.Url.ToString() + "&embed=true' />alt : <a href='" + Request.Url.ToString() + "&embed=true'>View</a></object></body></html>");
    Response.Flush();
    Response.Close();
    Response.End();
}
else
{
    Response.AddHeader("content-type", "text/html");
    WebClient client = new WebClient();
    Response.Write("<html style='margin:0px;padding:0px;'><head></head><body style='margin:0px;padding:0px;'><iframe frameborder='0' scrolling='no' height='100%' width='100%' src='" + Request.Url.ToString() + "&embed=true' /></body></html>");
    Response.Flush();
    Response.Close();
    Response.End();
}

答案 2 :(得分:0)

我不确定您是否需要设置文件名,特别是如果它没有.pdf扩展名。在过去将PDF格式化为浏览器时,我总是使用此代码:

Response.Clear();
Response.ContentType = "application/pdf";
Response.BinaryWrite(pdfBuffer);
Response.Flush();

否则,客户端计算机上的application/pdf CLSID的注册表设置可能会出现问题。

答案 3 :(得分:0)

我能够解决类似的问题(模式窗口Internet Explorer中的pdf) 取出iframe。而是将pdf加载到html对象元素中。 请参阅以下链接:

http://intranation.com/test-cases/object-vs-iframe/

总结一下: 设置不起作用:

jQuery floatbox,使用iframe加载html片段,将aspx页面加载到iframe,将pdf加载到aspx页面

现在可以使用的设置:

jQuery floatbox,加载html片段,追加对象元素。 在追加对象元素之前,设置数据 object元素的属性到aspx页面url