备忘

    技术2024-06-12  65

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

    最新回复(0)