Как создать XpsDocument из байтового массива? - PullRequest
2 голосов
/ 05 июля 2011

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

Ответы [ 2 ]

7 голосов
/ 05 июля 2011

Вы не можете закрыть поток, поддерживающий 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 голосов
/ 05 июля 2011

Вы должны попробовать включить

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