注册 登录
编程论坛 VFP论坛

关于用VFP解决Code128c条形码的打印问题

gyluming 发布于 2023-06-13 10:27, 2678 次点击
最近一直在网上查找,怎样打印code128的条形码。查了很多资料,得到的基本结论就是,code39可以用字库解决,前后加*号即可,code128c有点难,下载了code128的字库,可以打印,但扫描时是无法识别的,扫描枪识别不了,试卷扫描系统也识别不了(学生的准考证号是粘贴条码识别的),前面需要加开始符,末尾需要加验证符与结束符。

[此贴子已经被作者于2023-6-13 10:31编辑过]

44 回复
#2
gyluming2023-06-13 10:29
这个是在网上找到的CODE128的编码规则,可惜有点错误。
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


这一页错了,红色的部分应该是195--206,也就是说,CODE128C的开始符应该是CHR(205),结束符应该是CHR(206)。

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-6-13 10:44编辑过]

#3
gyluming2023-06-13 10:35
依照上面的编码规则,我用报表打印学生考试条码标签CODE1128C
考号的后四位分别是考场号和座位号。

只有本站会员才能查看附件,请 登录


只有本站会员才能查看附件,请 登录


程序代码:
SET TALK OFF
SET SAFE OFF
CLOSE DATABASES ALL
MESSAGEBOX("请先选择学生库",0+64,"条形码打印")
filename = GETFILE()
SELECT 考号, 姓名,学校,;
       SubStr(考号,9,2) AS 考场,;
       SubStr(考号,11,2) AS 座号,;
       205 AS TXM0,;
       INT(IIF(VAL(SUBSTR(考号,1,2))<95,VAL(SUBSTR(考号,1,2))+32,VAL(SUBSTR(考号,1,2))+100)) AS TXM1,;
       INT(IIF(VAL(SUBSTR(考号,3,2))<95,VAL(SUBSTR(考号,3,2))+32,VAL(SUBSTR(考号,3,2))+100)) AS TXM2,;
       INT(IIF(VAL(SUBSTR(考号,5,2))<95,VAL(SUBSTR(考号,5,2))+32,VAL(SUBSTR(考号,5,2))+100)) AS TXM3,;
       INT(IIF(VAL(SUBSTR(考号,7,2))<95,VAL(SUBSTR(考号,7,2))+32,VAL(SUBSTR(考号,7,2))+100)) AS TXM4,;
       INT(IIF(VAL(SUBSTR(考号,9,2))<95,VAL(SUBSTR(考号,9,2))+32,VAL(SUBSTR(考号,9,2))+100)) AS TXM5,;
       INT(IIF(VAL(SUBSTR(考号,11,2))<95,VAL(SUBSTR(考号,11,2))+32,VAL(SUBSTR(考号,11,2))+100)) AS TXM6,;
       INT(IIF(MOD(105+VAL(SUBSTR(考号,1,2))*1+VAL(SUBSTR(考号,3,2))*2+VAL(SUBSTR(考号,5,2))*3+VAL(SUBSTR(考号,7,2))*4+VAL(SUBSTR(考号,9,2))*5+VAL(SUBSTR(考号,11,2))*6,103)<95,;
       MOD(105+VAL(SUBSTR(考号,1,2))*1+VAL(SUBSTR(考号,3,2))*2+VAL(SUBSTR(考号,5,2))*3+VAL(SUBSTR(考号,7,2))*4+VAL(SUBSTR(考号,9,2))*5+VAL(SUBSTR(考号,11,2))*6,103)+32,;
       MOD(105+VAL(SUBSTR(考号,1,2))*1+VAL(SUBSTR(考号,3,2))*2+VAL(SUBSTR(考号,5,2))*3+VAL(SUBSTR(考号,7,2))*4+VAL(SUBSTR(考号,9,2))*5+VAL(SUBSTR(考号,11,2))*6,103)+100)) AS TXM7,;
       206 AS TXM8;
FROM &filename INTO TABLE DBF\TXM.DBF
REPORT FORM DBF\TXMDY preview


只有本站会员才能查看附件,请 登录


问题出现了,两位ASCII字符会自动拼成汉字,头疼。

[此贴子已经被作者于2023-6-13 10:45编辑过]

#4
gyluming2023-06-13 11:06
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-6-13 11:29编辑过]

#5
星光悠蓝2023-06-13 11:30
不要总着想着免费使用,使用量大的话,建议买一个正版控件!
#6
gyluming2023-06-13 12:15
回复 5楼 星光悠蓝
要不少钱的😁关键还是想挑战一下,网上我看好像打code128成功的,有一位成功的网友很执着,硬是把107种条码分别存成图片,再紧贴排版,打印成功的🤣🤣🤣
#7
sam_jiang2023-06-13 12:44
有现成的条码类,免费的
#8
laowan0012023-06-13 13:51
没那么复杂,使用foxbarcode就能解决,我一直在用
(1)在表单的init里加下面两句(程序见附件)
SET PROCEDURE TO foxbarcode ADDITIVE
SET PROCEDURE TO gpimage2.prg ADDITIVE
(2)在打印标签的按钮里使用下面的语句

PRIVATE poFbc
poFbc = CREATEOBJECT("FoxBarcode")
WITH poFbc
  .cImageType = "BMP"
*  .cImageFile = SYS(5)+SYS(2003)+"\xbarcode"    && 可以输出为图片文件
  .nBarcodeType = 110  && Code 128
  .cSet128 = "A"    &&"Auto" && Set 128 C
  .nImageHeight = 70
  .nFactor = 2
  .nFontSize = 9
ENDWITH
(3)标签中的使用
只有本站会员才能查看附件,请 登录


只有本站会员才能查看附件,请 登录
#9
easyppt2023-06-13 15:17
foxbarcode 最大的问题就是条码宽度不能根据DPI缩放,同样的条码字符串,别的条码打印宽度可以很小,而 foxbarcode却不可以。
(Width随意更改会导致扫码枪识别不了)
#10
laowan0012023-06-13 15:24
以下是引用easyppt在2023-6-13 15:17:18的发言:

foxbarcode 最大的问题就是条码宽度不能根据DPI缩放,同样的条码字符串,别的条码打印宽度可以很小,而 foxbarcode却不可以。
(Width随意更改会导致扫码枪识别不了)

我现在用的标签6*4和8*5都没问题,太小的没用过,客户应用中目前也不需要太小的
#11
gyluming2023-06-13 15:48
foxbarcode成功使用!谢谢@laowan001!!!
只有本站会员才能查看附件,请 登录

但识别率不高,扫错了不少,是不是我打的太小?A4打44个,4.8cm*2.5cm,再研究一下!
再次感谢大家支持
#12
星光悠蓝2023-06-13 15:50
以下是引用gyluming在2023-6-13 12:15:01的发言:

要不少钱的😁关键还是想挑战一下,网上我看好像打code128成功的,有一位成功的网友很执着,硬是把107种条码分别存成图片,再紧贴排版,打印成功的🤣🤣🤣

花不了几个钱
#13
gyluming2023-06-13 15:57
回复 10楼 laowan001
我现在遇到的新问题可能就是这个问题,打出的条码时对时错,有的能扫出,有的扫不出,有的扫出来是另一个莫名其妙的号码
因为粘贴在试卷上的条码很小,4.8*2.5的。
#14
星光悠蓝2023-06-13 15:59
回复 6楼 gyluming
如果只用一维条码,网上有破解版barcodex.ocx,搜下应该能找到
#15
easyppt2023-06-13 22:34
foxbarcode

[此贴子已经被作者于2023-6-13 22:41编辑过]

#16
pvm20002023-06-14 03:53
以下是引用gyluming在2023-6-13 15:48:28的发言:

foxbarcode成功使用!谢谢@laowan001!!!

但识别率不高,扫错了不少,是不是我打的太小?A4打44个,4.8cm*2.5cm,再研究一下!
再次感谢大家支持

这个有点奇怪
#17
laowan0012023-06-14 06:28
以下是引用gyluming在2023-6-13 15:57:20的发言:

我现在遇到的新问题可能就是这个问题,打出的条码时对时错,有的能扫出,有的扫不出,有的扫出来是另一个莫名其妙的号码
因为粘贴在试卷上的条码很小,4.8*2.5的。

这就需要测试了,试下调高条码高度,或者一行打5个/3个试试,在你的应用允许的范围内测试
#18
hu9jj2023-06-14 07:18
可以自己写一段代码,根据编码规则用绘图的方式绘制条码,不会存在识别不了的问题。
#19
easyppt2023-06-14 08:12
code128,分A/B/AUTO,对字符有限制的,最佳就是auto,只要是auto范围内的字符,条码本身绝对不会错乱,至于扫码枪无法识别,那是就是另外一回事了,比如width宽度决定不能随意调整。 打印出来且扫描枪能识别,才算是完整的条码方案。

