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