首页 > 代码库 > C#打印相关的知识点

C#打印相关的知识点

       GDI+可以用来创建和处理图像,还可以“绘制文本”。人们通常认为,文本时打印出来的,不是绘制出来的,但是在.NET中,显示和渲染文本的技术类似于显示图形的技术:必须创建Graphics对象,然后利用该对象的方法来定位和渲染文本字符串。所以,字体(Font)是打印的基础知识,有关字体的知识请参阅MSDN  http://msdn.microsoft.com/zh-cn/library/system.drawing.font(v=vs.110).aspx 。

       System.Drawing.Printing命名空间的PrintDocument类提供了控制打印进程的方法、成员属性和事件,因此,要建立输出到打印机的程序,就首先要建立PrintDocument对象。

       PrintDocument pDocument = new PrintDocument();

然后调用PrintDocument.Print方法启动打印进程,此时触发PrintDocument类的BeginPrint和PrintPage事件,PrintPage事件处理方法包含生成输出的逻辑和语句,包括确定打印行数、输出DrawString语句、负责通知底层的打印控制器是否还有待打印的页面(设置HasMorePages属性)等。触发流程如下:

private void FrmMain_Load(object sender, EventArgs e){sr = new StreamReader(@"数据的路径(.txt)");//数据格式如下/*1000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.470*/}
加载数据
1         StreamReader sr;2         string[] prtLine;3         Font rptFont;4         Font hdrFont;5         string title = "Title";6         float lineHeight;
类级别的变量
  private void pDocument_BeginPrint(object sender, PrintEventArgs e)        {            rptFont = new Font("Arial", 10);            hdrFont = new Font(rptFont, FontStyle.Bold);        }
BeginPrint事件,一般用于初始化字体等变量
 private void pDocument_EndPrint(object sender, PrintEventArgs e)        {           rptFont.Dispose();           hdrFont.Dispose();           sr.Close();        }
EndPrint事件,一般用于释放资源,关闭数据连接等
 private void pDocument_PrintPage(object sender, PrintPageEventArgs e)        {            Graphics graphics = e.Graphics;            int xPos = e.MarginBounds.Left;            int lineCt = 0;            lineHeight = hdrFont.GetHeight(graphics);            int linesPerPage = (int)((e.MarginBounds.Bottom - e.MarginBounds.Top) / lineHeight - 2);            float yPos = 2 * lineHeight + e.MarginBounds.Top;            int hdrPos = e.MarginBounds.Top;            PrintHdr(graphics, hdrPos, 200);            string prod;            char[] delim = { , };            while ((prod = sr.ReadLine()) != null)            {                prtLine = prod.Split(delim, 4);                yPos += lineHeight;                PrintDetail(graphics, yPos);                if (lineCt == linesPerPage)                {                    e.HasMorePages = true;                    lineCt = 0;                    break;                }                lineCt++;            }        }
PrintPages事件,包括主要的打印逻辑以及HasMorePages属性的设置
 private void PrintHdr(Graphics g, int yPos, int xPos)        {            g.DrawString(title, hdrFont, Brushes.Black, xPos, yPos);            float[] ts = { 80, 80, 200 };            StringFormat strFmt = new StringFormat();            strFmt.SetTabStops(0, ts);            g.DrawString("Code\tVender\tDescription\tCost", hdrFont, Brushes.Black, xPos, yPos + 2 * lineHeight, strFmt);        }
打印大标题和列标题
 private void PrintDetail(Graphics g, float yPos)        {            int xPos = 200;            StringFormat strFmt = new StringFormat();            strFmt.Trimming = StringTrimming.EllipsisCharacter;            strFmt.FormatFlags = StringFormatFlags.NoWrap;            RectangleF r = new RectangleF(xPos + 160, yPos, 200, lineHeight);            string invenid = prtLine[0];            string vendor = prtLine[1];            string desc = prtLine[2];            Decimal price = decimal.Parse(prtLine[3]);            g.DrawString(invenid, rptFont, Brushes.Black, xPos, yPos);            g.DrawString(vendor, rptFont, Brushes.Black, xPos + 80, yPos);            g.DrawString(desc, rptFont, Brushes.Black, r, strFmt);            strFmt.Alignment = StringAlignment.Far;            strFmt.Trimming = StringTrimming.None;            g.DrawString(price.ToString("#,###.00"), rptFont, Brushes.Black, xPos + 400, yPos, strFmt);        }
打印详细内容
 private void btnPrint_Click(object sender, EventArgs e)        {            PrintDocument pDocument = new PrintDocument();            PrintDialog pDialog = new PrintDialog();            pDialog.Document = pDocument;            pDialog.AllowSomePages = true;            PrintPreviewDialog preDialog = new PrintPreviewDialog();            preDialog.Document = pDocument;            pDocument.PrintPage += new PrintPageEventHandler(pDocument_PrintPage);            pDocument.BeginPrint += new PrintEventHandler(pDocument_BeginPrint);            pDocument.EndPrint += new PrintEventHandler(pDocument_EndPrint);            if (pDialog.ShowDialog() == DialogResult.OK)            {                pDocument.Print();            }        }
按钮事件

 

C#打印相关的知识点