[此贴子已经被作者于2023-6-14 08:13编辑过]

#20
sych2023-06-14 08:50
生成后先程序内自动识别一次,如果正常就打印,如果自己的程序也识别不了,就能提前预判异常
#21
laowan0012023-06-14 08:56
扫描枪也是有区别的哦,我就遇到过,有的枪扫着废劲,换个枪就很好使
#22
sostemp2023-06-14 09:46
只有本站会员才能查看附件,请 登录

用你的报表修改了下,测试一切正常,不乱码。





[此贴子已经被作者于2023-6-14 10:30编辑过]

#23
sostemp2023-06-14 09:57
这种网阅识别的,建议你还是用条码打印机更安全直接。
20年前用过,标签大小为50*25,双排。
这种标签纸,是可以网上定制的。

[此贴子已经被作者于2023-6-14 10:32编辑过]

#24
gyluming2023-06-14 22:00
回复 22楼 sostemp
麻烦指点一下,修改了什么地方啊
#25
gyluming2023-06-15 11:10
以下是引用sostemp在2023-6-14 09:46:18的发言:


用你的报表修改了下,测试一切正常,不乱码。

求教啊!我怎么改都不成功啊!
#26
laowan0012023-06-15 14:35
以下是引用gyluming在2023-6-15 11:10:12的发言:


求教啊!我怎么改都不成功啊!

一行只打了三个条码,每个条码的高度比你的高一些
#27
gyluming2023-06-16 08:02
以下是引用sostemp在2023-6-14 09:46:18的发言:


用你的报表修改了下,测试一切正常,不乱码。

只有本站会员才能查看附件,请 登录

我总觉得你是在骗我,但我又没有证据
#28
laowan0012023-06-16 09:30
条码前面那个“蛕”应该不是你的打印内容吧?
#29
gyluming2023-06-16 09:40
回复 28楼 laowan001
就是CODE128C条码编码的起始符CHR(205)与“90”对应的CODE128C条码编码的ASC字符CHR(122),它们会组合成汉字
只有本站会员才能查看附件,请 登录

以ASC字符超过127的开始的字符串好像都会拼成汉字。
这也给我提供了一个思路,可以把CODE128的字库的后面一部分字符移到CHR(30)之前,因为前面那一部分字符平时都是用于控制的,打印不可见。只是要修改一下字库。

[此贴子已经被作者于2023-6-16 09:46编辑过]

#30
吹水佬2023-06-16 09:48
有无试过用二进制串,就是以0h打头的串
#31
gyluming2023-06-16 09:53
回复 30楼 吹水佬
大佬!没有试过,有相关的介绍吗?我试过加空格,或分开,都不行。
按个人理解,二进制串还是字符,设为code128字体时它也是只能显示0和1呀

[此贴子已经被作者于2023-6-16 09:59编辑过]

#32
吹水佬2023-06-16 10:08
用CREATEBINARY()转换一下试试就清楚,二进制数据流处理与文本字节数据处理可能不同对待,否则VFP就没必要有个CREATEBINARY()
#33
gyluming2023-06-16 10:38
回复 32楼 吹水佬
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

不知道我加的对不对,结果还是一样
#34
laowan0012023-06-16 10:52
以下是引用gyluming在2023-6-16 09:40:51的发言:

就是CODE128C条码编码的起始符CHR(205)与“90”对应的CODE128C条码编码的ASC字符CHR(122),它们会组合成汉字

以ASC字符超过127的开始的字符串好像都会拼成汉字。
这也给我提供了一个思路,可以把CODE128的字库的后面一部分字符移到CHR(30)之前,因为前面那一部分字符平时都是用于控制的,打印不可见。只是要修改一下字库。

用foxbarcode是正常的,不知你用的是什么
只有本站会员才能查看附件,请 登录

