前段时间开发项目时接触到了打印模块,以前做的打印都是托管指令集打印([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);
}