2016-08-02 2 views
1

J'ai sauvé un FixedDocument à XPS fichier par exemple:Enregistrement d'un FixedDocument avec des images dans un fichier XPS

void SaveDocument(FixedDocument document, string filePath) 
{ 
    var xps = new XpsDocument(
     filePath, FileAccess.Write, CompressionOption.Maximum); 

    var writer = XpsDocument.CreateXpsDocumentWriter(xps); 
    writer.Write(document); 

    xps.Close(); 
} 

J'ai ouvert le fichier XPS archive ZIP et a vu mes images sont gardés en tant que fichiers PNG. Comment puis-je modifier le format de fichier image en JPG?

+0

Pourquoi voudriez-vous faire cela? Le but de l'utilisation de XpsDocumentWriter est d'écrire un fichier .xps, ce que vous avez fait avec succès. Le type de fichier des données d'image contenues dans le fichier .xps doit être complètement non pertinent. – Jon

+1

J'ai besoin du format JPG pour réduire la taille de mes documents. – CrazyCoder

Répondre

1

J'ai eu le même problème: la taille de mon fichier était trop grande car les photos étaient incorporées en tant que png au lieu de jpeg. Je l'ai corrigé en convertissant tous les fichiers png en jpeg dans le paquet. J'ai gardé les URI de la même manière pour éviter d'avoir à mettre à jour les références à l'image, mais cela signifie que l'URI interne de vos jpeg se terminera par un ".png" trompeur. Évidemment, cela devient plus compliqué si vous voulez choisir les images que vous convertissez en JPEG.

public static void ReplacePngsWithJpegs(Package package) 
{ 
    // We're modifying the enumerable as we iterate, so take a snapshot with ToList() 
    foreach (var part in package.GetParts().ToList()) 
    { 
     if (part.ContentType == "image/png") 
     { 
      using (var jpegStream = new MemoryStream()) 
      using (var image = System.Drawing.Image.FromStream(part.GetStream())) 
      { 
       image.Save(jpegStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
       jpegStream.Seek(0, SeekOrigin.Begin); 

       // Cannot access Uri after part is removed, so store it 
       var uri = part.Uri; 

       package.DeletePart(uri); 

       var jpegPart = package.CreatePart(uri, "image/jpeg"); 
       jpegStream.CopyTo(jpegPart.GetStream()); 
      } 
     } 
    } 
} 
+0

J'ai résolu ce problème de la même manière il y a un an, mais j'ai analysé les archives ZIP. Votre chemin est plus natif et propre. Merci. – CrazyCoder