Fusionner plusieurs fichiers XPS

by Gilles DEHAIS 8. octobre 2011 00:23

Les fichiers XPS sont un peu l'équivalent du PDF mais version Microsoft. En effet, ce type de fichier permet l'impression d'un document avec un rendu équivalent que ça soit sur différents ordinateurs et/ou imprimantes. Il permet aussi de bloquer l'édition puisqu'un fichier XPS n'est pas éditable. Il s'agit d'une "image" des pages du document d'origine.

Cependant, il se peut que vous ayez à fusionner plusieurs fichiers XPS pour obtenir un seul fichier final. Nous allons voir que cela est possible avec quelques lignes de codes et grâce à l'API Document qui contient l'API XPS.

 

Tout d'abord, il faut créer notre fichier final qui sera la fusion de nos différents fichiers XPS.

 

dstPackage = Package.Open(dstMergedXpsFileName, FileMode.Create);
dstMergedXps = new XpsDocument(dstPackage);
FixedDocumentSequence dstDocumentSequence = new FixedDocumentSequence();
xpsWriter = XpsDocument.CreateXpsDocumentWriter(dstMergedXps);

 

On utilise l'objet Package pour créer notre fichier sur le disque dur puis nous créons notre document XPS qui contiendra la séquence des documents (nos différentes pages). Un DocumentWriter est aussi nécessaire pour pouvoir remplir notre fichier XPS et l'enregistrer.

Maintenant que notre document final est prêt à recevoir les pages des documents XPS que l'on souhaite fusionner, il suffit d'ouvrir chacun de ces documents, en récupérer les pages (leurs références) et les ajouter dans notre document final les uns après les autres.

 

srcXps = new XpsDocument(srcXpsFileName, FileAccess.Read);
FixedDocumentSequence srcDocumentSequence = srcXps.GetFixedDocumentSequence();
DocumentPaginator DocPager = srcDocumentSequence.DocumentPaginator;
printTickets.Add(srcXps.FixedDocumentSequenceReader.PrintTicket);
foreach (DocumentReference srcReference in srcDocumentSequence.References)
{
     DocumentReference dstReference = new DocumentReference();
     (dstReference as IUriContext).BaseUri = (srcReference as IUriContext).BaseUri;
     dstReference.Source = srcReference.Source;
     dstDocumentSequence.References.Add(dstReference);
}

 

Comme décrit dans le code ci-dessus, on ouvre notre document, on récupère sa séquence de pages (FixedDocumentSequence) puis pour chaque page, on ajoute une référence (DocumentReference) à notre fichier final, son adresse (sa localisation dans le fichier XPS qui n'est en faite qu'un fichier ZIP) et sa source qui est notre page en elle même.

On peut voir aussi la notion de "PrintTicket". Les "PrintTicket" dans les fichiers XPS permettent de définir si la page est en mode portrait ou paysage. Ainsi, l'imprimante pourra imprimer certaines pages en mode paysage tandis que d'autres le seront en mode portrait.

Enfin, il ne nous reste plus qu'à sauvegarder notre fichier final après avoir fusionner tous nos fichiers. Ceci se fait de la manière suivante :

 

xpsWriter.Write(dstDocumentSequence);
dstMergedXps.Close();
dstPackage.Close();

 

Voilà, notre fichier contient maintenant toutes les pages des fichiers que l'on souhaitait fusionner en un seul. Il reste cependant un petit bémol à la fusion de fichiers XPS. Ainsi, si vous avez une pagination dans chacun de vos fichiers, cette pagination n'est pas modifiée car une page dans un fichier XPS ne peut être modifiée car elle est devenu une "image". Vous pouvez modifier l'extension de vos fichiers XPS et la renommer en ".zip" pour découvrir l'architecture complète d'un fichier XPS.

Je vous joins à cette article le code source.

FusionXPS.zip (30,07 kb)

Tags:

Ajouter un commentaire




  Country flag
biuquote
  • Commentaire
  • Aperçu immédiat
Loading


Neos-SDI  Neos-SDI