zoukankan      html  css  js  c++  java
  • C# winform小票打印

    (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);
    
                }
            }
    


  • 相关阅读:
    linux mint系统 cinnamon桌面 发大镜功能
    解决sublime 的 package control 问题here are no packages available for installation
    python Tkinter 的 Text 保持焦点在行尾
    pyhton 下 使用getch(), 输入字符无需回车
    python3.5 安装twisted
    SPOJ bsubstr
    AVL的删除写法的一个错误
    病毒侵袭持续中
    POJ2778 DNA sequence
    HDU3068 最长回文串
  • 原文地址:https://www.cnblogs.com/smartsmile/p/6234212.html
Copyright © 2011-2022 走看看