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 :
Je souhaiterai savoir ce qu'il manque, ou comment je devrais faire, afin de compléter l'impression.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } } }
Merci d'avance![]()
Partager