2

バイト配列から新しい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();

また、XPSコンテンツを(保存せずに)WPFウィンドウに表示しようとする最後に説明した方法を使用すると、System.ObjectDisposedException(「閉じたストリームにアクセスできません」)でクラッシュします(最初の方法は正常に機能します)。

XpsDocumentを作成した後もストリームを開いたままにする必要がありますか、それとも何か他のものがありませんか?たぶん誰かがネットワークを介してXPSデータをバイトとして取得し、データからXpsDocumentオブジェクトを作成する完全に異なる/より良い方法を知っていますか?

4

2 に答える 2

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;
}

しかし、それはこれが行われなければならない方法です。

于 2011-07-05T15:35:48.920 に答える
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;
于 2011-07-05T15:04:35.813 に答える