[英]How to create an XpsDocument from byte array?
我想從字節數組創建一個新的 System.Windows.Xps.Packaging.XpsDocument object,因為我不想立即將它存儲在本地機器上。
通過使用臨時文件,它可以正常工作:
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 window 中顯示 XPS 內容(不保存)會導致 System.ObjectDisposedException(“無法訪問已關閉的流”)崩潰(第一種方法工作正常)。
在創建 XpsDocument 之后,我是否應該仍然保持 Stream 處於打開狀態,還是我錯過了其他東西? 也許有人知道通過網絡將 XPS 數據作為字節檢索並從數據創建 XpsDocument object 的完全不同/更好的方法?
您不能關閉支持 XpsDocument 的 stream。 您必須允許 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;
}
但必須這樣做。
你應該嘗試包括
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.