2015-09-10 2 views
1

Je génère un fichier XPS à la volée en utilisant la classe XpsDocument. Dans mon modèle XAML, j'intègre une image JPEG dans un conteneur Image. Toutefois, les images incorporées dans les résultats XPS sont toujours PNG images - ce qui entraîne des fichiers très volumineux pour certains types d'images.Comment intégrer des images JPEG dans XPS généré XAML?

Il semble que l'éditeur de document interprète les images rendues en tant que bitmaps, puis les enregistre sous PNG.

Voici le code qui produit le XPS:

void ConvertToXps(IEnumerable<FixedDocument> fixedDocuments, Stream outputStream) 
{ 
    var package = Package.Open(outputStream, FileMode.Create); 
    var xpsDoc = new XpsDocument(package, CompressionOption.Normal); 
    var xpsWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc); 

    // XPS documents are built using fixed document sequences. 
    var fixedDocSeq = new FixedDocumentSequence(); 

    // A4 = 210 x 297 mm = 8.267 x 11.692 inches = 793.632 * 1122.432 dots 
    fixedDocSeq.DocumentPaginator.PageSize = new Size(793.632, 1122.432); 

    foreach (var fixedDocument in fixedDocuments) 
    { 
     var docRef = new DocumentReference(); 
     docRef.BeginInit(); 
     docRef.SetDocument(fixedDocument); 
     docRef.EndInit(); 
     ((IAddChild)fixedDocSeq).AddChild(docRef); 
    } 

    // Write out our fixed document to XPS. 
    xpsWriter.Write(fixedDocSeq.DocumentPaginator); 

    xpsDoc.Close(); 
    package.Close(); 
} 

Q: Comment puis-je forcer mes XAML images rendus à être enregistrés comme JPEG dans le produit XPS?

Répondre

2

Je pense que vous devez changer la façon dont vous créez votre document XPS.

var package = Package.Open(outputStream, FileMode.Create); 
var xpsDoc = new XpsDocument(package, CompressionOption.Normal); 
var xpsWriter = xpsDoc.AddFixedDocumentSequence(); 

var fixedDocSeq = xpsDoc.GetFixedDocumentSequence(); 

// A4 = 210 x 297 mm = 8.267 x 11.692 inches = 793.632 * 1122.432 dots 
fixedDocSeq.DocumentPaginator.PageSize = new Size(793.632, 1122.432); 

foreach (var fixedDocument in fixedDocuments) 
{ 
    var docWriter = xpsWriter.AddFixedDocument(); 

    var pageWriter = docWriter.AddFixedPage(); 

    var image = pageWriter.AddImage(XpsImageType.JpegImageType); 

    Stream imageStream = image.GetStream(); 

    //Write your image to stream 

    //Write the rest of your document based on the fixedDocument object 
} 

La clé ici est d'obtenir le IXpsFixedPageWriter avec le docWriter.AddFixedPage();. Cela vous permet de recréer votre document, en ajoutant les images où vous voulez qu'elles soient.

Vous n'êtes pas sûr de pouvoir modifier le FixedDocument déjà créé.

+0

Fait sens. Est-il possible d'obtenir ce 'IXpsFixedPageWriter' si le' FixedDocument' est créé à partir de 'XAML' et ensuite lire en utilisant' XamlReader.Parse'? Idéalement, je voudrais un rappel où les parseurs me demande ce qu'il faut faire quand il rencontre une image. – l33t

+0

Je ne suis pas sûr à 100%, mais je ne le pense pas. Je ne pense pas qu'il y ait quelque chose dans le Framework .Net pour éditer un XPS existant, ce que vous essayez de faire. Vous pouvez créer le fichier XPS, mais une fois créé, il est en lecture seule. – Gimly

+0

Dans ce cas, 'FixedPage' doit en effet être créé en code-behind. À moins qu'il y ait une manière intelligente de raccorder l'analyseur XAML et de surcharger l'appel interne à 'AddImage'. – l33t