从 MemoryStream 获取 XPS FixedDocumentSequence

Getting XPS FixedDocumentSequence from a MemoryStream

我正在使用 Spire 库将 DocX 文件转换为 XPS 文件,以便我可以在我的 Windows 桌面(WPF、C#)应用程序中显示文档的预览。

转换很好 - 我可以将生成的 XPS 文件保存到临时文件位置。然后,我可以使用 Packaging.XpsDocument 打开 XPS 文件并使用 GetFixedDocumentSequence 在 DocumentViewer 控件中显示 XPS 文档 - 到目前为止都非常简单。

为了加快这个过程,我真的很想将 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();

我现在已经复制并粘贴了测试函数 - 为此,我删除了 using 语句。我的示例编译后出现以下错误:

System.Windows.Xps.XpsPackagingException: 'ReachPackaging_PackageUriNull'

看来我也可以将压缩类型传递给 XpsDocument ctor,我可以传递一个 Uri - 但在这种情况下没有 Uri - Xps 文档在内存中并且不受任何物理存储的支持.

当然,我可以继续使用临时文件,但感觉这种转换应该不需要触摸磁盘。

您可以使用 .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();

        }