代码之家  ›  专栏  ›  技术社区  ›  Brandon Boone

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

  •  3
  • Brandon Boone  · 技术社区  · 14 年前

    编辑2

    似乎在Dom中移动object标记是问题的原因。我直接在页面上添加了一个iframe,它工作正常,没有任何问题。

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

    因此,似乎不再是关于我的处理程序的问题,而是关于为什么在DOM(位于iFrame中)中移动“object”(或embed)标记会导致它“空白”的问题

    此外,当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();
    

    如果在iframe上单击鼠标右键并刷新页面,则对象将正常加载。(如果使用嵌入标记,也是如此)。


    原始问题

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

    • IIS 5.1版
    • XP sp3版
    • 与2010年相比
    • 工业工程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(显示为模式弹出窗口)中使用时,这适用于每种文件类型(doc、txt、xls、html) 属于

    它唯一能起作用的是在发布为这些文件提供服务的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
    

    未尝试

    我没有尝试使用embed标记,因为如果可能的话,我希望使用iFrame(现有的基础设施使用它)。

    任何帮助都将不胜感激!!!

    4 回复  |  直到 7 年前
        1
  •  1
  •   Forgotten Semicolon adrianm    14 年前

    我遇到了一个类似的问题,当PDF通过SSL进行流式传输时(即仅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();
    
        2
  •  1
  •   Brandon Boone    14 年前

    所以我放弃了,决定用一个标准的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();
    }
    
        3
  •  0
  •   AJ.    14 年前

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

    否则,就有可能是有什么东西已经淹没了 application/pdf 客户端计算机上的CLSID。

        4
  •  0
  •   mattjgalloway    12 年前

    我能够解决一个类似的问题(模式窗口internet explorer内的pdf) 通过取出iframe。相反,将pdf加载到html对象元素中。 请参见下面的链接:

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

    总而言之:

    jqueryfloatbox,用iframe加载html片段,将aspx页面加载到iframe,将pdf加载到aspx页面

    在追加object元素之前,设置数据 aspx页面url的object元素属性