2009-06-24 6 views
1

Réglage de l'attribut src d'un IFrame aux données: application/pdf; base64, ne fonctionne pas pour moi, des idées pourquoi?Définition de l'attribut src d'un IFrame sur data: application/pdf; base64?

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

    } 

} 

devrais-je dire la différence dans cet exemple, dans l'application réelle, les données de pdf est généré Serverside. La raison pour laquelle je suis en train de charger le clientside de données pdf est que je dois avoir les données pdf octet clientside de toute façon à faire autre chose avec et je suis en train de réduire les cas de ces données générées et lançai autour. Il suffit de coller le code et le balisage ci-dessus dans un simple site Web d'une page dans VS2005 et de coller tout ancien pdf dans c: \ temp \, appelez-le TestDoc.pdf et il devrait compiler et exécuter.

Fondamentalement, le comportement que je reçois rien dans le iframe du tout.

J'utilise IE7 donc cela pourrait être un problème. Je ne sais pas car il y a peu d'informations précieuses sur l'utilisation des données : application/pdf; base64 [données base64] syntaxe autour. Je suppose, il ne sait pas schéma d'URL du tout, donc ce que pour passer à la visionneuse PDF:

Répondre

-1

Pour autant que je sache, IE ne gère pas les données. Voir WP.

Cheers,

+0

enculer! : Oh bien, ça me fait gagner du temps à essayer de travailler dessus –

+0

Peut-être pourriez-vous utiliser l'élément < object/> et donner à Acrobat les données dans un élément < param/>, mais c'est juste une supposition. – Boldewyn

1

Il peut être collante pour faire référence à wikipedia, mais Wikipdia says qu'il peut y avoir des restrictions sur lesquelles vous filestypes êtes autorisé à utiliser les données: filetype; syntaxe base64 sur. A savoir, seulement des images pour le moment. La spécification IE9, dit l'article, permet une utilisation plus large, mais je ne suis pas sûr de ce que cela implique. En attendant, il vous suffira d'utiliser le fichier .pdf et pas seulement les données de base de la chaîne 64.

0

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