您的位置:首页 > 编程语言 > C#

C# winform小票打印

2014-03-27 15:06 411 查看
(1)自定义纸张设置

控制面板->打印机和传真->右键->服务器属性->创建新的格式

(2)自定义纸张使用

this.printDocument1.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("NewPrint", iWidth, iHeight);

NewPrint:制定一纸张名称。  iWidth:纸张使用宽度。  iHeight:纸张使用高度。

iWidth,iHeight 可以在使用过程中调整。

例如:iWidth=923,iHeight=480

(3)ESC/P指令使用

using System;
using System.Runtime.InteropServices;
using System.Data;
using System.IO;
using System.Windows.Forms;

namespace PrintDome
{
class ClsPrintLPT
{
private IntPtr iHandle;
private FileStream fs;
private StreamWriter sw;

private string prnPort = "LPT1";   //打印机端口

public ClsPrintLPT()
{

}

private const uint GENERIC_READ = 0x80000000;
private const uint GENERIC_WRITE = 0x40000000;
private const int OPEN_EXISTING = 3;

/// <summary>
/// 打开一个vxd(设备)
/// </summary>
[DllImport("kernel32.dll", EntryPoint = "CreateFile", CharSet = CharSet.Auto)]
private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes,
int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);

/// <summary>
/// 开始连接打印机
/// </summary>
private bool PrintOpen()
{
iHandle = CreateFile(prnPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

if (iHandle.ToInt32() == -1)
{
MessageBox.Show("没有连接打印机或者打印机端口不是LPT1!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return false;
}
else
{
fs = new FileStream(iHandle, FileAccess.ReadWrite);
sw = new StreamWriter(fs, System.Text.Encoding.Default);   //写数据
return true;
}
}

/// <summary>
/// 打印字符串
/// </summary>
/// <param name="str">要打印的字符串</param>
private void PrintLine(string str)
{
sw.WriteLine(str); ;
}

/// <summary>
/// 关闭打印连接
/// </summary>
private void PrintEnd()
{
sw.Close();
fs.Close();
}

/// <summary>
/// 打印票据
/// </summary>
/// <param name="ds">tb_Temp 全部字段数据集合</param>
/// <returns>true:打印成功 false:打印失败</returns>
public bool PrintDataSet(DataSet dsPrint)
{
try
{
if (PrintOpen())
{
PrintLine(" ");
PrintLine("[XXXXXXXXXXXXXXXXXX超市]");
PrintLine("NO :      " + dsPrint.Tables[0].Rows[0][1].ToString());
PrintLine("XXXXXX: " + dsPrint.Tables[0].Rows[0][2].ToString());
PrintLine("XXXXXX: " + dsPrint.Tables[0].Rows[0][3].ToString());
PrintLine("XXXXXX: " + dsPrint.Tables[0].Rows[0][4].ToString());
PrintLine("XXXXXX: " + dsPrint.Tables[0].Rows[0][5].ToString());
PrintLine("操 作 员: " + dsPrint.Tables[0].Rows[0][6].ToString() + " " + dsPrint.Tables[0].Rows[0][7].ToString());
PrintLine("-------------------------------------------");
}
PrintEnd();

return true;
}
catch
{
return false;
}
}

/// <summary>
/// ESC/P 指令
/// </summary>
/// <param name="iSelect">0:退纸命令 1:进纸命令 2:换行命令</param>
public void PrintESC(int iSelect)
{
string send;

iHandle = CreateFile(prnPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

if (iHandle.ToInt32() == -1)
{
MessageBox.Show("没有连接打印机或者打印机端口不是LPT1!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
fs = new FileStream(iHandle, FileAccess.ReadWrite);
}

byte[] buf = new byte[80];

switch (iSelect)
{
case 0:
send = "" + (char)(27) + (char)(64) + (char)(27) + 'j' + (char)(255);    //退纸1 255 为半张纸长
send = send + (char)(27) + 'j' + (char)(125);    //退纸2
break;
case 1:
send = "" + (char)(27) + (char)(64) + (char)(27) + 'J' + (char)(255);    //进纸
break;
case 2:
send = "" + (char)(27) + (char)(64) + (char)(12);   //换行
break;
default:
send = "" + (char)(27) + (char)(64) + (char)(12);   //换行
break;
}

for (int i = 0; i < send.Length; i++)
{
buf[i] = (byte)send[i];
}

fs.Write(buf, 0, buf.Length);
fs.Close();
}
}
}

---------------------------------------------------------------------------------------------------------------

使用例1(LPT打印):

 printLPT.PrintESC(0);  //打印前退纸

 printLPT.PrintDataSet(dsPrint);

 printLPT.PrintESC(1);  //打印后进纸

使用例2(水晶报表打印):

this.reportDocument1.Load(Application.StartupPath + "\\Temp.rpt");
PageMargins pMaargins;
pMaargins = reportDocument1.PrintOptions.PageMargins;
pMaargins.topMargin = 5;
pMaargins.bottomMargin = 0;
pMaargins.leftMargin = 5;
pMaargins.rightMargin = 0;
reportDocument1.PrintOptions.ApplyPageMargins(pMaargins);

reportDocument1.Refresh();
reportDocument1.SetDataSource(dsPrint);
//reportDocument1.PrintOptions.PrinterName = "Microsoft Office Document Image Writer";

printLPT.PrintESC(0);  //打印前退纸
reportDocument1.PrintToPrinter(1, false, 0, 0);
timer1.Enabled = true;

使用例3(printDocument 打印):

this.printDocument1.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("NewPrint", iWidth, iHeight);
printLPT.PrintESC(0);  //打印前退纸
this.printDocument1.Print();

-----------------------------------PrintPage()----------------------------------------------------------

int iX;
int iY;

int iTopMargin = 35;         //顶边距
int iLeftMargin = 70;//左边距
int iButtomMargin = 40;//底边距

int iMarginX = 25;                                        //文字间距
int iMarginY = 25;                                        //文字行距

int icellTopMargin = 12;   //单元格顶边距
int icellLeftMargin = 12;  //单元格左边距

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Font titleFont = new Font("宋体", 16, FontStyle.Bold);//标题字体
Font fntTxt = new Font("宋体", 11, FontStyle.Regular);    //正文文字

Brush brush = new SolidBrush(Color.Black);//画刷
Pen pen = new Pen(Color.Black);           //线条颜色

try
{
string sTitle = "<<XXXXXXXXXXXXXXXXXXXXXXXXX>>";

//string sDataTitle = "No: " + dsPrint.Tables[0].Rows[0][1].ToString() + "    " +
//                    "XXXXX: " + dsPrint.Tables[0].Rows[0][17].ToString() + "     " +
//                    "XXXXX: " + dsPrint.Tables[0].Rows[0][19].ToString() + " " + dsPrint.Tables[0].Rows[0][18].ToString();

string sDataTitle = "No: " + dsPrint.Tables[0].Rows[0][1].ToString() + "    " +
"XXXXX: " + dsPrint.Tables[0].Rows[0][17].ToString() + "     " +
"XXXXX: " + dsPrint.Tables[0].Rows[0][19].ToString();

int width = e.PageBounds.Width;
int height = e.PageBounds.Height;
//int xoffset = (int)((width - e.Graphics.MeasureString(sTitle, titleFont).Width) / 2);
//int xoffset2 = (int)((width - e.Graphics.MeasureString(sDataTitle, fntTxt).Width) / 2);

//e.Graphics.DrawString(sTitle, titleFont, brush, xoffset, iTopMargin);                                 //标题
//e.Graphics.DrawString(sDataTitle, fntTxt, brush, xoffset2, iTopMargin += iTopMargin + 5);                  //副标题数据

e.Graphics.DrawString(sTitle, titleFont, brush, iLeftMargin + 140, iTopMargin);                                 //标题
e.Graphics.DrawString(sDataTitle, fntTxt, brush, iLeftMargin + 60, iTopMargin += 35);                  //副标题数据

iMarginX = iLeftMargin + icellLeftMargin;
iMarginY = iTopMargin + 25 + icellTopMargin;
iX = iLeftMargin;
iY = iTopMargin + 25;

e.Graphics.DrawLine(pen, new Point(iX, iY), new Point(iX, iY + 110));        //最左边的竖线
e.Graphics.DrawLine(pen, new Point(iX, iY), new Point(iX + 670, iY));        //最上边的竖线

string sCell = "XXXXX: ";

int iCellWidth = (int)((e.Graphics.MeasureString(sCell, fntTxt).Width));
int iCellHeight = (int)((e.Graphics.MeasureString(sCell, fntTxt).Height));

e.Graphics.DrawString("XXXXX: ", fntTxt, brush, new Point(iMarginX, iMarginY));
e.Graphics.DrawLine(pen, new Point(iX += 2 * icellLeftMargin + iCellWidth, iY), new Point(iX, iY + 110));        //1
e.Graphics.DrawString(dsPrint.Tables[0].Rows[0][2].ToString(), fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + iCellWidth, iMarginY));
e.Graphics.DrawLine(pen, new Point(iX += 2 * icellLeftMargin + 100, iY), new Point(iX, iY + 110));        //2
e.Graphics.DrawString("XXXXX: ", fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + 100, iMarginY));
e.Graphics.DrawLine(pen, new Point(iX += 2 * icellLeftMargin + iCellWidth, iY), new Point(iX, iY + 110));        //3
e.Graphics.DrawString(dsPrint.Tables[0].Rows[0][3].ToString(), fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + iCellWidth, iMarginY));
e.Graphics.DrawLine(pen, new Point(iX += 2 * icellLeftMargin + 100, iY), new Point(iX, iY + 110));        //4
e.Graphics.DrawString("XXXXX: ", fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + 100, iMarginY));
e.Graphics.DrawLine(pen, new Point(iX += 2 * icellLeftMargin + iCellWidth, iY), new Point(iX, iY + 110));        //5
e.Graphics.DrawString(dsPrint.Tables[0].Rows[0][4].ToString() + " KG", fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + iCellWidth, iMarginY));
e.Graphics.DrawLine(pen, new Point(iX += 2 * icellLeftMargin + 100, iY), new Point(iX, iY + 110));        //6

