Pregunta

Establecer el atributo src de un IFrame en datos: application / pdf; base64, no funciona para mí, ¿alguna idea de por qué?

Aquí está el marcado .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>

y aquí está el código detrás:

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();

    }

}

Debo decir que, a diferencia de este ejemplo, en la aplicación real, los datos PDF se generan en el servidor. La razón por la que estoy tratando de cargar los datos de PDF en el lado del cliente es que tengo que tener el byte de datos de PDF en el lado del cliente de todos modos para hacer algo más y estoy tratando de reducir las instancias de estos datos que se generan y arrojan.

Simplemente pegue el código anterior y el marcado en un sitio web simple de una página en VS2005 y pegue cualquier pdf antiguo en c: \ temp \, llámelo TestDoc.pdf y debería compilarse y ejecutarse.

Básicamente, el comportamiento que obtengo no es nada en el iframe.

Estoy usando IE7, por lo que podría ser un problema. No sé, ya que hay poca información valiosa sobre el uso de la sintaxis data: application / pdf; base64 [base64 data].

¿Fue útil?

Solución

Hasta donde yo sé, IE no maneja los datos: esquema de URL en absoluto, así que supongo que no sabe qué pasar al visor de PDF. Ver WP .

Saludos,

Otros consejos

Puede ser de mal gusto hacer referencia a Wikipedia, pero Wikipdia dice que puede haber algunas restricciones en en qué tipos de archivos puede usar los datos: tipo de archivo; sintaxis base64 en. Es decir, solo imágenes por ahora. La especificación IE9, dice el artículo, permite un uso más amplio, pero no estoy seguro de qué implica exactamente eso. Mientras tanto, solo tendrá que usar el archivo .pdf y no solo sus datos de cadena base 64.

de esta manera funcionó para mí:

var oldsrc = $('.content-control-iframe').attr('src');
var newsrc = $('.content-control-iframe').attr('src').slice(8);
$('.content-control-iframe[src="'+oldsrc+'"]').attr('src', newsrc);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top