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
}
}