我的应用程序需要打印发票,然后从数据库中获取发票,在一个大字符串中插入发票上的信息(告诉行,列等),之后我准备将字符串发送到打印机
我的问题是:我需要在我的大字符串中加入一些ESC / P命令/字符
我试着这样做:
char formFeed = (char)12;
Convert.ToChar(12);
MyBigString.Insert(10, formFeed);
这样,第10行将执行FormFeed,但这不起作用
注意:我将MybigString一次性发送到打印机。
为了使我的代码有效,我需要逐行将数据发送到打印机吗?
感谢您的帮助。
PS:对不起,对于我的英语,我是一名不会说英语的巴西开发人员。
答案 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不使用cFormfeed你可以解决它
cStr> LPT1; //输出到打印机dos或cmd方法,原因必须是lpt1可用。
打印出来
第一页
1 =文本,...... @
2 =文本.....
在第2页是
3 =文本.......
希望这可以提供帮助,祝你好运。