基于this question我已实现以下代码将直接命令发送到我的Zebra TLP2844
var
cmm: AnsiString;
i: integer;
begin
commands.saveToFile('path\to\a\file');
Printer.BeginDoc;
cmm := '';
for i := 0 to commands.Count-1 do
cmm := cmm + commands[i] + #10;
Escape(Printer.Canvas.Handle, PASSTHROUGH, Length(cmm), PAnsiChar(cmm), nil);
Printer.EndDoc;
end;
命令是一个TSringList,包含我要发送给打印机的所有命令。 请注意,我将所有命令保存到文本文件中。
好吧,如果我发送此文本文件进行打印,通过驱动程序首选项,使用工具 - >行动 - >发送文件,打印完美。
如果我使用上面的代码,它会在打印后吐出一些额外的标签行。
显然,这显示我在这里做错了,但我无法弄清楚是什么。我尝试了什么
我还应该尝试将Zebra工具发送到打印机的命令完全相同?
答案 0 :(得分:2)
AFAIK您需要按照ExtEscape()
API布局的预期格式化缓冲区。我从未使用Escape()
,而是使用ExtEscape()
- 它可以与Zebra打印机配合使用。
lpszInData [in]指向所需输入结构的指针 指定的逃脱。 缓冲区中的第一个字包含数字 输入数据的字节。缓冲区的剩余字节包含 数据本身。
所以你可以这样编码:
cmm := '00'; // reserve space for the initial `word`
for i := 0 to commands.Count-1 do
cmm := cmm + commands[i] + #10;
pword(cmm)^ := length(cmm)-2; // store the length
if ExtEscape(Printer.Canvas.Handle, PASSTHROUGH, Length(cmm), pointer(cmm), 0, nil)<0 then
raise Exception.Create('Error at printing to printer');
Printer.EndDoc;
请注意,如果您的命令格式不正确(例如缺少字符),则可能只会在打印机假脱机程序中创建内存不足错误 - 是的,我已经看到了!在这种情况下,您可能必须杀死然后重新启动打印机后台处理程序服务...修复您的代码...然后再试一次......
并且不要忘记按照Zebra文档的要求将ESC
字符放在每个commands[]
的开头。
答案 1 :(得分:0)
如果要使用Windows打印机驱动程序,则应使用WinSpool
单位WritePrinter
定义。如果我看到的正确,Printers
单元中的TPrinter对象不会公开它的FPrinterHandle
成员,因此您可能需要自己使用OpenPrinter
和ClosePrinter
。
与MarkPoint打印机一起工作,有点类似于Zebra打印机:如果打印机连接到串口,我会建议尝试通过连接串口直接访问打印机可以使用其中一个组件。
答案 2 :(得分:0)
您可以使用此过程:LabelFile是标签文件的完整路径,我们使用此代码并使用通用文本驱动程序打印机,并将打印机设置为默认打印机。它适用于斑马打印机和Windows XP操作系统。 https://stackoverflow.com/a/27647044/2977139 我希望这会对你有所帮助。