iMarginX = iLeftMargin + icellLeftMargin;
iMarginY = iTopMargin + 20 + iCellHeight + 3 * icellTopMargin;

iX = iLeftMargin;
iY = iTopMargin + 20 + iCellHeight + 2 * icellTopMargin;

e.Graphics.DrawLine(pen, new Point(iX, iY), new Point(iX + 670, iY));        //最下边的竖线

e.Graphics.DrawString("XXXXX: ", fntTxt, brush, new Point(iMarginX, iMarginY));
e.Graphics.DrawString(dsPrint.Tables[0].Rows[0][13].ToString() + " KG", fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + iCellWidth, iMarginY));
e.Graphics.DrawString("XXXXX: ", fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + 100, iMarginY));
e.Graphics.DrawString(dsPrint.Tables[0].Rows[0][14].ToString() + " KG", fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + iCellWidth, iMarginY));
e.Graphics.DrawString("XXXXX: ", fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + 100, iMarginY));
e.Graphics.DrawString(dsPrint.Tables[0].Rows[0][15].ToString(), fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + iCellWidth, iMarginY));

iMarginX = iLeftMargin + icellLeftMargin;
iMarginY = iTopMargin + 20 + iCellHeight + 6 * icellTopMargin;

iX = iLeftMargin;
iY = iTopMargin + 20 + iCellHeight + 5 * icellTopMargin;

