我想从字节数组创建一个新的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对象?
发布于 2011-07-05 23:35:49
不能关闭支持XpsDocument的流。您必须允许程序包管理支持MemoryStream,一旦收集了此程序包,就会收集该程序包。做以下事情看起来有点异端:
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;
}但这是必须要做的事情。
发布于 2011-07-05 23:04:36
你应该试着把
XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.SuperFast, url);转换为using块,即
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;https://stackoverflow.com/questions/6584474
复制相似问题