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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| /// <summary>
/// Réalise l'impression d'une page
/// </summary>
/// <param name="pageNumber">le numéro de la page à imprimer</param>
/// <param name="e">les arguments d'impression</param>
public void printPage(int pageNumber, PrintPageEventArgs e)
{
if (document == null)
return;
Page currentPage = document.getPage(pageNumber);
//On récupère la taille de la page
Size currentPageSize = currentPage.PageSize;
//On vérifie si la page a plutôt intérêt à être affichée en Portrait ou Paysage
bool bLandscape = currentPageSize.Width > currentPageSize.Height;
Matrix mG = e.Graphics.Transform;
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
//On récupère le point origine dans la feuille
Point pOrigine = e.MarginBounds.Location;
//On translate le graphics sur l'origine de la feuille en portait ou paysage
if (bLandscape)
{
e.Graphics.TranslateTransform(pOrigine.X, pOrigine.Y + e.MarginBounds.Height);
e.Graphics.RotateTransform(-90);
}
else
e.Graphics.TranslateTransform(pOrigine.X, pOrigine.Y);
//On calcul le facteur de zoom sur les X et les Y pour que la page prenne la taille de la feuille en portrait ou paysage
//en fonction de la forme de la page
float zoomX, zoomY, zoomFactor;
if (!bLandscape)
{
zoomX = (float)(e.MarginBounds.Width) / (float)(currentPageSize.Width);
zoomY = (float)(e.MarginBounds.Height) / (float)(currentPageSize.Height);
}
else
{
zoomX = (float)(e.MarginBounds.Width) / (float)(currentPageSize.Height);
zoomY = (float)(e.MarginBounds.Height) / (float)(currentPageSize.Width);
}
zoomFactor = Math.Min(zoomX, zoomY);
GdiGraphics gg = new GdiGraphics(e.Graphics);
//Cas n°1 : La page est plus petite que la feuille
//Dans ce cas les deux facteur de zoom sont supérieurs à 1
if (zoomX >= 1 && zoomY >= 1)
{
//La page est centrée dans la feuille
if (bLandscape)
gg.TranslateTransform((e.MarginBounds.Height - currentPageSize.Width) / 2, (e.MarginBounds.Width - currentPageSize.Height) / 2);
else
gg.TranslateTransform((e.MarginBounds.Width - currentPageSize.Width) / 2, (e.MarginBounds.Height - currentPageSize.Height) / 2);
}
//Cas n°2 : La page est plus grande que la feuille
//Dans ce cas on la redimensionne pour qu'elle tienne dans la feuille et on la centre
else
{
if (bLandscape)
gg.TranslateTransform((e.MarginBounds.Height - currentPageSize.Width * zoomFactor) / 2, 0);
else
gg.TranslateTransform(0, (e.MarginBounds.Height - currentPageSize.Height * zoomFactor) / 2);
gg.ScaleTransform(zoomFactor, zoomFactor);
}
pageRenderer.Draw(gg, currentPage);
e.Graphics.Transform = mG;
} |
Partager