Вопрос по pdf, base64, asp.net, iframe – Установка атрибута src IFrame для данных: application / pdf; base64?

1

Установка атрибута src IFrame для data: 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 создаются на стороне сервера. Причина, по которой я пытаюсь загрузить pdf-данные на стороне клиента, заключается в том, что мне все равно нужно иметь pdf-данные байтовых данных на стороне клиента, чтобы делать что-то еще, и я пытаюсь уменьшить количество случаев, когда эти данные генерируются и проверяются.

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

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

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

Ваш Ответ

3   ответа
1

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

-1

URL, поэтому, я полагаю, он не знает, что передавать в программу просмотра PDF. УвидетьWP.

Ура,

Возможно, вы могли бы использовать & lt; объект / & GT; элемент и дать Acrobat данные в некоторых & lt; пары / & GT; элемент, но это только предположение.
Мудак! :( Ну да ладно, я больше экономлю время, пытаясь поработать над этим. Спасибо за ответ.
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);

Похожие вопросы