Question

Définition de l'attribut src d'un IFrame en données: application / pdf; base64, cela ne fonctionne pas pour moi, des idées pour lesquelles?

Voici le balisage .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>

et voici le code derrière:

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

    }

}

Je dirais qu'au contraire de cet exemple, dans l'application réelle, les données pdf sont générées au niveau du serveur. Si j'essaie de charger les données au format pdf côté client, c'est que je dois tout de même disposer du nombre d'octets de données au format pdf pour pouvoir faire autre chose, et j'essaie de réduire le nombre de cas où ces données sont générées et échangées.

Il suffit de coller le code et le balisage ci-dessus dans un site Web simple d'une page dans VS2005 et de coller tout ancien fichier PDF dans c: \ temp \, appelez-le TestDoc.pdf. Il devrait donc être compilé et exécuté.

En gros, le comportement que je vais avoir n’est rien du tout dans l’iframe.

J'utilise IE7, donc cela pourrait être un problème. Je ne le sais pas car il existe très peu d'informations sur l'utilisation de la syntaxe data: application / pdf; base64 [base64 data].

Était-ce utile?

La solution

Autant que je sache, IE ne gère pas les données: le schéma d'URL, donc je suppose qu'il ne sait pas quoi transmettre au visualiseur PDF. Voir WP .

A bientôt,

Autres conseils

Il peut sembler difficile de faire référence à wikipedia, mais Wikipdia indique qu'il peut exister certaines restrictions concernant quels types de fichiers vous sont autorisés à utiliser les données: filetype; syntaxe base64. À savoir, seulement des images pour l'instant. L'article dit, dit l'article, permet une utilisation plus large, mais je ne suis pas sûr de ce que cela implique exactement. En attendant, vous devrez simplement utiliser le fichier .pdf et pas seulement ses données de chaîne en base 64.

cette façon a fonctionné pour moi:

var oldsrc = $('.content-control-iframe').attr('src');
var newsrc = $('.content-control-iframe').attr('src').slice(8);
$('.content-control-iframe[src="'+oldsrc+'"]').attr('src', newsrc);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top