您的位置:首页 > 产品设计 > UI/UE

在powerbuilder中调用ESC/POS命令无控件方式打印条码

2015-05-09 09:02 1156 查看
因工作需要,需要在pos结款小票上打印条码,一开始想到控件方式实现,但是这种方式不太稳定,而且速度较慢。因为使用的热敏打印机是EPSON TM-58型打印机,所以想到了可以使用ESC/POS命令来实现条码的打印,这种方式不但速度快,而且可以在所有兼容ESC/POS指令集的打印机上通用,并且不涉及控件调用的问题,方便移植到不同的平台。

本文主要以CODE128 C编码举例,其他编码大同小异,需要了解编码方式的请参考相关介绍ESC/POS指令集的文档。代码如下:

//函数名称:f_code128c
//函数用途:将传入的12位字符串按照code128c编码规范计算得到供打印的字符串
//          tm-58打印机最大支持16位条码,此处12位为演示用
//函数参数:as_in string val 传入的欲计算的12位条码
//          ab_result blob ref 计算后得到的供打印的字符串 blob类型
//返回值:int 0成功 -1失败
//作者:鸡翅多 zeng78@gmail.com
//创建时间:2015-5-7

/*
code128 举例
格式: GS k n m d1~dn
说明: n=73(49H) 表示采用128码
m表示码长度(含起始码)
d1~dn表示码值
[举例]打印条码“No.123456”
本例子中,首先用字符集B打印“No.”,然后使用字符集C打印数字。
GS k 73 10 123 66 78 111 46 123 67 12 34 56(hex: 1D 6B 49 0A 7B 42 4E 6F 2E 7B 43 0C 22 38)
*/
string ls_token[99]={'01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82','83','84','85','86','87','88','89','90','91','92','93','94','95','96','97','98','99'}
string ls_bit[99]={'~h01','~h02','~h03','~h04','~h05','~h06','~h07','~h08','~h09','~h0A','~h0B','~h0C','~h0D','~h0E','~h0F','~h10','~h11','~h12','~h13','~h14','~h15','~h16','~h17','~h18','~h19','~h1A','~h1B','~h1C','~h1D','~h1E','~h1F','~h20','~h21','~h22','~h23','~h24','~h25','~h26','~h27','~h28','~h29','~h2A','~h2B','~h2C','~h2D','~h2E','~h2F','~h30','~h31','~h32','~h33','~h34','~h35','~h36','~h37','~h38','~h39','~h3A','~h3B','~h3C','~h3D','~h3E','~h3F','~h40','~h41','~h42','~h43','~h44','~h45','~h46','~h47','~h48','~h49','~h4A','~h4B','~h4C','~h4D','~h4E','~h4F','~h50','~h51','~h52','~h53','~h54','~h55','~h56','~h57','~h58','~h59','~h5A','~h5B','~h5C','~h5D','~h5E','~h5F','~h60','~h61','~h62','~h63'}
blob{1} lb_zero
blob lb_tmp,lb_start
string ls_tmp
int i,j
int li_rc
ab_result = blob("")
//判断是否为12位
if len(as_in) <> 12 then
return -1
end if
//判断传入的数据每位是否数字
For i = 1 To Len(as_in)
If Asc(Mid(as_in, i, 1)) < 48 Or Asc(Mid(as_in, i, 1)) > 57 Then
return -1
End If
end for

lb_start = blob("~h1D~h6B~h49~h08~h7B~h43") //开始位为固定格式
ab_result = lb_start

//开始计算,每两位一次
for i=1 to 12 step 2
ls_tmp = mid(as_in,i,2)
if ls_tmp='00' then
ab_result = ab_result + lb_zero
else
for j=1 to 99
if ls_tmp = ls_token[j] then
ab_result = ab_result + blob(ls_bit[j])
exit
end if
end for
end if
end for
return 0


代码中有一个需要注意的地方是,因为pb无法表示‘~h00’,如果在字符串中直接使用'~h00'会被pb忽略,所以在这里使用了一个1位的blob类型来存储这个'~h00'。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