Я хотел бы создать новый объект 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 из данных?