e.Graphics.DrawLine(pen, new Point(iX, iY), new Point(iX + 670, iY));        //最下边的竖线

e.Graphics.DrawString("XXXXX: ", fntTxt, brush, new Point(iMarginX, iMarginY));
e.Graphics.DrawString(dsPrint.Tables[0].Rows[0][8].ToString(), fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + iCellWidth, iMarginY));
e.Graphics.DrawString("XXXXX: ", fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + 100, iMarginY));
e.Graphics.DrawString(dsPrint.Tables[0].Rows[0][10].ToString(), fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + iCellWidth, iMarginY));
e.Graphics.DrawString("XXXXX: ", fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + 100, iMarginY));
e.Graphics.DrawString(dsPrint.Tables[0].Rows[0][12].ToString(), fntTxt, brush, new Point(iMarginX += 2 * icellLeftMargin + iCellWidth, iMarginY));

iX = iLeftMargin;
iY = iTopMargin + 20 + iCellHeight + 8 * icellTopMargin;

e.Graphics.DrawLine(pen, new Point(iX, iY), new Point(iX + 670, iY));        //最下边的竖线

e.Graphics.DrawLine(pen, new Point(0, iY += iButtomMargin), new Point(e.PageBounds.Width, iY));        //最下边的竖线

}
catch
{
MessageBox.Show(this, "数据库连接错误,打印失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: