我想從字節數組中創建一個新的System.Windows.Xps.Packaging.XpsDocument對象,因爲我不想立即將它存儲在本地機器上。如何從字節數組創建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之後仍然保持Stream打開,還是我缺少其他東西? 也許有人知道一種完全不同的/更好的方法來檢索XPS數據作爲網絡上的字節並從數據創建一個XpsDocument對象?
謝謝,它的工作原理就是這樣! – cccec
MemoryStream將如何處理? –
@LeoLorenzoLuis:一般由包裝店管理。打開的軟件包實現了IDisposable,所以你可以隨時殺掉它,當它從內存中刪除它和流。只要您記住它的URI,您就可以從商店獲得任何軟件包http://msdn.microsoft.com/zh-cn/library/system.io.packaging.packagestore.getpackage.aspx – Will