http://blog.csdn.net/jing_xin/article/details/41444063

针对BEIYANG收据打印机 BTP-R580测试通过。

操作说明:http://www.docin.com/p-395110672.html

1、一般的打印

static Font printFont; //打印使用的字体
        public static void PrintEventPage(object sender, PrintPageEventArgs e)
        {

float yPos = 0;
            int count = 0;
            float leftMargin = e.MarginBounds.Left;
            float topMargin = e.MarginBounds.Top;
            //string line = null;
            //string subs = " ";
            string context = null;

//打印字体
            printFont = new Font("宋体", 14F, FontStyle.Bold | FontStyle.Underline);
            //打印内容

context = "收银小票";
            //打印的位置
            yPos = topMargin + (count * printFont.GetHeight(e.Graphics));
            e.Graphics.DrawString(context, printFont, Brushes.Black,
            50, 10, new StringFormat());
            //换行
            count++;

e.HasMorePages = false;
        }

调用处:

System.Windows.Forms.PrintDialog PrintDialog1 = new PrintDialog();
            System.Drawing.Printing.PrintDocument docToPrint = new System.Drawing.Printing.PrintDocument();
            docToPrint.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(PrintEventPage);

PrintDialog1.AllowSomePages = true;
            PrintDialog1.ShowHelp = true;

PrintDialog1.Document = docToPrint;//把PrintDialog的Document属性设为上面配置好的PrintDocument的实例
            PrintController printController = new StandardPrintController();
            docToPrint.PrintController = printController;

DialogResult result = PrintDialog1.ShowDialog();//调用PrintDialog的ShowDialog函数显示打印对话框

//If the result is OK then print the document.
            if (result == DialogResult.OK)
            {
                docToPrint.Print();//开始打印
            }

效果:直接调出设置打印机的窗口。

2、USB打印

思路:
1、先找到USB 打印机。SetupDiGetClassDevs、SetupDiEnumDeviceInfo、SetupDiGetDeviceRegistryProperty,找到“USB 支持设备”;
2、然后就是老路,获得该USB打印机的路径,SetupDiEnumDeviceInterfaces、SetupDiGetInterfaceDeviceDetail,获得路径。(SetupDiGetClassDevs不用了,因为1中已经获得句柄集)
3、再根据路径CreateFile,后面的内容网上一搜一大堆。

步骤:
1、CreateFile
2、SetupComm
3、SetCommTimeouts
4、GetCommState
5、SetCommState
6、PurgeComm
7、WriteFile

不知道是不是绕远路了,呵呵。

参考资料:http://www.cnblogs.com/SunYu/archive/2010/04/29/1723977.html
参考代码:http://www.codeproject.com/Articles/14500/Detecting-Hardware-Insertion-and-or-Removal

USB下直接用程序访问不太方便,于是利用下面这个连接里的方法进行LPT并口转换:

http://www.yt-pos.com/ask/question.php?id=263

然后就可以连接上打印机了。

参考其他网站:

http://zhidao.baidu.com/link?url=3hhQOUVhcJdaV9tNgxNnD_SqEUgA-cesSciNvhV42a4G6Pu8u5r17m1J3HmHTud_6ZAtyQquX9gHzVoIYgaLqa

http://bbs.csdn.net/topics/390085304?page=1#post-398581498

http://www.cnblogs.com/zbo/archive/2009/07/11/1521454.html

打印输出并切纸操作:

第一点:

const uint GENERIC_READ =0x80000000;
        const uint GENERIC_WRITE = 0x40000000;     
        const int OPEN_EXISTING = 3;
        private FileStream fs=null;
        IntPtr iHandle;
        [DllImport("kernel32.dll")]
        public static extern IntPtr CreateFileA(string lpFileName, uint
dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int
dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);

[DllImport("kernel32.dll")]
        private static extern bool WriteFile(
        int hFile,
        byte[] lpBuffer,
        int nNumberOfBytesToWrite,
        ref   int lpNumberOfBytesWritten,
        ref   int i
        );

[DllImport("kernel32.dll")]
        private static extern bool CloseHandle(IntPtr hObject);

第二点:

