我正在努力让Epson“ESC / POS”打印机打印条形码(使用Delphi),并想测试打印机是否有故障.你知道在哪里可以找到在“ESC / POS”中打印条形码的程序吗?我想作为最后的手段OPOS程序也可以.
此外,一个有效的演示Delphi程序也可以.到目前为止,我所有的Delphi代码片段都无效.
我使用的打印机是Epson TM-L60II
解决方法
我有一个用Delphi 5编写的用于TMT88的完整测试程序,但是这里的源代码很大,所以这里是条形码位
请注意,作为完整对象的片段,可能会丢失某些变量/函数
获取条形码字符
{** * @param a ean13 barcode numeric value * @return the escpos code for the barcode print * Description uses escpos code,return code needed to print a ean13 barcode *} function TPrintEscPosToPort.getBarcodeEscPosCode(l_ean13:String):String; var l_return:String; begin l_return := CHR(29) + 'k' + CHR(67) + CHR(12); l_return := l_return + l_ean13; // Print bar code l_return := l_return + l_ean13; // Print bar code number under thge barcode Result := l_return end;
打印到打印机
{** * @param Printer Name,Item be printed,Cut the papers after the cut,#no of copies to print * @return boolen,true if it printed * Description prints a test page to the tysso printer *} function TPrintEscPosToPort.escPosPrint(const l_printer,l_textToPrint :String;l_cutPaper:Boolean=true;l_copies:integer=1): Boolean; var l_pPort,l_pName,l_tmp:String; i,x:integer; PrinterFile: TextFile; begin // set result to false so any thing other then a good print will be false Result:= FALSE; try //Find if the printer exists,else set to defult -1 i := Printer.Printers.IndexOf(l_printer); if (i > -1) then begin Printer.PrinterIndex := i; l_pName := Printer.Printers[i]; //Get the printer name (incase its the defult and not the one passed) l_pPort := Self.getPrinterPort(l_pName) ; // get the port name from the reg end; // If true add headers and footers to the passed text if (Self.aPrintHeadersFooters) then begin l_tmp := Self.getHeader() + l_textToPrint + Self.GetFooter(); end else begin l_tmp := l_textToPrint; end; //Send the Document To the printer try for x:= 1 to l_copies do //Print multi-copies Begin //Assign the file to a tmp file in the printer port if (length(trim(l_pPort)) > 0) then AssignFile(PrinterFile,l_pPort) else begin //only use if we cant get the port //(may look bad as ctrl codes are still in place) AssignPrn(PrinterFile); l_tmp := Self.stripEscPos(l_tmp); end; Rewrite(PrinterFile); try //Send the passed Text to the printer WriteLn(PrinterFile,l_tmp); if (Self.aPrinterReset) then WriteLn(PrinterFile,escReset); // Reset the printer alignment if (l_cutPaper) then WriteLn(PrinterFile,escFeedAndCut); //Cut the paper if needed finally CloseFile(PrinterFile); Result:= true; end; end; except end; except end; end;
更新
以下是上述代码中丢失的控制代码常量,希望这些名称具有足够的描述性.
const escNewLine = chr(10); // New line (LF line Feed) escUnerlineOn = chr(27) + chr(45) + chr(1); // Unerline On escUnerlineOnx2 = chr(27) + chr(45) + chr(2); // Unerline On x 2 escUnerlineOff = chr(27) + chr(45) + chr(0); // Unerline Off escBoldOn = chr(27) + chr(69) + chr(1); // Bold On escBoldOff = chr(27) + chr(69) + chr(0); // Bold Off escNegativeOn = chr(29) + chr(66) + chr(1); // White On Black On' escNegativeOff = chr(29) + chr(66) + chr(0); // White On Black Off esc8CpiOn = chr(29) + chr(33) + chr(16); // Font Size x2 On esc8CpiOff = chr(29) + chr(33) + chr(0); // Font Size x2 Off esc16Cpi = chr(27) + chr(77) + chr(48); // Font A - Normal Font esc20Cpi = chr(27) + chr(77) + chr(49); // Font B - Small Font escReset = chr(27) + chr(64); //chr(27) + chr(77) + chr(48); // Reset Printer escFeedAndCut = chr(29) + chr(86) + chr(65); // Partial Cut and Feed escAlignLeft = chr(27) + chr(97) + chr(48); // Align Text to the Left escAlignCenter = chr(27) + chr(97) + chr(49); // Align Text to the Center escAlignRight = chr(27) + chr(97) + chr(50); // Align Text to the Right