PrinterSettings incorrect pour l'impression d'un Report sans Rep

Signaler
Messages postés
65
Date d'inscription
jeudi 1 septembre 2011
Statut
Membre
Dernière intervention
22 juillet 2014
-
Bonjour tout le monde,
Je fais à nouveau appel à vous. J'ai un souci au niveau de l'impression d'un Report sans la prévisualisation de celui-ci dans un ReportViewer.
Pour faire cela, j'ai utilisé une classe que j'ai appelé CPrintReport, dont le contenu est exactement le même que dans le tutoriel de Microsoft pour l'impression (http://msdn.microsoft.com/it-it/library/ms252091.aspx).
Le report que je souhaite imprimer représente une étiquette contenant différents champs textes et des codes-barres. Quand je lance l'impression à travers un ReportViewer, l'étiquette est imprimée correctement (dimension : 827*291 centième de pouce, soit 8,27in*2,91in). Les dimensions que je vous ai présenté sont exactement les mêmes dans les paramètres PrinterSettings du reportViewer, c'est à dire que la propriété PaperSizes[0] correspond.
PaperSizes[0] = {[PaperSize User defined Kind=Custom Height=827 Width=291]}
PaperSizes[0].Kind = "Custom"
PaperSizes[0].PaperName = "User defined"
PaperSizes[0].RawKind = 256


En revanche, lors de l'impression sans ReportViewer, voici les paramètres de l'imprimante que j'ai :
PaperSizes[0] = {[PaperSize User defined Kind=Custom Height=827 Width=157]}
PaperSizes[0].Kind = "Custom"
PaperSizes[0].PaperName = "User defined"
PaperSizes[0].RawKind = 256

Quelqu'un aurait une explication?

Ci-dessous se trouve la classe CPrintReport :
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Microsoft.Reporting.WinForms;
using System.Drawing.Printing;
using System.Drawing.Imaging;
using System.Drawing;
using System.Globalization;

namespace ReportPrint
{
    /// <summary>
    /// Cette classe imprime toutes les pages contenues dans le Report.
    /// Les pages sont mises en forme en fonction de leur PageSettings.  
    /// Pour initialiser l'instance, faite appel à la méthode Print(Report).
    /// </summary>
    class CPrintReport
    {
        #region Variables
        /*===============================================================
          Variables servant à l'impression
        ===============================================================*/
        private int _CurrentPageIndex;
        private IList<Stream> _ListStreams;
        private PageSettings _PageSettings;
        private LocalReport _Report;
        #endregion


        #region Constructeur et destructeur
        /*##############################################################################
        #  Constructeur
        ##############################################################################*/
        /// <summary>
        /// Constructeur de la classe
        /// </summary>
        /// <param name="_Report">Le Report que l'on souhaite utilisé</param>
        public CPrintReport(LocalReport _Report)
        {
            this._Report = _Report;       
        }


        /*##############################################################################
        #  Destructeur de la classe
        ##############################################################################*/
        public void Dispose()
        {
            /*===============================================================
              On libère les ressources des flux
            ===============================================================*/
            if (_ListStreams != null)
            {
                foreach (Stream stream in _ListStreams)
                    stream.Close();
                _ListStreams = null;
            }
        }
        #endregion


        #region Méthodes pour l'impression
        /// <summary>
        /// Impression du Report
        /// </summary>
        public void Print()
        {
            /*===============================================================
              Mise en forme du Report
            ===============================================================*/
            Export();

            /*===============================================================
              Test si le flux servant à l'impression existe
            ===============================================================*/
            if (_ListStreams == null || _ListStreams.Count == 0)
                throw new Exception("Erreur: Pas de flux pour l'impression.");

            /*===============================================================
              Récupération de l'imprimante par défaut (impression si l'imprimante existe)
            ===============================================================*/
            PrintDocument printDoc = new PrintDocument();
            if (!printDoc.PrinterSettings.IsValid)
                throw new Exception("Erreur: Impossible de trouver l'imprimante par défaut.");
            else
            {
                _CurrentPageIndex = 0;
                printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
                printDoc.Print();
            }
        }


        /// <summary>
        /// Impression du Report
        /// </summary>
        /// <param name="Settings">Imprimante sur laquelle sera imprimée le report</param>
        public void Print(PrinterSettings Settings)
        {
            /*===============================================================
              Mise en forme du Report
            ===============================================================*/
            Export();

            /*===============================================================
              Test si le flux servant à l'impression existe
            ===============================================================*/
            if (_ListStreams == null || _ListStreams.Count == 0)
                throw new Exception("Erreur: Pas de flux pour l'impression.");

            /*===============================================================
              Récupération de l'imprimante
            ===============================================================*/
            PrintDocument printDoc = new PrintDocument();
            printDoc.PrinterSettings = Settings;
            if (!printDoc.PrinterSettings.IsValid)
                throw new Exception("Erreur: Impossible de trouver l'imprimante.");
            else
            {
                _CurrentPageIndex = 0;
                printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
                printDoc.Print();
            }
        }


