2011-07-05 11 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

を試してみてください。このパッケージが収集されると、バッキング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/en-us/library/system.io.packaging.packagestore.getpackage.aspx – Will

0

あなたがXpsDocumentをバックアップストリームを閉じることができない、usingブロックに

XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.SuperFast, 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; 
+1

は機能しません。ドキュメント上のアクションによって、クローズドストリームにアクセスすることになります。 – Will

関連する問題