[WPF] Composition d'un document pour impression à partir des Visual
Bonjour,
Je me suis créé une petite gestion de formulaires (en C# 3.5) qui consiste à aider les utilisateurs à remplir des documents multipages, avec des données métier, des champs, etc... destinés à être imprimés ou convertis pour échange de documents.
Le rendu d'un formulaire se fait par databinding via une succession de templates. Donc à partir de 1 objet "Formulaire" de 4 pages, le rendu m'affiche les 4 pages, que l'utilisateur peut scroller. C'est du WYSIWYG. Chaque "page" est à la dimension qu'elle aurait à l'impression, portrait ou paysage.
Le soucis vient pour les impressions. J'avais mis en place une première solution à base de RenderTargetBitmap, pour dessiner sur un System.Drawing.Graphics, mais j'ai eu des soucis de mémoire (la classe RenderTargetBitmap a des fuites).
Je me suis donc tourné vers la gestion des documents du framework 3.5 (FixedDocument, XPSDocument, etc...).
Ce que je souhaiterai faire, c'est pouvoir convertir mes pages WPF en pages de documents, en prenant en compte la dimension des pages et l'orientation. Aujourd'hui, je n'arrive pas à prendre en compte l'orientation pour chaque page.
De plus, en utilisant un simple DocumentViewer, le bouton "Imprimer" ne me permet pas de choisir les pages que je veux imprimer.
Le code que j'utilise pour créer mon document ressemble à ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
//Create a memory package
using (MemoryStream xpsStream = new MemoryStream())
{
using (Package package = Package.Open(xpsStream, FileMode.Create, FileAccess.ReadWrite))
{
string packageUriString = "memorystream://data.xps";
Uri packageUri = new Uri(packageUriString);
PackageStore.AddPackage(packageUri, package);
try
{
//Create document and writer
XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.Maximum, packageUriString);
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
//Print each page
VisualsToXpsDocument vToXpsD = (VisualsToXpsDocument)writer.CreateVisualsCollator();
for (int i = 0; i < this.Pages.Count; i++)
{
Visual visual = this.Pages[i].Visual;
PageOrientation o = this.Pages[i].landscape ? PageOrientation.Landscape : PageOrientation.Portrait;
PrintTicket pageTicket = new PrintTicket();
pageTicket.PageOrientation = o;
vToXpsD.Write(visual, pageTicket);
}
vToXpsD.EndBatchWrite();
//Get FixedDocumentSequence for XpsDocument
FixedDocumentSequence document = xpsDocument.GetFixedDocumentSequence();
xpsDocument.Close();
//Show Preview
myDocViewer.Document = document;
}
finally
{
PackageStore.RemovePackage(packageUri);
}
}
} |
Je souhaiterai savoir ce qu'il manque, ou comment je devrais faire, afin de compléter l'impression.
Merci d'avance :)