备忘

来源:互联网 发布:大学生自控力数据 编辑:程序博客网 时间:2024/06/06 07:42

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

原创粉丝点击