打印连续纸张的时候,经常会遇到需要自动进退纸的功能,譬如下列场景:
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:     }

标签: ESC/P,打印,自动进纸,自动退纸

转载于:https://www.cnblogs.com/happyhippy/archive/2011/06/26/2090468.html

ESC/P打印:程序控制打印机自动进退纸相关推荐

  1. 惠普M1005打印机无法自动进纸的问题

    惠普M1005打印机无法自动进纸的问题 问题起因 其实我也不太清楚是什么起因,前一天用的好好的惠普M1005打印机,在打印时没有直接打印,会弹出一个提示对话框,同时打印机显示屏上显示"loa ...

  2. 服务器自动打印,小技巧! —让打印机自动承担打印任务

    随着各处室打印任务的逐步增多,越来越多的员工都在抱怨每次打印材料时都需要花费太长的时间进行等待,受够了这样的抱怨后单位领导终于决定再买一台与现有打印机型号完全一样的打印机了,同时领导还要求笔者让这两台 ...

  3. 打印机自动打印之前的页面的解决方法

    现象:电脑重新启动后,打印机自动打印之前的页面. 解决方法如下:(仅供参考) 1. 单击电脑左下角"开始"→"打印机和传真".在"打印机和传真&quo ...

  4. 打印时总跟出一页计算机主的纸,打印机一直出纸怎么解决

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 打印机一直出纸的解决方法如下: 1.取出所有的纸张,打印机会因为缺纸而停下来并报错. 2.双击打印机会出现任务列表,将里面的任务都 ...

  5. T6账簿打印显示打印机缺纸

    问题现象:在打印总账账簿的时候点打印显示打印机缺纸,实际有放纸进去,预览进去空白或者横线 解决方法:打开总账账簿点击表头还原然后再去打印即可,其他账簿如果也出现这个问题到相应的账表中还原一下格式即可.

  6. 爱普生LQ-635K针式打印机打链式打印纸设置自动切纸方法

    链式打印纸还有别的叫法,折叠式打印纸.复写打印纸.等分打印纸.电脑打印纸...... 其实链式打印纸是打印纸的两边带孔的具有复写功能的一种.链式打印纸可连续打印,很合适大量的使用,节约放纸时间. 链式 ...

  7. php esc p 打印,ESC/P 打印指令使用,3种票据打印方法(转)

    具体内容大家自己看!如有好的解决方案大家共同研究! (1)自定义纸张设置 控制面板->打印机和传真->右键->服务器属性->创建新的格式 (2)自定义纸张使用 this.pri ...

  8. ESC/P 打印指令使用,3种票据打印方法。

    具体内容大家自己看!如有好的解决方案大家共同研究! (1)自定义纸张设置 控制面板->打印机和传真->右键->服务器属性->创建新的格式 (2)自定义纸张使用 this.pri ...

  9. 打印PPT铺满A4纸

    好吧,我连这种小事都写进来了...其实是前段时间在打印PPT的时候,想充分利用一下A4纸张,在一页纸上尽可能多打印一些PPT,在网上搜了一下,就整理下来了. 打印PPT的时候如何铺满A4纸张(Powe ...

最新文章

  1. Unix实用工具教程:《sed与awk》修订第三版清晰版
  2. OpenStack 实现技术分解 (6) 通用库 — oslo_log
  3. HandlerThread
  4. 软件测试工程师需要具备哪些能力
  5. 初识Python(1)__Python基础
  6. 066:ORM查询条件详解-startswith和endswith:
  7. 阿里HBase高可用8年抗战回忆录
  8. Taskonomy: Disentangling Task Transfer Learning程序运行记录
  9. github 仓库管理及代码上传
  10. HDU 1212 大整数的取模运算
  11. 桌面上计算机点击后,怎样设置电脑的鼠标点击后窗口(也就是桌面上点一下出来的窗口)为自己另类设计的个性窗口图案?求高手。...
  12. 还担心学习AI没有数学基础吗?读完它们,你就有了!!!
  13. 阅读引擎开源项目调研总结
  14. sin75度用计算机咋算,sin75度等于多少啊?需要用到三角函数公式
  15. python爬虫:利用BeautifulSoup爬取链家深圳二手房首页的详细信息
  16. 怎样让PHP提示错误信息
  17. 雷电三接口有什么用_三坐标为什么用汽浮轴承?
  18. 推荐一波 Linux 网络工具
  19. git添加diff tool和merge tool
  20. 记录梦幻手游PC端辅助开发及设计思路之整体架构

热门文章

  1. java a标签正则_正则表达式:java中婚配HTML中a标签中的中文字符
  2. 计算机二级vf知识点总结,2015年计算机二级考试《VFP》复习重点:第四章
  3. bootstrapr表格父子框_使用Bootstrap Table建立父子表
  4. 广州新房都智能成这样了???
  5. 无人配送的Nuro再融5亿美元,为啥中国复刻者们没它这么火
  6. 高糊视频秒变4K!Facebook发布低分辨率视频实时渲染算法,网友:是好东西,但是玩不起...
  7. 何恺明团队最新力作RegNet:超越EfficientNet,GPU上提速5倍,这是网络设计新范式 | CVPR 2020...
  8. 美国汽车协会实测:行人检测系统都是渣渣,包括特斯拉
  9. 谷歌花35元就“骗”走刷脸数据:黑人为主,霸王条款无限使用,为强化新手机能力...
  10. 杀手级AI补代码工具问世,支持23种语言及5种主流编辑器,程序员沸腾了