2011-07-05 102 views
2

我想從字節數組中創建一個新的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對象?

回答

7

不能關閉流背襯的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; 
} 

但這是如何做到這一點。

+0

謝謝,它的工作原理就是這樣! – cccec

+0

MemoryStream將如何處理? –

+0

@LeoLorenzoLuis:一般由包裝店管理。打開的軟件包實現了IDisposable,所以你可以隨時殺掉它,當它從內存中刪除它和流。只要您記住它的URI,您就可以從商店獲得任何軟件包http://msdn.microsoft.com/zh-cn/library/system.io.packaging.packagestore.getpackage.aspx – Will

0

你應該嘗試包括

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; 
+1

將不起作用。文檔上的任何操作都會導致正在訪問封閉流。 – Will