Frage

Einstellen des src-Attribut eines IFrame auf Daten: application / pdf; base64, arbeitet nicht für mich, irgendwelche Ideen, warum

Hier ist die ASPX-Markup

<%@ 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>

und hier ist der Code hinter:

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

    }

}

soll ich sagen, anders als in diesem Beispiel in der realen Anwendung, die PDF-Daten serverseitig erzeugt werden. Der Grund, warum ich versuche, die pdf-Daten client zu laden ist, ich habe die pdf-Byte-Daten client habe sowieso etwas anderes zu tun, und ich versuche Instanzen dieser Daten zu reduzieren, erzeugt und aufgespannt um.

Sie einfach den oben genannten Code-Stick und Markup in eine einfache Website eine Seite in VS2005 und halten alle alten pdf in c. \ Temp \, nennen es TestDoc.pdf und es sollte kompilieren und ausführen

Grundsätzlich ist das Verhalten, das ich bin immer ist nichts in der iframe überhaupt.

Ich verwende IE7 so könnte das ein Problem sein. Ich weiß nicht, da gibt es sehr wenig Informationen über die Verwendung des Daten:. Application / pdf; base64 [Base64 Daten] Syntax um

War es hilfreich?

Lösung

Soweit ich weiß, IE behandelt nicht die Daten: URL-Schema überhaupt, so dass ich denke, es weiß nicht, was mit dem PDF-Viewer zu übergeben. Siehe WP .

Cheers,

Andere Tipps

Es kann klebrig sein wikipedia zu verweisen, aber Wikipdia sagt , dass es auf einige Einschränkungen sein kann die filestypes Sie dürfen die Daten verwenden: Dateityp; base64 Syntax auf. Das heißt, nur Bilder für jetzt. Der IE9 spec, der Artikel sagt, ermöglicht eine breitere Verwendung, aber ich bin nicht sicher, was genau das bedeutet. In der Zwischenzeit werden Sie nur die PDF-Datei verwenden müssen, und nicht nur dann ist es Basis 64 String-Daten.

Auf diese Weise arbeitet für mich:

var oldsrc = $('.content-control-iframe').attr('src');
var newsrc = $('.content-control-iframe').attr('src').slice(8);
$('.content-control-iframe[src="'+oldsrc+'"]').attr('src', newsrc);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top