簡體   English   中英

從 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();

現在已經復制並粘貼了我作為測試 function 的內容 - 為此我刪除了 using 語句。 我的示例編譯,我收到以下錯誤:

System.Windows.Xps.XpsPackagingException: 'ReachPackaging_PackageUriNull'

看來我也可以將壓縮類型傳遞給 XpsDocument ctor,並且我可以傳遞一個 Uri——但在這種情況下沒有 Uri——Xps 文檔位於 memory 中,並且不受任何實體店的支持。

當然,我可以繼續使用臨時文件,但感覺這種轉換不需要觸摸磁盤。

您可以使用 .NET XpsDocument 和PdfSharp並將 PackageUri 添加到 package

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();

        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM