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