#35
吹水佬2023-06-16 10:54
回复 33楼 gyluming
不是只对某个字符CREATEBINARY(),而是对整个数据串
#36
gyluming2023-06-16 11:07
回复 35楼 吹水佬
整个字符串也加过试了的,都一样,会拼成汉字。
#37
gyluming2023-06-16 11:25
回复 34楼 laowan001
用FoxBarcode使用gpImage2(http://sites.)类生成图像,不是用CODE128字库,跟据编码规则用ASC字符生成的。思路就不同。
#38
吹水佬2023-06-16 11:32
以下是引用gyluming在2023-6-16 11:07:49的发言:

整个字符串也加过试了的,都一样,会拼成汉字。

那就不是二进制数据问题,是不是不支持扩展字符集,汉字编码是用扩展字符集。
#39
laowan0012023-06-16 13:31
以下是引用gyluming在2023-6-16 11:25:36的发言:

用FoxBarcode使用gpImage2(http://sites.)类生成图像,不是用CODE128字库,跟据编码规则用ASC字符生成的。思路就不同。

能扫不?
#40
星光悠蓝2023-06-16 13:52
用条码控件生成图片,没这鸟事
#41
gyluming2023-06-16 17:17
回复 38楼 吹水佬
应该就是不支持扩展字符集的问题,所以我把CODE128C的字库中195-207这一段的ASC字符复制粘贴到了15-27这一段
大概就是图中这样
只有本站会员才能查看附件,请 登录

把下面红色框中的字符一个一个的复制到上面的对应位置
只有本站会员才能查看附件,请 登录

黄框中的就是复制过来的,好像可以打印了,试下发截图。
#42
gyluming2023-06-16 17:30
把原来的程序修改了一下,就是把195-207段的ASC字符修改到15-27,原程序中的+100改成-80,相应的字符所对条码就可以显示正常了。
程序代码:
SET TALK OFF
SET SAFE OFF
SET DATE TO ANSI
CLOSE DATABASES ALL
MESSAGEBOX("请先选择学生库",0+64,"条形码打印")
filename = GETFILE()

SELECT 考号, 姓名,学校,;
       SubStr(考号,9,2) AS 考场,;
       SubStr(考号,11,2) AS 座号,;
       25 AS TXM0,;
       INT(IIF(VAL(SUBSTR(考号,1,2))<95,VAL(SUBSTR(考号,1,2))+32,VAL(SUBSTR(考号,1,2))-80)) AS TXM1,;
       INT(IIF(VAL(SUBSTR(考号,3,2))<95,VAL(SUBSTR(考号,3,2))+32,VAL(SUBSTR(考号,3,2))-80)) AS TXM2,;
       INT(IIF(VAL(SUBSTR(考号,5,2))<95,VAL(SUBSTR(考号,5,2))+32,VAL(SUBSTR(考号,5,2))-80)) AS TXM3,;
       INT(IIF(VAL(SUBSTR(考号,7,2))<95,VAL(SUBSTR(考号,7,2))+32,VAL(SUBSTR(考号,7,2))-80)) AS TXM4,;
       INT(IIF(VAL(SUBSTR(考号,9,2))<95,VAL(SUBSTR(考号,9,2))+32,VAL(SUBSTR(考号,9,2))-80)) AS TXM5,;
       INT(IIF(VAL(SUBSTR(考号,11,2))<95,VAL(SUBSTR(考号,11,2))+32,VAL(SUBSTR(考号,11,2))-80)) AS TXM6,;
       INT(IIF(MOD(105+VAL(SUBSTR(考号,1,2))*1+VAL(SUBSTR(考号,3,2))*2+VAL(SUBSTR(考号,5,2))*3+VAL(SUBSTR(考号,7,2))*4+VAL(SUBSTR(考号,9,2))*5+VAL(SUBSTR(考号,11,2))*6,103)<95,;
       MOD(105+VAL(SUBSTR(考号,1,2))*1+VAL(SUBSTR(考号,3,2))*2+VAL(SUBSTR(考号,5,2))*3+VAL(SUBSTR(考号,7,2))*4+VAL(SUBSTR(考号,9,2))*5+VAL(SUBSTR(考号,11,2))*6,103)+32,;
       MOD(105+VAL(SUBSTR(考号,1,2))*1+VAL(SUBSTR(考号,3,2))*2+VAL(SUBSTR(考号,5,2))*3+VAL(SUBSTR(考号,7,2))*4+VAL(SUBSTR(考号,9,2))*5+VAL(SUBSTR(考号,11,2))*6,103)-80)) AS TXM7,;
       26 AS TXM8;
FROM &filename INTO TABLE DBF\TXM.DBF
REPORT FORM DBF\TXMDY preview

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

原版的CODE128字库与修改过的字库都放在包里了。
#43
gyluming2023-06-16 17:36
回复 40楼 星光悠蓝
条码控件终归是用着不是太明白,用字体这个简单清楚,就是第一次弄清楚编码的方法就好了
#44
gyluming2023-06-16 17:36
回复 39楼 laowan001
扫描是一样的结果,可以用的。
#45
schtg2023-06-16 19:13
回复 42楼 gyluming
谢谢分享!
1