Extjs - 在javascript中显示来自字节数组的PDF

时间:2013-07-16 11:17:10

标签: javascript extjs internet-explorer-9 extjs-mvc extjs4.2

首先,有两件事:

  • 我知道,有很多类似的问题,但没有一个能帮我找到问题的解决方案
  • 我是初学者 - 在编程的每一个方面......

问题: 从Web服务接收字节数组,我需要在Internet Explorer 9中显示PDF。 以下代码在Chrome中运行,但在IE9中,我收到的只是一个深灰色面板,其中 PDF很有用。

Ext.define('Ext.ux.form.DocumentFrame', {
extend: 'Ext.container.Container',
alias: 'widget.documentframe',
layout: 'hbox',
initComponent: function () {
    var me = this;
    var binaryData = me.value.DocumentData;
    var source = 'data:application/pdf;base64,' + (binaryData);

    Ext.applyIf(me, {
        items: [
                {
                xtype: 'box',
                itemId: 'panel-document-frame',
                width: 600,
                height: 600,
                autoEl: {
                    tag: 'object',
                    width: '100%',
                    height: '100%',
                    type: 'application/pdf',
                    data: source
                }
            }
        ]
    });
    me.callParent(arguments);
}
});
  • MIME-Type是否有问题?
  • 我是否必须对字节数组进行编码或解码?
  • 我是否在尝试在IE9上使用数据URI for PDF时出错?

我只是不明白为什么这在其他浏览器中有效,但在IE9中却没有,特别是在提供存储的PDF文件的路径时没有任何问题(即使在IE9中)。 我这样做是通过设置autoEl的data-parameter,如下所示:

data: 'content/files/Designer.pdf'

注意:通过在IE9中执行此操作,将出现一个MessageBox:“此页面上的Active X Control可能不安全,无法与本页的其他部分交互”。在那一刻,我不在乎这个。

尝试从字节数组中显示PDF时,我是错误的吗?我真的坚持这个,任何帮助都会受到高度赞赏!

提前谢谢!

-edit -

binaryData可能是变量的错误或恼人的名称。据我所知,这是一个字节数组,看起来像:

  

JVBERi0xLjQNCiXi48 / TDQolDQold1BERjMgYnkgV1BDdWJlZCBHbWJIIFYzLjY1WzQwMjY1MzIxNl0gMzJiaXQgIHVuaWMgDQolDQolDQoxIDAgb2JqDTw8L1R5cGUvTWV0YWRhdGEvU3VidHlwZS9YTUwvTGVuZ3RoIDE0OTIgPj4NCnN0cmVhbQo8P3hwYWNrZXQgYmVnaW49Iu

     

...   ...   ...

     

GQ5N2VlYjczYmVkZjczZWM5Pl0NCi9JbmZvIDIgMCBSDQo + Pg0Kc3RhcnR4cmVmDQo1NTgyDQolJUVPRg0K

毕竟,这是变量source的完整值:

http://pastie.org/private/upqwjrkfwgmz1hxrx9vha

-edit2 -

  • 我们正在使用Adobe Reader版本11.0.3(11.0.03.37)。
  • 在IE9中取消/激活AdobePDF插件没有任何影响 - 问题仍然存在

1 个答案:

答案 0 :(得分:0)

正如Colombo和我之前提到的,IE中的数据uri限制不允许使用PDF。 我认为,我们的方法类似于解决方案,Colombo在他的第二条评论中描述。

在搜索高低之后,阅读大量资源并尝试我能想象的任何东西,解决我的问题的唯一解决方案是将整个逻辑放入ASP.NET控制器(归功于我的同事):

此代码正常运行,但处于“虚拟状态”!

字节数组位于“archiveDocument.Document.DocumentData”

public class PdfController : Controller
{
    [HttpGet]
    public ActionResult View(Guid id)
    {
        if (id == Guid.Empty || id == null)
            throw new ArgumentException("id null or emtpy", "id");

        using (var serviceClient = ServiceClient.GetAuthClient<ArchiveDocumentServiceClient, IArchiveDocumentService>())
        {
            var archiveDocument = serviceClient.GetById(id);
            if (archiveDocument == null)
                throw new ApplicationException("ArchiveDocument not found.");

            Response.Headers.Remove("Content-Disposition");
            Response.Headers.Add("Content-Disposition", "inline; filename=" + archiveDocument.Document.Name);

            return File(archiveDocument.Document.DocumentData, "application/pdf");
        }
    }
}

要将pdf-Document加载到iframe中,只需调用该函数(仍然是伪代码 - &gt;硬编码guid):

xtype: 'box',
width: 600,
height: 900,
autoEl: {
    tag: 'iframe',
    scrolling: 'no',
    seamless: 'seamless',
    frameborder: 0,
    src: 'Pdf/View/031d2151-5315-4574-aeb5-8154693a928d'
}

我希望,这个解决方案可以帮助其他人。

感谢所有支持我的人!