2009-06-24 7 views
1

Настройка атрибута src для IFrame для данных: application/pdf; base64, не работает для меня, любые идеи почему?Настройка атрибута src для IFrame для данных: 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 генерируется ServerSide. Причина, по которой я пытаюсь загрузить клиентские данные pdf, заключается в том, что я должен иметь клиентские данные PDF-файла, чтобы делать что-то еще, и я пытаюсь сократить количество экземпляров этих данных, создаваемых и зависающих.

Просто придерживайтесь вышеуказанного кода и разметки на простой веб-сайт одной страницы в VS2005 и вставьте любой старый pdf-файл в c: \ temp \, назовите его TestDoc.pdf и его следует скомпилировать и запустить.

В основном поведение, которое я получаю, ничто в iframe вообще.

Я использую IE7, так что это может быть проблемой. Я не знаю, потому что есть очень мало информации об использовании данных : application/pdf; base64 [base64 data] синтаксис вокруг.

ответ

-1

Насколько я знаю, IE не обрабатывает данные: схема URL вообще, поэтому, я думаю, он не знает, что передать в программу просмотра PDF. См. WP.

Приветствия,

+0

мудак! :( Ой хорошо сэкономит мне время на то, чтобы работать над ним. Спасибо за ответ. – 2009-06-25 12:06:35

+0

Возможно, вы могли бы использовать элемент < object/> и предоставить Acrobat данные в некотором < param/> элементах, но это только предположение. – Boldewyn

1

Это может быть липким ссылаться на википедию, но Wikipdia says, что могут быть какие-то ограничения, на которых FilesTypes вам разрешено использовать данные: тип файла; синтаксис base64 на. А именно, только картинки на данный момент. Спецификация IE9, говорится в статье, позволяет использовать ее более широко, но я не уверен, что именно это влечет за собой. В то же время вам просто нужно будет использовать файл .pdf, а не только его базовые 64 строковые данные.

0

этот путь работал для меня:

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