从内存流获取 XPS FixedDocumentSequence



我正在使用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();
}

相关内容

  • 没有找到相关文章