博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ESC/P打印:程序控制打印机自动进退纸
阅读量:6892 次
发布时间:2019-06-27

本文共 5077 字,大约阅读时间需要 16 分钟。

打印连续纸张的时候,经常会遇到需要自动进退纸的功能,譬如下列场景:

1. 打印完一个小标;(自动进纸)
2. 用户撕断打印出来的小标;
3. (自动退纸,纸张归位) 接着打印下一个小标;

 

下列代码在爱普生LQ 730k打印机上测试通过:

1: //使用示例
2: new PrintDirect("PrinterName").PrintESC(1);//打印后进纸
3: new PrintDirect("PrinterName").PrintESC(0);//打印前退纸

 

源代码:

1: 
2:     [StructLayout(LayoutKind.Sequential)]
3:     public struct DOCINFO
4:     {
5:         [MarshalAs(UnmanagedType.LPWStr)]
6:         public string pDocName;
7:         [MarshalAs(UnmanagedType.LPWStr)]
8:         public string pOutputFile;
9:         [MarshalAs(UnmanagedType.LPWStr)]
10:         public string pDataType;
11:     }
12: 
13:     public class PrintDirect
14:     {
15:         private string PrintPort { get; set; }
16:         public PrintDirect(string port)
17:         {
18:             this.PrintPort = port;
19:         }
20: 
21:         [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
22:         public static extern long OpenPrinter(string pPrinterName, ref IntPtr phPrinter, int pDefault);
23: 
24:         [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
25:         public static extern long StartDocPrinter(IntPtr hPrinter, int Level, ref DOCINFO pDocInfo);
26: 
27:         [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
28:         public static extern long StartPagePrinter(IntPtr hPrinter);
29: 
30:         [DllImport("winspool.drv", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
31:         public static extern long WritePrinter(IntPtr hPrinter, string data, int buf, ref int pcWritten);
32: 
33:         [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
34:         public static extern long EndPagePrinter(IntPtr hPrinter);
35: 
36:         [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
37:         public static extern long EndDocPrinter(IntPtr hPrinter);
38: 
39:         [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
40:         public static extern long ClosePrinter(IntPtr hPrinter);
41: 
42:         public void PrintESC(int type)
43:         {
44:             System.IntPtr lhPrinter = new System.IntPtr();
45:             DOCINFO di = new DOCINFO();
46:             int pcWritten = 0;
47:             di.pDocName = "进退纸Document";
48:             di.pDataType = "RAW";
49: 
50:             try
51:             {
52:                 PrintDirect.OpenPrinter(this.PrintPort, ref lhPrinter, 0);
53:                 if (lhPrinter == IntPtr.Zero)
54:                 {
55:                     MessageBox.Show(string.Format("没有连接打印机或者打印机端口不是{0}!", this.PrintPort),
56:                         "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
57:                     return;
58:                 }
59:                 PrintDirect.StartDocPrinter(lhPrinter, 1, ref di);
60:                 PrintDirect.StartPagePrinter(lhPrinter);
61:                 string send = string.Empty;
62:                 for (int j = 0; j < 3; j++)
63:                 {
64:                     switch (type)
65:                     {
66:                         case 0:
67:                             send = "" + (char)(27) + (char)(64) + (char)(27) + 'j' + (char)(180);//退纸
68:                             break;
69:                         case 1:
70:                             send = "" + (char)(27) + (char)(64) + (char)(27) + 'J' + (char)(180);//进纸
71:                             break;
72:                         case 2:
73:                             send = "" + (char)(27) + (char)(64) + (char)(12);   //换行(未测试)
74:                             break;
75:                         default:
76:                             send = "" + (char)(27) + (char)(64) + (char)(12);   //换行(未测试)
77:                             break;
78:                     }
79:                     byte[] buf = new byte[80];
80:                     for (int i = 0; i < send.Length; i++)
81:                     {
82:                         buf[i] = (byte)send[i];
83:                     }
84:                     PrintDirect.WritePrinter(lhPrinter, send, send.Length, ref pcWritten);
85:                 }
86:             }
87:             catch (Exception e)
88:             {
89:                 MessageBox.Show(e.Message);
90:             }
91:             finally
92:             {
93:                 if (lhPrinter != IntPtr.Zero)
94:                 {
95:                     PrintDirect.EndPagePrinter(lhPrinter);
96:                     PrintDirect.EndDocPrinter(lhPrinter);
97:                     PrintDirect.ClosePrinter(lhPrinter);
98:                 }
99:             }
100:         }
101:     }

 本文转自Silent Void博客园博客,原文链接http://www.cnblogs.com/happyhippy/archive/2011/06/26/2090468.html,如需转载请自行联系原作者

你可能感兴趣的文章
《代码整洁之道:程序员的职业素养》一一1.1 清楚你要什么
查看>>
Red Hat 修补“libuser”库中的漏洞
查看>>
恶意版 FileZilla 窃取用户的FTP帐号
查看>>
编程语言:变革创业思维的工具
查看>>
第一个libgdx程序--仿别踩白块
查看>>
一个开源项目维护者的笔记 — 为什么我关闭 PRs
查看>>
技术人员要失业?未来80% IT 工作将自动化
查看>>
ng-book 2 —— AngularJS 2 教程
查看>>
SSH远程登录原理与运用
查看>>
Apache Spark机器学习.1.4 MLlib
查看>>
腾讯Android自动化测试实战3.1.1 什么是Robotium
查看>>
《Wireshark网络分析的艺术》—被误解的TCP
查看>>
《Linux防火墙(第4版)》——1.4 地址解析协议(ARP)
查看>>
《乐在C语言》一1.5 关键词
查看>>
Oracle内核技术揭密
查看>>
《软件工程(第4版?修订版)》—第1章1.3节什么是好的软件
查看>>
《PHP、MySQL和Apache入门经典(第5版)》一一2.7 基本安全规则
查看>>
《无线网络:理解和应对互联网环境下网络互连所带来的挑战》——2.5 3GPP2...
查看>>
《深入理解JavaScript》——2.6 JavaScript是广泛使用的吗
查看>>
Velocity官方指南-应用程序的属性
查看>>