1

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

转换很好 - 我可以将生成的 XPS 文件保存到临时文件位置。然后我可以打开 XPS 文件,Packaging.XpsDocument并使用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 文档在内存中并且没有任何物理存储支持。

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

4

1 回答 1

0

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

        }
于 2021-02-01T13:28:40.003 回答