C# PrintDocument打印

前段时间开发项目时接触到了打印模块,以前做的打印都是托管指令集打印([DllImport("winspool.drv")]),可是在某些环境和不同打印机测试时会有偶尔几个打印机出现乱码,找来找去找不到解决方案,于是就打算换成.Net的Print打印类进行打印。

因为搜集到的资料有绝大部分都很浪费口舌,且代码难易度不适合初学者,索性,写一个来巩固自己,也可顺应其他人的东西。

-----------------------------初次撰文,如有错误,请留言指示。谢咯-----------------------

.Net打印程序使用起来是非常简单的,绝大部分已经封装完毕,只需要简单的创建实例和调用方法,以及定义打印格式而已。

PrintDocument---进行打印时,将输出发送到打印机的可重用对象。

声明此对象后,可针对于打印时需要修改的格式字体等属性进行修改。

例如:PrintDocument.DefaultPageSettings.Margins 对象,顾名思义,Margins边距的意思,在PrintDocument声明后调用时是用来获取或者设置页边距的属性,和CSS里的margin类似。

声明PrintDocument对象  PrintDocument printDocument = new PrintDocument();

声明Margins对象 Margins margins = new Margins(int32 left,right,top,bottom);

对DefaultPageSettings.Margins赋值  printDocument.DefaultPageSettings.Margins = margins;

DefaultPageSettings对象是页面设置对象,用做打印时所有默认的设置。例如:PageSize(纸张大小设置) PageSource(纸张来源设置)。

当设置完毕后,可以直接调用PrintDocument的Print()对象进行打印。

打印前需要创建PrintDocument_PrintPrintPage事件,而打印页面的设置和打印方式(DrawString,DrawImage)和打印格式,都在此定义。

代码事例:

private void printDocument_PrintPage(object sender, PrintPageEventArgs ev)    

{            

  Font titleFont = new Font("宋体", 9, FontStyle.Bold);//标题字体            

  Font fntTxt = new Font("宋体", 9, FontStyle.Regular);//正文文字            

  Brush brush = new SolidBrush(Color.Black);//画刷            

  Pen pen = new Pen(Color.Black);           //线条颜色            

  Point po = new Point(10, 10);            

  try            

  {                

    e.Graphics.DrawString(GetPrintSW.ToString(), titleFont, brush,po);   //DrawString方式进行打印。         

  }            

  catch (Exception ex)            

  {                

     MessageBox.Show(this, "打印出错!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);            

  }

}

///GetPrintSw方法用来构造打印文本,内部StringBuilder.AppendLine在Drawstring时单独占有一行。

public StringBuilder GetPrintSW()        

 {            

  StringBuilder sb = new StringBuilder();            

  string tou = "测试管理公司名称";            

  string address = "河南洛阳";            

  string saleID = "2010930233330";    //单号        

  string item = "项目";            

  decimal price = 25.00M;            

  int count = 5;            

  decimal total = 0.00M;            

  decimal fukuan = 500.00M;            

  sb.AppendLine(" " + tou + " \n");            

  sb.AppendLine("-----------------------------------------");            

  sb.AppendLine("日期:" + DateTime.Now.ToShortDateString() + " " + "单号:" + saleID);            

  sb.AppendLine("-----------------------------------------");            

  sb.AppendLine("项目" + "      " + "数量" + "    " + "单价" + "    " + "小计");            

  for (int i = 0; i < count; i++)            

  {                

  decimal xiaoji = (i + 1) * price;                

  sb.AppendLine(item + (i + 1) + "      " + (i + 1) + "     " + price + "    " + xiaoji);                

  total += xiaoji;            

  }            

  sb.AppendLine("-----------------------------------------");            

  sb.AppendLine("数量:" + count + "  合计: " + total);            

  sb.AppendLine("付款:" + fukuan);            

  sb.AppendLine("现金找零:" + (fukuan - total));            

  sb.AppendLine("-----------------------------------------");            

  sb.AppendLine("地址:" + address + "");            

  sb.AppendLine("电话:123456789 123456789");            

  sb.AppendLine("谢谢惠顾欢迎下次光临 ");            

  sb.AppendLine("-----------------------------------------");            

  return sb;        

}

 

//在打印页面创建PrintDocument对象 

PrintDocument pd = new PrintDocument();

//如果需要打印预览,可以声明打印预览变量,预览这一部分,这里不再介绍,博客园里相应代码多到没边,可以自行查询。

//打印按钮事件:

private void btnPrint_Click(object sender, EventArgs e)        

 {            

  pd.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage); //打印页面需指定相应的PrintDocument_PrintPrintPage事件委托      

  CommonUtils.Printer.Print(pd);

}

posted @ 2012-06-25 21:06  小软狐  阅读(2830)  评论(0编辑  收藏  举报