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 : 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);
                    }
                }
            }
Je souhaiterai savoir ce qu'il manque, ou comment je devrais faire, afin de compléter l'impression.

Merci d'avance