通用的SATO條碼列印軟體
SATO條碼印表機,是一款比較好用的印表機。很多工礦企業,機場等對穩定性和效能要求比較高的場所,都會選用。偷下懶,目前還沒有把它做成一個通用的條碼列印軟體。SATO條碼印表機本身不提供類似於驅動程式介面的列印方式,只能使用底層的印表機指令集來列印,剛開始摸索了一段,最後還是解決了問題。
我把最關鍵的原始碼貼出來,Delphi的:
1 列印部分
procedure TPkFrm.WriteToPrinter(psPrinterName,psStr: string; piPrintQty: integer);
var
Handle: THandle;
N: DWORD;
DocInfo1: TDocInfo1;
lsPrintESC: string;
begin
//PrinterName: 印表機名字(如:EPSON LQ-1600K等),S為印表機的ESC指令集等。
// ShowMessage(IntToStr(iPrintBarcode )+' = '+Printer.Printers[iPrintBarcode] + ' iPrintLabel = '+IntToStr(iPrintLabel ));
if not OpenPrinter(PChar(psPrinterName), Handle, nil) then
CreateError('列印條碼時出錯!無法得到條碼印表機'+IntToStr(GetLastError),nil,1);
with DocInfo1 do begin
pDocName := PChar('SATO條碼正在列印:'+psStr);
pOutputFile := nil;
pDataType := 'RAW';
end;
StartDocPrinter(Handle, 1, @DocInfo1);
StartPagePrinter(Handle);
//列印指令:開始
lsPrintESC := Chr(27)+'A';
WritePrinter(Handle, PChar(lsPrintESC), Length(lsPrintESC), N);
//page size
lsPrintESC := Chr(27)+'A1'+'1216'+'3776';
WritePrinter(Handle, PChar(lsPrintESC), Length(lsPrintESC), N);
//1,2,3
lsPrintESC := Chr(27)+'#E3';
WritePrinter(Handle, PChar(lsPrintESC), Length(lsPrintESC), N);
//aduject start point
// S := Chr(27)+'A3V'+edt9.Text +'H'+edt10.Text;
// WritePrinter(Handle, PChar(S), Length(S), N);
//列印指令:條碼 {BG Code128
//S := Chr(27)+'V0020' + #27 + 'H0001' + #27 + 'BG04260' + '2ZC100126614134523507';
lsPrintESC := Chr(27)+'V0040' +Chr(27)+'H0001'+ Chr(27)+'BG04256' + psStr;
WritePrinter(Handle, PChar(lsPrintESC), Length(lsPrintESC), N);
//列印指令:條碼字元
lsPrintESC := Chr(27)+'V0320'+Chr(27)+'H0320'+ Chr(27)+'L0101'+Chr(27)+'P03'+Chr(27)+'WB1'+psStr;
WritePrinter(Handle, PChar(lsPrintESC), Length(lsPrintESC), N);
//列印指令:份數
lsPrintESC := Chr(27)+'Q'+IntToStr(piPrintQty);
WritePrinter(Handle, PChar(lsPrintESC), Length(lsPrintESC), N);
//列印指令:結束
lsPrintESC := Chr(27)+'Z';
WritePrinter(Handle, PChar(lsPrintESC), Length(lsPrintESC), N);
EndPagePrinter(Handle);
EndDocPrinter(Handle);
ClosePrinter(Handle);
end;
2 調用列印部分
procedure TPkFrm.PrintMode2(psPrintFile: string; piPrintLabelQty,piPrintBarcodeQty: integer);
var
liOriPrinterIndex: integer;
begin
liOriPrinterIndex := Printer.PrinterIndex; //把原來的預設印表機號儲存起來,以便恢複
//注意,這種方式列印,是通過印表機順序號來自動分配要打的內容,所以不必指定一個預設印表機
//每打一個內容,動態指定一個預設印表機
//1 先打標籤
//打標籤前,先把打標籤的印表機設定為預設值,注意這一點很重要,要指導使用者正確設定哪台是標籤用的印表機
try
Printer.PrinterIndex:=GetPrintIndexFromName(sPrintLabel);
BarCodePrint.LoadFromFile(psPrintFile);
SetLabelColor(CDSMaster.FieldByName('OldDescr').AsString);
BarCodePrint.PrepareReport;
//列印份數,根據使用者要求來定。一般單排列印兩份,雙排列印一份
BarCodePrint.PrintPreparedReport('',piPrintLabelQty,True,frall)
except
CreateError('列印標籤時出錯!可能是標籤印表機編號設定不正確等原因',nil,1);
end;
//2 再打條碼
//打標籤前,先把打條碼的印表機設定為預設值,注意這一點很重要,要指導使用者正確設定哪台是條碼用的印表機
try
//Printer.PrinterIndex:=iPrintBarcode;
//列印份數,根據標籤來定。一個標籤要打兩個條碼
WriteToPrinter(sPrintBarcode,CDSMaster.FieldbyName('NewPkCode').AsString,piPrintBarcodeQty); //條碼印表機順序號,條碼內容,份數
except
CreateError('列印條碼時出錯!可能是條碼印表機編號設定不正確等原因',nil,1);
end;
//恢複到原先設定的預設印表機
try
Printer.PrinterIndex := liOriPrinterIndex;
except
end;
end;
主要支援SATO CL系列的,如SATO CL612e條碼印表機,SATO CL408e/412e 條碼印表機,SATO CL608e/612e 條碼印表機。
SATO CL608e/612e 條碼印表機
寬幅工業級條碼印表機,熱轉印/熱敏方式,列印速度可達 4英寸-8英寸/秒,
列印各式標籤、服飾吊牌、洗滌布標、或特殊用,途貼紙等工商業運用