2017-01-22 2 views
0

J'essaie de supprimer certains nœuds des entrées FixedPage d'un fichier XPS. J'ai écrit une méthode qui exploite le xml de FixedPage comme je veux, l'a testé manuellement en extrayant des fichiers * .fpage de xps et en les replaçant. Tout semblait être OK. Alors, j'ai développé un utilitaire simple qui traite chaque page fixe dans un xps fichier:Manipulation du fichier XPS en tant qu'archive ZIP à l'aide de ZipFile en C#

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

Bien que le xps fichier résultant conserve l'intégrité d'une archive zip et peut être décompressé avec dézipper, 7zip, explorateur windows etc , le Microsoft XPS Viewer ne peut pas l'afficher, montrant un message d'erreur ("Impossible d'ouvrir ce document" ou quelque chose comme ça). Je suis assez sûr que le fichier devrait être valide xps-file. En outre, si je remballe son contenu dans un nouveau fichier zip avec n'importe quel utilitaire que j'ai mentionné précédemment, et le renommer en xps, il devient possible d'afficher son contenu avec MS XPS viewer. Quelqu'un pourrait-il me pousser dans la bonne direction ou me montrer ce que j'ai fait de mal?

Répondre

1

Je ne me suis pas souvenu que xps est en fait un paquet .net. J'ai résolu mon problème en utilisant la classe 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); 
       } 
      } 
    }