【问题标题】:Setting the src attribute of an IFrame to data:application/pdf;base64?将 IFrame 的 src 属性设置为 data:application/pdf;base64?
【发布时间】:2010-11-05 13:15:10
【问题描述】:

将 IFrame 的 src 属性设置为 data:application/pdf;base64,对我不起作用,有什么想法吗?

这是 .aspx 标记

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <script type="text/javascript">
        function loadIFrameFromHiddenField()
        {         
            //get the node containing the base64 pdf data from the xml in the hidden field
            var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.loadXML(document.getElementById("pdfData").value);                    
            xmlDoc.setProperty('SelectionLanguage', 'XPath');
            var pdfDataNode = xmlDoc.selectSingleNode("//PDF");

            //if we've got the node
            if (pdfDataNode != null) 
            {
                //get the data and append it to the src contents 
                var pdfIFrameSrc = "data:application/pdf;base64," + pdfDataNode.text;
                //set the src attribute
                document.getElementById("pdfIFrame").setAttribute("src", pdfIFrameSrc);
            }            
        }
    </script>
</head>
<body>
    <form id="form1" runat="server" style="width:100%;height:100%;">
        <asp:HiddenField ID="pdfData" runat="server" /> 
        <div style="width:100%;height:80%;"> 
            <iframe id="pdfIFrame" runat="server" scrolling="auto" frameborder="0" marginheight="0" marginwidth="0" style="height:99.5%;width:99.5%" />            
        </div>
    </form>
</body>
</html>

下面是代码:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Text;
using System.Xml;
public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {

        //get the bytes from our PDF
        Byte[] pdfBytes = File.ReadAllBytes("c:\\temp\\Test.pdf");

        //build xml containiing our base64 encoded pdf data and put it in hidden field
        pdfData.Value = buildDocumentXML(pdfBytes, "TestDoc");

        //call js function to add the src to the iframe
        String scriptText = "<script type='text/javascript'>loadIFrameFromHiddenField()</script>";
        ClientScript.RegisterStartupScript(this.GetType(), "loadIFrameFromHiddenField", scriptText);
    }

    private string buildDocumentXML(Byte[] pdfBytes, string documentName) 
    {

        StringBuilder documentsString = new StringBuilder();
        XmlWriterSettings documentsXmlSettings = new XmlWriterSettings();

        documentsXmlSettings.Indent = false;            
        documentsXmlSettings.OmitXmlDeclaration = true;
        documentsXmlSettings.ConformanceLevel = ConformanceLevel.Fragment;
        documentsXmlSettings.NewLineHandling = NewLineHandling.None;

        using (XmlWriter documentsXmlWriter = XmlWriter.Create(documentsString, documentsXmlSettings))
        {

            documentsXmlWriter.WriteStartElement("DOCUMENTS");

            documentsXmlWriter.WriteStartElement("FILENAME");
            documentsXmlWriter.WriteString(documentName);
            documentsXmlWriter.WriteEndElement();

            documentsXmlWriter.WriteStartElement("PDF");


            documentsXmlWriter.WriteBase64(pdfBytes, 0, pdfBytes.Length);


            documentsXmlWriter.WriteEndElement();



            documentsXmlWriter.WriteEndElement();
        }



        return documentsString.ToString();

    }

}

我应该说不像这个例子,在真正的应用程序中,pdf数据是在服务器端生成的。我尝试加载 pdf 数据客户端的原因是无论如何我都必须拥有 pdf 字节数据客户端才能做其他事情,并且我正在尝试减少生成和丢弃这些数据的实例。

只需将上述代码和标记粘贴到 VS2005 中的一个简单的单页网站中,并将任何旧 pdf 粘贴到 c:\temp\ 中,将其命名为 TestDoc.pdf,它应该可以编译并运行。

基本上我得到的行为在 iframe 中根本没有。

我使用的是 IE7,所以这可能是个问题。我不知道,因为关于使用 data:application/pdf;base64[base64 data] 语法的宝贵信息很少。

【问题讨论】:

    标签: asp.net pdf iframe base64


    【解决方案1】:

    参考维基百科可能有点俗气,但Wikipdia says 可能对允许使用 data:filetype;base64 语法的文件类型有一些限制。也就是说,暂时只有图片。文章说,IE9 规范允许更广泛的使用,但我不确定这究竟意味着什么。同时,您只需要使用 .pdf 文件,而不仅仅是它的 base 64 字符串数据。

    【讨论】:

      【解决方案2】:

      这种方式对我有用:

      var oldsrc = $('.content-control-iframe').attr('src');
      var newsrc = $('.content-control-iframe').attr('src').slice(8);
      $('.content-control-iframe[src="'+oldsrc+'"]').attr('src', newsrc);
      

      【讨论】:

        【解决方案3】:

        据我所知,IE 根本不处理 data: URL 方案,所以我猜它不知道将什么传递给 PDF 查看器。见WP

        干杯,

        【讨论】:

        • 混蛋! :( 哦,这节省了我更多的时间尝试工作。感谢您的回答。
        • 也许您可以使用 元素并在某个 元素中为 Acrobat 提供数据,但这只是猜测。
        猜你喜欢
        • 2011-11-24
        • 2016-12-13
        • 1970-01-01
        • 2015-04-30
        • 1970-01-01
        • 2014-05-16
        • 2015-06-22
        • 2017-03-26
        • 1970-01-01
        相关资源
        最近更新 更多