首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从字节数组创建XpsDocument?

如何从字节数组创建XpsDocument?
EN

Stack Overflow用户
提问于 2011-07-05 22:38:50
回答 2查看 6.1K关注 0票数 2

我想从字节数组创建一个新的System.Windows.Xps.Packaging.XpsDocument对象,因为我不想立即将其存储在本地计算机上。

通过使用临时文件,它可以很好地工作:

代码语言:javascript
复制
public static XpsDocument OpenXpsDocument(string url)
{
    WebClient webClient = new System.Net.WebClient();
    byte[] data = webClient.DownloadData(url);

    using (BinaryWriter writer = new System.IO.BinaryWriter(File.OpenWrite(xpsTempFilePath)))
    {
        writer.Write(data);
        writer.Flush();
    }

    XpsDocument xpsDocument = new System.Windows.Xps.Packaging.XpsDocument(xpsTempFilePath, FileAccess.Read);
    return xpsDocument;
}

然而,我想要实现的更像是这样:

代码语言:javascript
复制
public static XpsDocument OpenXpsDocument(string url)
{
    WebClient webClient = new WebClient();
    byte[] data = webClient.DownloadData(url);
    Package package;
    using (Stream stream = new MemoryStream(data))
    {
        package = System.IO.Packaging.Package.Open(stream);
    }
    XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.SuperFast, url);
    return xpsDocument;
}

上述方法的用法如下:

代码语言:javascript
复制
XpsDocument xps = TaxReturnCreator.OpenXpsDocument(tempFileUrl);
documentViewer1.Document = xps.GetFixedDocumentSequence();

并且,使用最后描述的尝试在WPF窗口中显示XPS内容的方法(不保存)会崩溃,并显示System.ObjectDisposedException (“无法访问关闭的流”)(第一种方法工作正常)。

我是否应该在创建XpsDocument后仍然保持流的打开状态,或者我是否遗漏了其他东西?也许有人知道一种完全不同/更好的方法,可以通过网络以字节形式检索XPS数据,并从数据中创建XpsDocument对象?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-05 23:35:49

不能关闭支持XpsDocument的流。您必须允许程序包管理支持MemoryStream,一旦收集了此程序包,就会收集该程序包。做以下事情看起来有点异端:

代码语言:javascript
复制
public static XpsDocument OpenXpsDocument(string url)
{
    var webClient = new WebClient();
    var data = webClient.DownloadData(url);
    var package = System.IO.Packaging.Package.Open(new MemoryStream(data));
    var xpsDocument = new XpsDocument(package, 
                                      CompressionOption.SuperFast, 
                                      url);
    return xpsDocument;
}

但这是必须要做的事情。

票数 7
EN

Stack Overflow用户

发布于 2011-07-05 23:04:36

你应该试着把

代码语言:javascript
复制
XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.SuperFast, url);

转换为using块,即

代码语言:javascript
复制
Package package;
using (Stream stream = new MemoryStream(data))
{
    package = System.IO.Packaging.Package.Open(stream);
    XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.SuperFast, url);
}
return xpsDocument;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6584474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档