delphi:斑马打印机ZPL指令打印中文及二维码

一、中文生成BMP图片,需要注意的BMP图片要使用1BIT的,主要是下载快,图像清晰

        使用GetTextExtentPoint32函数获取中文字符的长和高后设置为BMP的width和height

       这样图片大小就和文字大小完全样了

       

function PrintBMP(const bmp:Tbitmap):boolean;
var
  p: pbyte;
  i, j, n, m, mm, nWidth: integer;
  s: AnsiString;
begin
  n := bmp.width div 8;
  m := bmp.width mod 8;
  if m > 0 then
  inc(n);
  mm := n mod 4;
  nWidth := n + (4 - mm);
  bmp.width := nWidth * 8;
  for i := 0 to bmp.height - 1 do
  begin
    p := bmp.ScanLine[i];
    for j := 0 to nWidth - 1 do
    begin
      Buf.write(p[j], 1);
    end;
  end;
end;

二、1bit的BMP图片 1个byte存储8个像素,需要对齐,否则会出现多余的点

        我看过不少人用bmp.Canvas.StretchDraw()来使用图片适应调整后的图片大小,

       实现上只要把bmp.width设置为新的尺寸即可

三、斑马打印机接受的图片是要反色的

四、ZPL中打印二维码的指令如下

       Format('^FO%d,%d,2^BQN,2,%D,H^FDHA,%s^FS',[left,top,nsize,lpdata]);

       但是这种指令没法让BMP贴近条码的顶部(?好像留有一段空白),而且不支持

       很多标签,譬如名片?eMail?Tel等,为了更加良好的体验,可以使用zixing、

       zint、日本的QRCODE等模块先生成二维码图片再打印

五、使用WriteRawStringToPrinter函数直接写入指令到默认打印机

procedure WriteRawStringToPrinter(PrinterName: String; buf: pbyte;
  nsize: integer);
var
  hp: THandle;
  n, m: cardinal;
  DocInfo1: _DOC_INFO_1a;
  s, s2: AnsiString;
begin
  s := WideStringToAnsiString(PrinterName, 936);
  if not OpenPrintera(PAnsiChar((s)), hp, nil) then
    Exit;
  with DocInfo1 do
  begin
    pDocName := PAnsiChar('TestDoc');
    pOutputFile := nil;
    pDataType := 'RAW';
  end;
  if winspool.StartDocPrintera(hp, 1, @DocInfo1) > 0 then
  begin
    if StartPagePrinter(hp) then
    begin

      if WritePrinter(hp, buf, nsize, m) then
      begin
        if EndPagePrinter(hp) then
        begin
          if EndDocPrinter(hp) then
            ClosePrinter(hp);
        end
        else
        begin
          EndDocPrinter(hp);
          ClosePrinter(hp);
        end;
      end
      else
      begin
        EndPagePrinter(hp);
        EndDocPrinter(hp);
        ClosePrinter(hp);
      end;
    end
    else
    begin
      EndDocPrinter(hp);
      ClosePrinter(hp);
    end;
  end;
end;


你可能感兴趣的:(条形码)