2017-01-22 11 views
0

XPSファイルのFixedPageエントリからいくつかのノードを削除しようとしています。私はFixedPageのxmlを私が望むやり方で動作させ、* .fpageファイルをxpsから抽出して、再度それらを置くことによって手動でテストする方法を書いた。すべてがOKのようだった。その結果、XPSファイルは、ZIPアーカイブの整合性を保持し、解凍、7zipを、Windowsエクスプローラなどで解凍することができますがC#でZipFileを使用してZIPアーカイブとしてXPSファイルを操作する

var arch = ZipFile.Open(xpsFileName, System.IO.Compression.ZipArchiveMode.Update); 

foreach (var entry in arch.Entries) 
    if (entry.Name.EndsWith(".fpage")) 
    { 
     var file = entry.Open(); 

     var page = XElement.Load(file); 
     page = ProcessPage(page); 

     file.Position = 0; 
     page.Save(file); 
     file.SetLength(file.Position); 

     file.Close(); 
    } 

arch.Dispose(); 

:だから、私は、XPSファイル内のすべての固定ページを処理簡単なユーティリティを開発しましたMicrosoft XPS Viewerは表示できず、何らかのエラーメッセージ(「この文書を開くことができませんでした」など)を表示します。 私はかなりファイルが有効なxpsファイルであることを確信しています。さらに、私が前に述べたユーティリティを使ってその内容を新しいzipファイルに再パックし、xpsに名前を変更すると、MS XPSビューアでその内容を見ることができるようになります。 誰かが私を正しい方向に押し込んだり、私が間違っていたことを教えてもらえますか?

答えて

1

xpsは実際には.netパッケージであることに気づいていませんでした。私はZipPackageクラスを使用して私の問題を解決しました:

using (var pack = ZipPackage.Open(xpsFileName, FileMode.Open, FileAccess.ReadWrite)) 
    { 
     foreach (var part in pack.GetParts()) if (part.Uri.OriginalString.EndsWith(".fpage")) 
      { 
       using (var file = part.GetStream(FileMode.Open, FileAccess.ReadWrite)) 
       { 
        var page = ProcessPage(XElement.Load(file)); 
        file.Position = 0; 
        page.Save(file); 
        file.SetLength(file.Position); 
       } 
      } 
    } 
関連する問題