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

来源:互联网 发布:大陆没有言论自由 知乎 编辑:程序博客网 时间:2024/06/10 16:29

一、中文生成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;


0 0