使用C#将ESC命令发送到打印机

我的应用程序需要打印发票,然后从数据库中获取发票,在大字符串中插入发票上的信息(告诉行,列等),之后我准备将字符串发送到打印机。

我的问题是:我需要在我的大字符串中放入一些ESC / P命令/字符

我试着这样做:

char formFeed = (char)12; Convert.ToChar(12); MyBigString.Insert(10, formFeed); 

这样,第10行将执行FormFeed,但这不起作用

注意:我将MybigString一次性发送到打印机。

为了使我的代码有效,我需要逐行将数据发送到打印机?

谢谢您的帮助。

PS:对不起,对于我的英语,我是一名不会说英语的巴西开发人员。

绕过打印机驱动程序并使用其本机命令语言直接控制打印机是受支持的方案。 P / Invoke在这篇知识库文章中得到了很好的解释。

你肯定要这样做吗? 温和地说,通常只使用低成本销售点热销或矩阵打印机进行尝试,这种情况并不常见。 如果你不喜欢PrintDocument.PrintPage的机制,没有人这样做,你可以考虑我在这个线程中的代码。 请注意FormFeed方法。

在我不得不自己做之后,我才开始写这篇文章。 不要太大声地吹响我自己的号角,但我建议您阅读该条目,因为我在谈论打印机的复杂图像命令。 如果你能理解,你可以打印任何东西!

(我谈到ESC / POS,用于零售收据打印机,但讨论的语义也适用于ESC / P,旧的点阵语言。)

简而言之,使用BinaryWriter而不是string或者你会因为某些字符在前往打印机的路上以错误的编码被“烘焙”而无可救药地混淆(就像我一样)。 (相信我这个!在尝试用ESC / POS讲话时不要使用StringBuilder 。)

注意不要使用BinaryWriterWrite(string)重载,因为它会将字符串的长度作为流中的一个字节预先添加,这不是您想要的。 ( 我也在同一个项目上学到了很难的方法之后也写了博客 。)

然后我使用一些代码通过P / Invoking将从BinaryWriter获得的byte数组直接发送到打印机:

 private static void Print(string printerName, byte[] document) { NativeMethods.DOC_INFO_1 documentInfo; IntPtr printerHandle; documentInfo = new NativeMethods.DOC_INFO_1(); documentInfo.pDataType = "RAW"; documentInfo.pDocName = "Bit Image Test"; printerHandle = new IntPtr(0); if (NativeMethods.OpenPrinter(printerName.Normalize(), out printerHandle, IntPtr.Zero)) { if (NativeMethods.StartDocPrinter(printerHandle, 1, documentInfo)) { int bytesWritten; byte[] managedData; IntPtr unmanagedData; managedData = document; unmanagedData = Marshal.AllocCoTaskMem(managedData.Length); Marshal.Copy(managedData, 0, unmanagedData, managedData.Length); if (NativeMethods.StartPagePrinter(printerHandle)) { NativeMethods.WritePrinter( printerHandle, unmanagedData, managedData.Length, out bytesWritten); NativeMethods.EndPagePrinter(printerHandle); } else { throw new Win32Exception(); } Marshal.FreeCoTaskMem(unmanagedData); NativeMethods.EndDocPrinter(printerHandle); } else { throw new Win32Exception(); } NativeMethods.ClosePrinter(printerHandle); } else { throw new Win32Exception(); } } 

祝好运!

“…. OpenPrinter(printerName.Normalize(),out printerHandle,IntPtr.Zero)……”

可能还需要将IntPtr.Zero设置为raw。

打印机,特别是点阵,它可以直接使用DOS,CMD方法,其中最简单,更快速的打印也可以使用基本的ESC / 0x1b命令代码来控制打印机。 。 等等

作为windowos / graphic,它可以是图形和原始设置openprinter(,, printer_defaults)printer_defaults和doc-inf,请参考win32 sdk参考。

对于任何原始打印,它可以使用ESC命令(参见打印机手册详细信息)打印任何图形,如Windows驱动程序所做的那样。

作为打印原始,它只是附加前20个ascii中的任何一个,例如oxoc(formfeed)0x0doa(0x0a,0x0d,\ n或换行符)每个打印机都有轻微的ESC命令差异但是使用主ESC命令对大多数Dot都被罚款矩阵相似。

作为原始模式示例如下,FormFeed,\ n&\ r \ n

char cFormfeed = 0x0c; //或\ f

char cStr [] =“1 = text,…… @ \ n2 = text ….. \ r \ f3 = text …….”; //使用\ f不使用cFo​​rmfeed你可以解决它

cStr> lpt1; //输出到打印机dos或cmd方法,原因必须是lpt1可用。

打印出来的

第一页

1 =文本,…… @

2 =文字…..

在第2页是

3 =文本…….

希望这可以有所帮助,祝你好运。