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

时间:2010-05-14 21:36:29

标签: c# printing command epson

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

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

我试着这样做:

        char formFeed = (char)12;
        Convert.ToChar(12);

        MyBigString.Insert(10, formFeed);

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

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

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

感谢您的帮助。

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

3 个答案:

答案 0 :(得分:5)

I've blogged about this before after having to do it myself.不要太大声地吹响我自己的号角,但我建议您阅读该条目,因为我在谈论打印机的复杂图像命令。如果你能理解,你可以打印任何东西!

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

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

注意不要使用Write(string)的{​​{1}}重载,因为它会将字符串的长度作为流中的一个字节前置,这不是您想要的。 (I also blogged about that在了解同一个项目之后也是如此。(

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

BinaryWriter
祝你好运!

答案 1 :(得分:5)

支持使用其本机命令语言绕过打印机驱动程序并直接控制打印机。 P / Invoke在KB article中有很好的解释。

当然你想这样做?温和地说,通常只使用低成本销售点热销或矩阵打印机进行尝试是不常见的。如果您不喜欢PrintDocument.PrintPage的机制,没有人这样做,您可以考虑this thread中的代码。请注意FormFeed方法。

答案 2 :(得分:0)

“.... 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命令(参见打印机手册详细信息)将任何图形打印为窗口 司机做了。

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

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

char cFormfeed = 0x0c; //或\ f

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

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

打印出来

第一页

1 =文本,...... @

2 =文本.....

在第2页是

3 =文本.......

希望这可以提供帮助,祝你好运。