2017-01-22 83 views
0

我試圖從XPS文件的FixedPage條目中刪除一些節點。我寫了一種方法,以我想要的方式運行FixedPage的xml,通過從xps中提取* .fpage文件並將它們放回來手動對其進行測試。一切似乎都沒問題。所以,我開發了一個簡單的工具,在XPS文件處理每個固定頁面:在C#中使用ZipFile將XPS文件操作爲ZIP歸檔文件

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文件保存一個zip壓縮文件的完整性,並且可以與解壓縮,7zip的,Windows資源管理器等進行解壓,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); 
       } 
      } 
    } 
相關問題