gpt4 book ai didi

c# - 如何从字节数组创建 XpsDocument?

转载 作者:行者123 更新时间:2023-11-30 20:08:55 25 4
gpt4 key购买 nike

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

通过使用临时文件,它工作正常:

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

然而,我想要完成的更像是这样:

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

上述方法的用法是这样的:

XpsDocument xps = TaxReturnCreator.OpenXpsDocument(tempFileUrl);
documentViewer1.Document = xps.GetFixedDocumentSequence();

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

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

最佳答案

您不能关闭支持 XpsDocument 的流。您必须允许 Package 管理支持 MemoryStream,该 Package 被收集后将被收集。执行以下操作似乎有点异端:

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

但必须这样做。

关于c# - 如何从字节数组创建 XpsDocument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6584474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com