バイト配列から新しい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オブジェクトを作成する完全に異なる/より良い方法を知っていますか?