Zebra打印机直接通讯

时间:2013-09-04 03:48:44

标签: delphi zebra-printers

基于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,包含我要发送给打印机的所有命令。 请注意,我将所有命令保存到文本文件中。

好吧,如果我发送此文本文件进行打印,通过驱动程序首选项,使用工具 - >行动 - >发送文件,打印完美。

如果我使用上面的代码,它会在打印后吐出一些额外的标签行。

显然,这显示我在这里做错了,但我无法弄清楚是什么。

我尝试了什么

  • 逐个发送命令,而不是像代码中那样连接它们。 结果:什么都没打印。
  • 改变#13#10#10。 结果:同样疯狂的行为(事实上Zebra EPL documentatins说它会忽略它找到的任何#13)

我还应该尝试将Zebra工具发送到打印机的命令完全相同?

3 个答案:

答案 0 :(得分:2)

AFAIK您需要按照ExtEscape() API布局的预期格式化缓冲区。我从未使用Escape(),而是使用ExtEscape() - 它可以与Zebra打印机配合使用。

以下是what the MSDN doc states

  

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成员,因此您可能需要自己使用OpenPrinterClosePrinter

MarkPoint打印机一起工作,有点类似于Zebra打印机:如果打印机连接到串口,我会建议尝试通过连接串口直接访问打印机可以使用其中一个组件。

答案 2 :(得分:0)

您可以使用此过程:LabelFile是标签文件的完整路径,我们使用此代码并使用通用文本驱动程序打印机,并将打印机设置为默认打印机。它适用于斑马打印机和Windows XP操作系统。 https://stackoverflow.com/a/27647044/2977139 我希望这会对你有所帮助。