/// <summary>
/// 打印文档
/// </summary>
/// <param name="e"></param>
private void printMyDocument(PrintPageEventArgs e)
{
Graphics g = e.Graphics;
g.PageUnit = GraphicsUnit.Display;
/*
* 如下图所示,是一张打印纸
* -----------------------------------------
* | |--------------------------------| |
* | | | |
* | | VisibleClipBounds | |
* | | | |
* | |--------------------------------| |
* ------------------------------------------
* PageBounds是打印纸的实际大小
* MarginBounds是页边距以内的区域,如果页边距为0,那么就是整个纸张的大小
*/
// 打印机打印时,及时边距为零,也有个白边,这个区域就是白边以内的区域
RectangleF visibleClipRect = e.Graphics.VisibleClipBounds;
RectangleF paperRect = e.PageBounds;
RectangleF paperMarginRect = e.MarginBounds;
if (paperRect.Width <= 0 || paperRect.Height <= 0)
{
return;
}
Size bkSize = pbBackGround.getBkgroundSize();
if (bkSize.Width <= 0 || bkSize.Height <= 0)
{
return;
}
// 纸张大小和有效区域的差值(也就是白边的大小)
SizeF boundSize = new SizeF(0, 0);
boundSize.Width = Math.Abs(paperRect.Width - visibleClipRect.Width) / 2.0f;
boundSize.Height = Math.Abs(paperRect.Height - visibleClipRect.Height) / 2.0f;
// 打印纸张的实际宽度(可能大于打印机所能打印的宽度)
float factPaperWidth = float.Parse(Common.getValueFromIni(Constant.FACTPAPERWIDTH)) * 100 / 2.54f;
float paperRate = 0;
// 背景图片的宽高比例
float imageRate = bkSize.Width * 1.0f / bkSize.Height;
// 打印的区域和图片的实际大小
RectangleF printRect = new RectangleF(), imageRect;
// 打印背景的情况, 使用VisibleClipBoundsz作为纸张的可打印范围,此时预览也有个边
if (Option.isPrintBG)
{
// 打印纸上的有效区域
printRect.X = e.PageSettings.Margins.Left;
printRect.Y = e.PageSettings.Margins.Top;
printRect.Width = visibleClipRect.Width - e.PageSettings.Margins.Left - e.PageSettings.Margins.Right;
printRect.Height = visibleClipRect.Height - e.PageSettings.Margins.Top - e.PageSettings.Margins.Bottom;
// 打印纸的有效区域的宽高比值
paperRate = paperRect.Width / paperRect.Height;
}
else // 不打印背景的情况, 使用paperMarginRect作为纸张的可打印范围,如果边距为0,那么paperMarginRect = paperRect
{
// 打印纸上的有效区域
printRect = paperMarginRect;
// 打印纸的有效区域的宽高比值
paperRate = paperRect.Width / paperRect.Height;
}
/* 打印纸张的实际宽度
* (如果打印机的最大支持的宽度 < 打印纸的宽度,需要特殊处理。
* 如:打印纸宽74.5cm,而打印纸只能打印59cm宽)
*/
if (factPaperWidth > paperRect.Width && !this.chbSamllPicture.Checked)
{
// 以纸张高度为基准,调整图片宽度
printRect.Width = printRect.Height * imageRate;
}
else // 打印设定的纸张和实际纸张一致的情况
{
// 调整图片打印区域
if (paperRate < imageRate)
{
printRect.Height = printRect.Width / imageRate;
}
else
{
printRect.Width = printRect.Height * imageRate;
}
}
imageRect = printRect;
// 图片的开始点应为0
imageRect.X = 0;
imageRect.Y = 0;
Image image = null;
// 设置了打印背景的情况
if (Option.isPrintBG)
{
// 如果设置打印背景,那么以设置为准
image = pbBackGround.getPrintBitmap(imageRect, true);
// 如果是打印预览(不是打印动作),就进行偏移,否则图片不居中
if (!Option.isPrintAction)
{
g.TranslateTransform(boundSize.Width, boundSize.Height);
}
}
// 没有设置打印背景
else
{
// 预览时需要背景,在打印动作的情况下,是不打印背景的
image = pbBackGround.getPrintBitmap(imageRect, !Option.isPrintAction);
// 如是打印动作,因为要全纸打印,所以需要负偏移
if (Option.isPrintAction)
{
g.TranslateTransform(-boundSize.Width, -boundSize.Height);
}
}
if (image != null)
{
g.DrawImage(image, printRect);
image.Dispose();
}
// 打印成功了,修改打印次数(把打印次数减1)
if (Option.isPrintAction)
{
if (!modifyPrintCount())
{
MessageBox.Show(Constant.MSG_MODIFYPRINTCOUNT_ERROR,
Constant.APP_NAME,
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
}
}