1

Windows デスクトップ (WPF、C#) アプリケーションでドキュメントのプレビューを表示できるように、Spire ライブラリを使用して DocX ファイルを XPS ファイルに変換しています。

変換は正常に行われ、結果の XPS ファイルを一時ファイルの場所に保存できます。次に、XPS ファイルを で開き、 XPS ドキュメントを DocumentViewer コントロールに表示しPackaging.XpsDocumentますGetFixedDocumentSequence。ここまでは非常に簡単です。

プロセスを高速化するために、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 に答える