【问题标题】:Zebra Printer direct communication斑马打印机直接通信
【发布时间】:2013-09-04 03:48:43
【问题描述】:

基于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;

commands 是一个 TSringList,其中包含我要发送到打印机的所有命令。 请注意,我将所有命令都保存到了一个文本文件中。

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

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

显然,这表明我在这里做错了什么,但我不知道是什么。

我的尝试

  • 一个接一个地发送命令,而不是像在代码中那样连接它们。 结果:什么都没有打印出来。
  • 将 #10 更改为 #13#10。 结果:同样的疯狂行为(Zebra EPL 文档确实说它会忽略它找到的任何 #13)

我还应该尝试什么才能以与 Zebra 工具完全相同的方式向打印机发送命令?

【问题讨论】:

    标签: delphi zebra-printers


    【解决方案1】:

    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;
    

    请注意,如果您的命令格式不正确(例如缺少字符),它可能只会在打印机假脱机程序中产生内存不足错误 - 是的,我已经看到了!在这种情况下,您可能需要杀死然后重新启动 Printer Spooler 服务...修复您的代码...然后重试...

    按照 Zebra 文档的要求,不要忘记将 ESC 字符放在每个 commands[] 的开头。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        如果你想使用 Windows 打印机驱动程序,你应该使用 WritePrinter 定义在 WinSpool 单位。如果我没看错的话,Printers 单元中的 TPrinter 对象不会暴露它的 FPrinterHandle 成员,因此您可能需要自己使用 OpenPrinterClosePrinter

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

        【讨论】:

        • 您可以使用ExtEscape() API 直接向打印机发送命令,常规 GDI 命令。例如,当您想要对磁卡进行编码一次打印卡片布局时,这对 Zebra 来说非常方便。最新版本的 Zebra 打印机使用 USB,而旧版本使用并行/中心电子连接器。串行技巧在这里不起作用。
        • 如果您想要/需要“完全控制”,您可以连接到“\\?\LPT1”或您可以通过 QueryDosDevice 获得的 USB 设备名称,例如使用 CreateFile 和 THandleStream。
        猜你喜欢
        • 2011-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多