求助: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
相关产品推荐
相关产品推荐

