C# 热敏打印机 小票打印机 打印图片

来源:互联网 发布:ubuntu查看内存详情 编辑:程序博客网 时间:2024/06/11 20:47

这两天一直在研究热敏小票打印机打印图片的问题,在经过痛苦的找资料过程后,终于实验成功了。经过一番测试和修改,代码终于出炉了,这次打印条形码、二维码、Logo就方便多了。

这个代码在爱普生EPSON的代码上更改的,在思普瑞特(SPRT)SP-POS58III热敏小票打印机上实验成功,吉成GS-58系列上没有实验成功。唯拓VT-58G、佳博GP-80XXX等,由于暂时没有这些打印机,所以没及时测试。吉成GS-58系列上的问题暂时不知道什么问题。所以如果你是吉成的小票机,或许你可以参考参考代码,但不保证可用。



这份代码是通过Socket连接到网络打印机进行打印的,本地的暂时没有测试,所以没有发。PrintLine方法是打印字符的,而PrintPic方法,则是打印图片的。初始化的时候,要给定网络打印机的ip。


经过测试,二维码的图片最好用200x200的,条形码则可以用300x200的。


using System;using System.Collections.Generic;using System.Drawing;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;namespace POSPrinter{    ///   <summary>     ///   POSPrinter的摘要说明。    ///   此类处理网络打印,使用了IP端口.    ///   </summary>     public class NetPOSPrinter     {        string ipPort = "127.0.0.1";        public NetPOSPrinter()        {        }        public NetPOSPrinter(string IpPort)        {            this.ipPort = IpPort;//打印机端口         }        ///   <summary>         ///   输出文字到打印机         ///   </summary>         ///   <param   name= "str "> 要打印的内容 </param>         public void PrintLine(string str)        {            //建立连接            IPAddress ipa = IPAddress.Parse(ipPort);            IPEndPoint ipe = new IPEndPoint(ipa, 9100);//9100为小票打印机指定端口            Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            soc.Connect(ipe);            //string str= "hello,123456789,大家好! ";            byte[] b = System.Text.Encoding.GetEncoding("GB2312").GetBytes(str);            soc.Send(b);            soc.Close();        }        public void PrintPic(Bitmap bmp)        {            //把ip和端口转化为IPEndPoint实例            IPEndPoint ip_endpoint = new IPEndPoint(IPAddress.Parse(ipPort), 9100);            //创建一个Socket            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //连接到服务器            socket.Connect(ip_endpoint);            //应对同步Connect超时过长的办法,猜测应该是先用异步方式建立以个连接然后,            //确认连接是否可用,然后报错或者关闭后,重新建立一个同步连接                                //socket.SendTimeout = 1000;            //初始化打印机,并打印            Byte[] byte_send = Encoding.GetEncoding("gb18030").GetBytes("\x1b\x40");            //发送测试信息            socket.Send(byte_send, byte_send.Length, 0);            byte[] data = new byte[] { 0x1B, 0x33, 0x00 };            socket.Send(data, data.Length, 0);            data[0] = (byte)'\x00';            data[1] = (byte)'\x00';            data[2] = (byte)'\x00';    // Clear to Zero.            Color pixelColor;            // ESC * m nL nH 点阵图            byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x00, 0x00, 0x00 };            escBmp[2] = (byte)'\x21';            //nL, nH            escBmp[3] = (byte)(bmp.Width % 256);            escBmp[4] = (byte)(bmp.Width / 256);            // data            for (int i = 0; i < (bmp.Height / 24) + 1; i++)            {                socket.Send(escBmp, escBmp.Length, 0);                for (int j = 0; j < bmp.Width; j++)                {                    for (int k = 0; k < 24; k++)                    {                        if (((i * 24) + k) < bmp.Height)   // if within the BMP size                        {                            pixelColor = bmp.GetPixel(j, (i * 24) + k);                            if (pixelColor.R == 0)                            {                                data[k / 8] += (byte)(128 >> (k % 8));                            }                        }                    }                    socket.Send(data, 3, 0);                    data[0] = (byte)'\x00';                    data[1] = (byte)'\x00';                    data[2] = (byte)'\x00';    // Clear to Zero.                }                                byte_send = Encoding.GetEncoding("gb18030").GetBytes("\n");                //发送测试信息                socket.Send(byte_send, byte_send.Length, 0);            } // data            byte_send = Encoding.GetEncoding("gb18030").GetBytes("\n");            //发送测试信息            socket.Send(byte_send, byte_send.Length, 0);            socket.Close();        }        ///   <summary>         ///   打开钱箱         ///   </summary>         public void OpenCashBox()        {            IPAddress ipa = IPAddress.Parse(ipPort);            IPEndPoint ipe = new IPEndPoint(ipa, 9100);//9100为小票打印机指定端口            Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            soc.Connect(ipe);            char[] c = { Convert.ToChar(27), 'p', Convert.ToChar(0), Convert.ToChar(60), Convert.ToChar(255) };            byte[] b = System.Text.Encoding.GetEncoding("GB2312").GetBytes(c);            soc.Send(b);            soc.Close();        }    }}

(如果代码中提示Bitmap 不能识别,则要添加System.Windows.Forms和System.Drawing的引用。


调用方法:

        NetPOSPrinter posPrinter = new NetPOSPrinter(txtIP.Text);        posPrinter.PrintPic(new Bitmap(pictureBox1.Image));




       并口打印的例子可以参见小蒋的博文《C#并口热敏小票打印机打印位图》。

       网口热敏打印机机和并口热敏打印机打印图片的实例均可以在这里 下载。

原创粉丝点击