        /*##############################################################################
        #  Création du flux d'image pour chaque page
        ##############################################################################*/
        /// <summary>
        /// Création du flux pour chaque page du Report
        /// </summary>
        private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
        {
            /*===============================================================
              Ajout du flux de la page dans la liste
            ===============================================================*/
            Stream stream = new MemoryStream();
            _ListStreams.Add(stream);

            return stream;
        }


        /*##############################################################################
        #  Mise en forme du Report sous le format EMF (Enhanced Metafile)
        ##############################################################################*/
        /// <summary>
        /// Mise en forme du Report sous le format EMF (Enhanced Metafile)
        /// </summary>
        /// <param name="_Report">Le Report qui sera mis en forme et imprimé</param>
        private void Export()
        {
            /*===============================================================
              Récupération de la mise en page du Report
            ===============================================================*/
            ReportPageSettings _ReportPageSettings = _Report.GetDefaultPageSettings();
            _PageSettings = new PageSettings();
            _PageSettings.PaperSize = _ReportPageSettings.PaperSize;
            _PageSettings.Margins = _ReportPageSettings.Margins;

            /*===============================================================
              Mise en page du Report (Taille et marge)
            ===============================================================*/
            string deviceInfo = string.Format(CultureInfo.InvariantCulture, @"<DeviceInfo>
                                                                                <OutputFormat>EMF</OutputFormat>
                                                                                <PageWidth>{0}</PageWidth> 
                                                                                <PageHeight>{1}</PageHeight>
                                                                                <MarginTop>{2}</MarginTop>
                                                                                <MarginLeft>{3}</MarginLeft>
                                                                                <MarginRight>{4}</MarginRight>
                                                                                <MarginBottom>{5}</MarginBottom>
                                                                              </DeviceInfo>",
                                                                            ToInches(_PageSettings.PaperSize.Height),
                                                                            ToInches(_PageSettings.PaperSize.Width),
                                                                            ToInches(_PageSettings.Margins.Top),
                                                                            ToInches(_PageSettings.Margins.Left),
                                                                            ToInches(_PageSettings.Margins.Right),
                                                                            ToInches(_PageSettings.Margins.Bottom));


            /*===============================================================
              Récupération des flux et des warnings
            ===============================================================*/
            Warning[] warnings;
            _ListStreams = new List<Stream>();

            /*===============================================================
              Mise en forme du Report
            ===============================================================*/
            _Report.Render("Image", deviceInfo, CreateStream, out warnings);

            /*===============================================================
              Initialisation des flux
            ===============================================================*/
            foreach (Stream stream in _ListStreams)
                stream.Position = 0;
        }


        /*##############################################################################
        #  Impression de chaque page du Report (Evénement PrintPageEvents)
        ##############################################################################*/
        /// <summary>
        /// Evénement PrintPageEvents
        /// </summary>
        private void PrintPage(object sender, PrintPageEventArgs ev)
        {
            /*===============================================================
              Création de la séquence d'opération graphique
            ===============================================================*/
            Metafile pageImage = new Metafile(_ListStreams[_CurrentPageIndex]);

            /*===============================================================
              On ajuste la zone d'impression
            ===============================================================*/
            Rectangle adjustedRect = new Rectangle(
                ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
                ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
                ev.PageBounds.Width,
                ev.PageBounds.Height);

            /*===============================================================
              Ajout d'un fond d'écran blanc
            ===============================================================*/
            ev.Graphics.FillRectangle(Brushes.White, adjustedRect);

            /*===============================================================
              Dessine le contenu du Report
            ===============================================================*/
            ev.Graphics.DrawImage(pageImage, adjustedRect);

            /*===============================================================
              Préparation de la prochaine page à imprimer
            ===============================================================*/
            _CurrentPageIndex++;
            ev.HasMorePages = (_CurrentPageIndex < _ListStreams.Count);
        }


        /*##############################################################################
        #  Conversions en Inches
        ##############################################################################*/
        public static string ToInches(int hundrethsOfInch)
        {
            double inches = Math.Round(hundrethsOfInch / 100.0, 2);
            return inches.ToString(CultureInfo.InvariantCulture) + "in";
        }
        #endregion
    }
}