protected void imageButton1_Click(object sender, ImageClickEventArgs e)
        {
          
            ShopCart mycart = CartCtroller.GetCart();         
           iHandle = CreateFileA("LPT1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
           if (iHandle.ToInt32() == -1)
           {
               Jscript.AjaxRunJs(this.Page, "alert('没有连接打印机或者打印机端口不是LPT1!')");
               return;
           }
           else
           {             
               fs = new FileStream(iHandle, FileAccess.ReadWrite);
             
               //for (int i = 0; i < 5; i++)
               //{
               //    fs.WriteByte(0x0A); //走纸(忘记了可能是这个)
               //}
               //StreamReader sr = new StreamReader(fs);   //读数据;  
               //StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);  //些数据;  
            
               if (mycart.Count == 0)
               {
                   Jscript.AjaxRunJs(this.Page, "alert('请先购买产品!')");
                   return;
               }

byte[] buf = new byte[500];
               char ESC = (char)(27);
               char GS =
(char)(29);                                                                                                                 
               char LF = (char)(10);

//读出数据
               StringBuilder SEND = new StringBuilder();
               //SEND.Append(LF.ToString());    
               char c1 = (char)60;
               char c2 = (char)0;
               SEND.Append(GS.ToString() + "L" + c1.ToString() + c2.ToString());
               SEND.Append(ESC + "D" + Convert.ToChar(25) + Convert.ToChar(30) + Convert.ToChar(0));
               string dt = DateTime.Now.ToString();
               string mingcheng = "产品名称:";
               string miaoshu = "产品描述:";
               string shuliang = "购买数量:";
               string zhi = "支";
               SEND.Append(LF.ToString());   
               SEND.Append("欢 迎 光 临 - 上海金福");
               SEND.Append("\r\n");
               SEND.Append("-------------------------------");
               SEND.Append(LF.ToString());
               SEND.Append("购买时间:"+dt);
               SEND.Append("\r\n");
               SEND.Append("-------------------------------");
               SEND.Append(LF.ToString());
               SEND.Append(LF.ToString());
               for (int i = 0; i < mycart.Count; i++)
               {
                   modelArrayProduct temp = (modelArrayProduct)mycart[i];                
                   SEND.Append(mingcheng + temp.T_name);
                   SEND.Append("\r\n");
                   SEND.Append(miaoshu +   temp.T_miaoshu);
                   SEND.Append("\r\n");  
                   SEND.Append(shuliang + temp.T_shuliang.ToString() + zhi);
                   SEND.Append("\r\n");  
                   SEND.Append("-------------------------------");
                   SEND.Append(LF.ToString());                   
               }

//走纸
               SEND.Append(LF.ToString());
               SEND.Append(LF.ToString());             
               SEND.Append(LF.ToString());
               SEND.Append(LF.ToString());
               SEND.Append(GS + "V" + Convert.ToChar(1));
             
                //字符类型转换
               Encoding utf8 = Encoding.GetEncoding(65001);
               Encoding gb2312 = Encoding.GetEncoding("gb2312");//Encoding.Default ,936
               byte[] tempa = utf8.GetBytes(SEND.ToString());

buf = Encoding.Convert(utf8, gb2312, tempa);
                                       
              fs.Write(buf, 0, buf.Length);
                          fs.Close();                       
           }
                 CloseHandle(iHandle);

}

C#执行批处理命令

using System.Diagnostics ;

using System.IO;

private void btnRun_Click(object sender, EventArgs e)
        {
            txtResult.Text = "";
            processCommand("Ping.exe", this.txtAddress.Text);
            processCommand("Ping.exe", this.txtAddress.Text);
        }

public void processCommand(string commandName, string argument)
        {
            ProcessStartInfo start = new ProcessStartInfo(commandName);//设置运行的命令行文件问ping.exe文件,这个文件系统会自己找到
            //如果是其它exe文件,则有可能需要指定详细路径,如运行winRar.exe
            start.WorkingDirectory = "d:\\360Downloads\\";
            start.Arguments = argument;//设置命令参数
            start.CreateNoWindow = true;//不显示dos命令行窗口
            start.RedirectStandardOutput = true;//
            start.RedirectStandardInput = true;//
            start.UseShellExecute = false;//是否指定操作系统外壳进程启动程序
            txtResult.AppendText(start.WorkingDirectory  + "\n");
            Process p = Process.Start(start);
            StreamReader reader = p.StandardOutput;//截取输出流
            string line = reader.ReadLine();//每次读取一行
            while (!reader.EndOfStream)
            {
                txtResult.AppendText(line + "\n");
                line = reader.ReadLine();
            }
            p.WaitForExit();//等待程序执行完退出进程
            p.Close();//关闭进程
            reader.Close();//关闭流
        }

以上均测试成功。

补充BEIYANG BTP-R580相关参数:

主要参数  
打印方式 热敏打印 分辨率 203×203dpi
最高打印速度 230mm/s 打印宽度(mm) 80
基本参数  
打印方式 热敏打印 分辨率 203×203dpi
最高打印速度 230mm/s    
高级参数  
打印宽度(mm) 80 打印方向 双向打印
纸张种类 连续纸, 标记纸, 标签纸 纸张厚度 0.06mm-0.1mm
字体 ASCII(12×24), 压缩 ASCII(9×17), 国标宋体I, Ⅱ级(24×24), 国际字符 供纸方式 自动
接口类型 并行接口(IEEE 1284), RS-232, RS-485/422串行接口, USB接口, Ethernet接口, WLAN接口可选    
电源参数  
电源电压(V) 220±10% 电源频率(Hz) 50-60
外观参数  
颜色 黑色 重量(Kg) 1.3
高度(mm) 147 宽度(mm) 147
长度(mm) 205    

测试打印机二:

ESPON TM TM58 票据打印机

爱普生 T58 基本参数
产品类型: 微型热敏打印机
打印方式: 热敏式
打印宽度: 32/16
缓冲区: 2KB
接口类型: RS-232,Bi-directionalparallel
爱普生 T58 打印性能
打印速度: 最大100mm/sec
打印分辨率: 360dpi
字符集: 95Alphanumeric,37 International,128×1Graphic
字体: 12×24(ANK)/24×24(Chinese)
爱普生 T58 介质规格
介质宽度: 57.5±0.5mm
介质厚度: 0.06-0.07mm
爱普生 T58 其它参数
平均无故障时间: 160000小时
产品尺寸: 116×204×137mm
产品重量: 1.3kg
系统平台: Windows2000/XP
电源电压: DC24V(±7%),1.1A
其它特性: 字符尺寸:1.25×3.0mm/2.5×3.0mm
每英寸字符数:16.9cpi/10.2cpi
D.K.D.功能:2drives
外壳颜色:ECW
安全标准:CCC
电源:Exclusive AC adapter(included)
配件:AC adapter,I/F cable,User’s manual
安全标准:UL/CSA/T+V(E N60950)

另参考:

http://blog.csdn.net/guoyong4321/article/details/7079333

C# winform打印总结 z的更多相关文章

  1. WinForm打印

    WinForm打印要用打印控件: PageSetupDialog:打印设置对话框 PrintDialog:打印对话框 PrintDocument:要打印的对象,非常重要 PrintPreviewCon ...

  2. c# winform打印excel(使用NPOI+Spire.xls+PrintDocument直接打印excel)

    前言 c#做winform程序要求生成并打印Excel报告,为了不安装Office相应组件,我选择了NPOI来生成Excel报告,用winform的PrintDocument控件来触发打印操作,而难点 ...

  3. winForm 打印预览

    自己很少写技术博客,虽然已经干程序员两年多了,winform开发,web开发都干过,不论项目大小对于.net的相关技术也是了解的,如mvc,wcf,wpf,silverlight,socekt通讯,n ...

  4. [asp.net]c# winform打印类

    using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using ...

  5. winform 打印控件

    (1)PageSetupDialog1    打印设置窗口  (2)PrintDocument     向打印机输送的对象 事件:PrintPage   对于打印的每一页都执行一次 (3)PrintP ...

  6. DevExpress打印功能 z

    一.打印功能说明: 打印功能,我们有多种实现方式,可以根据需要自行选择,我简单的总结下两种方法. (1).使用微软.net框架自带的PrintDocument,这种方式是直接借助Graphics,自行 ...

  7. Winform 打印PDF顺序混乱,获取打印队列

    工作中PDF打印顺序混乱着实让我疼痛了好久,其实决绝方法非常简单,但没有想到这个点子的时候确实让我走了很多弯路 这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享出来而已,同时也做个记录,方 ...

  8. WinForm打印之页边距

    1.启用页边距: 默认情况下PrintDocument是不理会页边距的(MS再次让人无语...),这也是为什么有人说明明设了页边距在打印预览里却没有效果的原因. 解决办法是设置PrintDocumen ...

  9. 【2017-05-03】winform打印控件、事件对象和事件数据、MDI窗体容器

    一.打印控件 第一步先把打印对象搞出来. - printDocument    打印对象(将要打印的内容放到该对象里,从该对象里取内容打印) 设置他的PrintPage事件(对于要打印的每一页触发一次 ...

随机推荐

  1. P2P金融

    P2P金融又叫P2P信贷,是互联网金融(ITFIN)的一种.意思是:点对点. P2P金融指不同的网络节点之间的小额借贷交易(一般指个人),需要借助电子商务专业网络平台帮助借贷双方确立借贷关系并完成相关 ...

  2. Struts2笔记——Action校验器

    在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验.  对于输入校验struts2提供了两种实现方法: 1.采用手工编写代码实现. 2.基于XML配置 ...

  3. WPF之通过EventTrigger修改模板中元素的属性

    前言:对于此操作,我只想说是微软的神经,还是我的笨蛋.为什么EventTrigger就不能像Trigger那样直接设置Property以及Value就对属性进行操作,而必须要放一个Action,而默认 ...

  4. 269. Alien Dictionary

    题目: There is a new alien language which uses the latin alphabet. However, the order among letters ar ...

  5. CentOS中的chkconfig命令

    chkconfig:    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接.语法:    ...

  6. Fiddler如何抓取使用了SSL或TLS传输的Android App流量

    上篇文章介绍了Burpsuite如何抓取使用了SSL或TLS传输的Android App流量, 那么使用Fiddler的时候其实 也会出现与burpsuite同样的情况,解决方案同样是需要将Fiddl ...

  7. Eclipse中user library包管理

    1.整理jar 2.将整理出的jar包在Eclipse中分别设置为用户librarywindow -> preferences -> java -> build path -> ...

  8. Javascript获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度

    /******************** * 取窗口滚动条高度  ******************/function getScrollTop(){    var scrollTop=0;    ...

  9. Difference between Pragma and Cache-control headers?

    Pragma is the HTTP/1.0 implementation and cache-control is the HTTP/1.1 implementation of the same c ...

  10. ERP

    企业资源计划即 ERP (Enterprise Resource Planning),由美国 Gartner Group 公司于1990年提出.企业资源计划是 MRP II(企业制造资源计划)下一代的 ...