You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Delphi程序调用Intermec PX4i打印机打印标签失败

Intermec PX4i打印机Delphi集成问题:Fingerprint指令可在Terminal执行但程序无法打印

我用Delphi编写程序实现Intermec PX4i打印机打印标签,在Fingerprint Terminal中输入对应指令能正常打印,但自己编写的基础Delphi程序未抛出任何异常,却无法完成打印。求有该打印机集成经验的用户提供示例或解决建议,我的代码如下:

procedure TForm1.ButtonPrintLabelClick(Sender: TObject);
begin
  if Printer.Printers.Count = 0 then
  begin
    ShowMessage('No printers available.');
    Exit;
  end;
  CustomPrintLabel;
end;

procedure TForm1.CustomPrintLabel;
var
  PrinterText: TStringList;
begin
  PrinterText := TStringList.Create;
  ShowMessage('Test2');
  try
    PrinterText.Add('BF ON:BF "Swiss 721 BT",6:PP 10,10:PX 430,340,15:PP 30,30:PM "GLOBE.1":PP 75,270:BT "CODE39":PB "ABC":PP 75,220:FT "Swiss 721 BT",6:PT "My FIRST label":PF ');

    Printer.Title := 'Print Job Title';
    Printer.BeginDoc;

    // Print the label text
    Printer.Canvas.TextOut(10, 10, PrinterText.Text);

    Printer.EndDoc;
  finally
    PrinterText.Free;
  end;
end;        

问题根源

你的代码错误地使用Printer.Canvas.TextOut将Fingerprint指令作为普通文本输出,VCL的Printer组件是用于绘制图形/文本的,它会把内容转换成Windows GDI格式,而非直接发送打印机原生的Fingerprint命令流,所以打印机无法识别这些指令。

解决方案:直接发送RAW指令给打印机

Intermec PX4i需要直接接收原始的Fingerprint命令,你可以通过Windows打印API的RAW模式发送指令,示例代码如下:

procedure TForm1.ButtonPrintLabelClick(Sender: TObject);
begin
  if Printer.Printers.Count = 0 then
  begin
    ShowMessage('无可用打印机');
    Exit;
  end;
  CustomPrintLabel;
end;

procedure TForm1.CustomPrintLabel;
var
  PrinterHandle: THandle;
  DocInfo: TDocInfo1;
  BytesWritten: DWORD;
  FingerprintCmd: AnsiString;
  PrinterName: string;
begin
  // 替换为你的Intermec PX4i打印机准确名称,可从Printer.Printers列表中获取
  PrinterName := 'Intermec PX4i';
  PrinterHandle := OpenPrinter(PChar(PrinterName), nil, nil);
  
  if PrinterHandle = 0 then
  begin
    ShowMessage('无法打开打印机:' + PrinterName);
    Exit;
  end;

  try
    // 设置打印文档信息,指定RAW数据类型
    DocInfo.pDocName := PChar('标签打印任务');
    DocInfo.pOutputFile := nil;
    DocInfo.pDatatype := PChar('RAW');

    if StartDocPrinter(PrinterHandle, 1, @DocInfo) = 0 then
    begin
      ShowMessage('无法启动打印任务');
      Exit;
    end;

    if StartPagePrinter(PrinterHandle) = 0 then
    begin
      EndDocPrinter(PrinterHandle);
      ShowMessage('无法启动打印页');
      Exit;
    end;

    // 原始Fingerprint指令,与Terminal中使用的完全一致
    FingerprintCmd := 'BF ON:BF "Swiss 721 BT",6:PP 10,10:PX 430,340,15:PP 30,30:PM "GLOBE.1":PP 75,270:BT "CODE39":PB "ABC":PP 75,220:FT "Swiss 721 BT",6:PT "My FIRST label":PF ';
    
    // 发送指令到打印机
    if not WritePrinter(PrinterHandle, PAnsiChar(FingerprintCmd), Length(FingerprintCmd), BytesWritten) then
    begin
      ShowMessage('发送打印指令失败');
    end;

    // 结束打印页和任务
    EndPagePrinter(PrinterHandle);
    EndDocPrinter(PrinterHandle);
  finally
    ClosePrinter(PrinterHandle);
  end;
end;

关键注意事项

  • 打印机名称必须准确:从Printer.Printers列表中复制打印机的完整名称,避免拼写错误
  • 指定RAW数据类型:这是核心,确保Windows不会对指令进行格式转换,直接传递给打印机
  • 指令一致性:确保代码中的Fingerprint指令与你在Terminal中测试的完全一致,注意引号不需要转义(直接用双引号即可)
  • 网络打印机适配:如果是网络连接的打印机,确保网络通畅,且打印机开启了9100 RAW端口(Intermec打印机默认开启)

内容的提问来源于stack exchange,提问作者HJ76

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:47:05