Получение XPS FixedDocumentSequence из MemoryStream

Я использую библиотеку Spire для преобразования файла DocX в файл XPS, чтобы я мог отображать предварительный просмотр документа в своем приложении Windows Desktop (WPF, C#).

Преобразование прошло нормально, и я могу сохранить полученный XPS-файл во временную папку. Затем я могу открыть файл XPS с помощью Packaging.XpsDocument и использовать GetFixedDocumentSequence для отображения документа XPS в элементе управления DocumentViewer — пока все довольно просто.

Чтобы ускорить процесс, я действительно хотел бы сохранить XPS в MemoryStream и просто загрузить XPS оттуда. Я попытался сделать следующее:

FileStream fileStream = File.OpenRead(FileName);
MemoryStream msXps = new MemoryStream();

Spire.Doc.Document doc = new Spire.Doc.Document(fileStream, Spire.Doc.FileFormat.Docx);
doc.SaveToStream(msXps, Spire.Doc.FileFormat.XPS);

var package = System.IO.Packaging.Package.Open(msXps, FileMode.Open, FileAccess.Read);

System.Windows.Xps.Packaging.XpsDocument xpsDoc = 
   new System.Windows.Xps.Packaging.XpsDocument(package);

return xpsDoc.GetFixedDocumentSequence();

Я скопировал и вставил то, что у меня есть, в качестве тестовой функции прямо сейчас — для этого я удалил операторы использования. Мой пример компилируется, и я получаю следующую ошибку:

System.Windows.Xps.XpsPackagingException: 'ReachPackaging_PackageUriNull'

Похоже, что я также могу передать тип сжатия в ctor XpsDocument, и я могу передать Uri, но в этом случае нет Uri — документ Xps находится в памяти и не поддерживается каким-либо физическим хранилищем.

Конечно, я могу продолжать использовать временный файл, но мне кажется, что для этого преобразования не нужно трогать диск.


person AJ.    schedule 31.05.2020    source источник


Ответы (1)


Вы можете использовать .NET XpsDocument и PdfSharp и добавить PackageUri в пакет

using (MemoryStream memoryStream = new MemoryStream())
        {
            System.IO.Packaging.Package package = System.IO.Packaging.Package.Open(memoryStream, FileMode.OpenOrCreate);
            
            // ...

            var packageUri = new Uri("memorystream://myXps.xps");
            PackageStore.AddPackage(packageUri, package);
            XpsDocument doc = new XpsDocument(package, CompressionOption.SuperFast, packageUri.AbsoluteUri);

            XpsConverter.Convert(doc, filePath, 0);

            package.Close();

        }
person Ahm3d Said    schedule 01.02.2021