条形码之三九码.docx
- 文档编号:10549462
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:32
- 大小:628.32KB
条形码之三九码.docx
《条形码之三九码.docx》由会员分享,可在线阅读,更多相关《条形码之三九码.docx(32页珍藏版)》请在冰豆网上搜索。
条形码之三九码
条形码之三九码(上)
(附两三种制作方法)
一、39码简介
39码是1974年发展出来的条码,是一种可供使用者双向扫描的分散式条码,也就是说两个资料码之间,必须包含一个不具任何意义的空白(或细白,其逻辑值为0),但其具有支援文字的能力,帮应用较一般条码广泛。
三九码仅有两种单元宽度,分别为宽单元和窄单元。
宽单元的宽度为窄单元的1到3倍,一般多选用2倍、2.5倍或3倍。
三九码的每一个条码字符由九个单元组成,其中有三个宽单元,其余是窄单元,因此称为三九码。
目前主要应用于工业产品、商业资料及医院的保健资料,它的最大优点是条码的长度没有强制的限定,可用大写英文字母码,且检查码可忽略不计。
39码还有编码规则简单、误码率低、所能表示字符个数多等特点,因此在各个领域有着极为广泛的应用。
我国也制定了相应的国家标准(GB/T12908-91)。
二、39码的特性
标准的39码是由起始安全空间、起始码、资料码、可忽略不计的检查码、终止安全空间及终止码所构成,其所编成的39码如图所示。
综合来说,39码有以下特性:
o 条码的长度没有限制,可随着需求作弹性调整。
但在规划长度的大小时,应考虑条码扫描器能允许的范围,避免条码扫描器无法读取完整的资料。
o 起始码和终止码必须固定为“*”字元。
o 允许条码扫描器进行双向的扫描处理。
o 由于39码具有自我检查能力,故检查码可有可无。
o 条码占用空间比较大。
o 可表示的资料包含有0-9的数字,A-Z的英文字母,以及“+”、“-”、“*”、“/”、“%”、“$”、“.”等特殊字符,再加上空白字元“”,共计44组编码,并可组合出128个ASCIICODE的字元符号,如表所示。
表:
ASCIIDODE字元符号与39码对照表
ASCII
CODE39
ASCII
CODE39
ASCII
CODE39
ASCII
CODE39
NUL
%U
SP
Space
@
%V
、
%W
SOH
$A
!
/A
A
A
a
+A
STX
$B
口
/B
B
B
b
+B
ETX
$C
#
/C
C
C
C
+C
EOT
$D
$
/D
D
D
B
+D
ENQ
$E
%
/E
E
E
E
+E
ACK
$F
&
/F
F
F
F
+F
BEL
$G
,
/G
G
G
G
+G
BS
$H
(
/H
H
H
H
+H
HT
$I
)
/I
I
I
I
+I
LF
$J
*
/J
IJ
J
J
+J
VT
$K
+
/K
K
K
k
+K
FF
$L
/L
L
L
l
+L
CR
$M
-
.
M
M
M
+M
SO
$N
.
/0
N
N
N
+N
SI
$O
/
0
O
O
O
+O
DLE
$P
0
0
P
P
P
+P
DC1
$Q
1
1
Q
Q
Q
+Q
Dc2
$R
2
2
R
R
R
+R
Dc3
$S
3
3
S
S
S
+S
DC4
$T
4
4
T
T
T
+T
NAK
$U
5
5
U
U
U
+U
SYN
$V
6
6
V
V
V
+V
ETB
$W
7
7
W
W
W
+W
CAN
$X
8
8
X
X
X
+X
EM
$Y
9
9
Y
Y
Y
+Y
SUB
$Z
:
/Z
Z
Z
Z
+Z
ESC
%A
;
%F
[
%K
{
%Q
FS
%B
<
%G
"
%L
/
%R
GS
%C
=
%H
]
%M
}
%S
RS
%D
>
%I
^
%N
~
%T,%X
US
%E
?
%J
-
%0
DEL
%Y,%Z
三、39码编码方式
39码的每一个字元编码方式都是籍由九条不同排列的线条编码而得。
可区分以下四种类型,如表所示。
表:
39码字元编码方式
类别
线条形态
逻辑形态
线条数目
粗黑线
11
2
细黑线
1
1
粗白线
00
2
细白线
0
1
英文字母部分
26个英文字母所对应的39码如表所示。
表:
39码编码对应表(英文字母部分)
字元
逻辑形态
字元
逻辑形态
A
110101001011
N
101011010011
B
101101001011
O
110101101001
C
110110100101
P
101101101001
D
101011001011
Q
101010110011
E
110101100101
R
110101011001
F
101101100101
S
101101011001
G
101010011011
T
101011011001
H
110101001101
U
110010101011
I
101101001101
V
100110101011
J
101011001101
W
110011010101
K
110101010011
X
100101101011
L
101101010011
Y
110010110101
M
110110101001
Z
100110110101
数字与特殊符号部分
39码也可以表示数字0-9以及特殊符号,其对应的逻辑值如表所示。
表:
39码编码对应表(英文字母部分)
字元
逻辑形态
字元
逻辑形态
0
101001101101
+
100101001001
1
110100101011
100101011011
2
101100101011
*
100101101101
3
110110010101
/
100100101001
4
101001101011
%
101001001001
5
110100110101
$
100100100101
6
101100110101
.
110010101101
7
101001011011
空白
100110101101
8
110100101101
9
101100101101
四、检查码的计算
39码中的检查码部分,并不是必要的部分,可依实际需要,决定加入与否,但在一般的情况下通常多半是予以省略不印,以减少编码的长度与扫描的时间。
39码的检查码计算必须先利用表(检查码相对值对照表)将编码字元的相对值查出,将查出的相对值累加后再除以43,得到的余数在查出相对的编码字元,即为检查码字元。
例如,要算出*S123$5*这笔资料的检查码,其计算过程如下:
S的相对值为28
;1的相对值为1
2的相对值为2
;3的相对值为3
$的相对值为39
;5的相对值为5
步骤二将各相对值累加除以43
累加相对值=28+1+2+3+39+5=78
78/43=1.35
步骤三检查出余数相对编码字元
余数=35
查表,得到相对值35之编码字元为Z故,
检查码=Z,得
含检查码在内的39码,为:
*S123$5Z*
39码的检查码查询表
编码字元
相对值
编码字元
相对值
0
0
F
15
1
1
G
16
2
2
H
17
3
3
I
18
4
4
J
19
5
5
K
20
6
6
L
21
7
7
M
22
8
8
N
23
9
9
O
24
A
10
P
25
B
11
Q
26
C
12
R
27
D
13
S
28
E
14
T
29
五、三九码的制作方法
1.在Excel中制作39码
(1)安装字体3of9.TTF(网络上很多,可先下载该字体.即把3of9.ttf复制到C:
"WINDOWS"Fonts中)
(2)在Excel单元格中输入39码,然后前后加*号,再选择字体(3of9Barcode)
选择字体前如图:
选择字体后如图:
2. 在C#操作Excel处理三九码(code39)
(1) 安装字体3of9.TTF
(2) 添加引用,如图
(3) 编程:
(只对在EXCEL实现三九码作简单介绍)
usingSystem;
usingSystem.Reflection;
usingSystem.Runtime.InteropServices;
usingMicrosoft.Office.Interop.Excel;
namespaceExcel
{
///
///Class1
///
classClass1
{
///
///Excel
///
[STAThread]
publicstaticvoidMain(string[]args)
{
Applicationexc=newApplication();
if(exc==null)
{
Console.WriteLine("Error:
Excelcouldn'tbestarted!
");
return;
}
exc.Visible=true;
Workbooksworkbooks=exc.Workbooks;
_Workbookworkbook=workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Sheetssheets=workbook.Worksheets;
_Worksheetworksheet=(_Worksheet)sheets.get_Item
(1);
Ranger=worksheet.get_Range("A1","A1");
r.ColumnWidth=30;
r.Value2="*12345ABCD*";
r.Font.Name="3of9Barcode";
}
}
}
运行结果:
3. 用.NET自带的报表服务System.Drawing.ReportDocument时,
如果2.
(1),
(2)然后在PrintPage事件中加入以下部分即可:
Font f= new Font("3 of 9 Barcode", 24, FontStyle.Bold);
stringstr = "*1234ABCD*";
e.Graphics.DrawString(str, f, Brushes.Black, 10f, 10f, new StringFormat());
运行结果:
4.水晶报表中显示条形码:
(1)
<1>安装字体3of9.TTF
<2>建立要显示条形码文字的公式:
如Barcode39要显示字段设为CustomerID,则可在公式编辑器中拖入CustomerID即"*"+CStr({Customer.CustomerID})+"*",
最终为"*"&CStr({Customer.CustomerID})&"*"
<3>把Barcode39拖入报表要显示的地方
<4>设置Barcode39对象的字体为条形码字体
(2)
<1>从第三方供应商购买字体库存和用户函数库(AzaleasoftwareorIDAutomation)
<2>安装字体库,并注册用户函数库(CRUFlidautomation.dll为函数库)
Regsvr32CRUFlidautomation.dll
<3>建立公式并在公式中使用用户函数库的函数(在附加函数中找到用户函数)
<4>把公式拖入报表,并设置公式对象的字体为相应的条形码字体
5.使用CODESOFT6Enterprise制作条形码:
<1>安装CODESOFT6Enterprise(网上可以下载且有破解包),并打开
Dabase:
与数据源的连接(Excel,Access等)
Date:
与日期相关和条码字段
Formule:
公式字段
Form:
变量
Tablelooup,Count,Free暂不说明
前三个选择为条形码的显示方式
从上到下依次为:
SelectObjects:
选取对象
Textgeneration:
文本生成器(设置文本字体,大小等)
Barcodegeneration:
条形码生成器(产生条码并可设置其属性,如条码大小,长短等)
Imageimport:
插入图片等对象
Externalobjectinsertion:
插入外部数据源对象
Linedrawing:
画线条对象
Rectangledrawing:
画矩形对象
Circleorellipsedrawing:
画圆形或椭圆对象
Polygondrawing:
画多边形
Obliquelinedrawing:
Roundedrectangledrawing:
画圆角矩形
<2>添加一个变量表示数量(Qty):
选取一个Textgereration对象,做为条形码前的说明:
选取一个条形码对象(Barcodegereration):
在Symbolgy列表框中找到39码:
在Humanreadable页(易读标签页),设是否验证符,Positiont选择项中设置显示可读文字的位置(条形码的真实内容)及对齐方式等
在Character页,选择字体字形等
在数据源页选择条形码的来源(是变量还是常量,还是数据源字段等)
点击确定后:
设Qty为15.6:
此时条形为15.6:
同理再建一个日期变量:
设置日期的格式:
20090113
建立一个Qty_Date的公式:
显示数量和日期,并做为二维条码的数据源(其它二维条码与此类似)
數量和日期:
然后打印条码标签
(连续打印多个条码标签,数据源用一个字段Qty的示例,内容太多,详见PDF,本公司内部在使用)/Files/csui2008/cs6.pdf
五、三九码的制作方法
6.用C#操作 System.Drawing.Graphics画39码(code39)
(1)条形码的内容:
stringcode=“123456789”,则验证码为2
通过函数code39_check_digit()得到验证码:
//得到验证码
privatestringcode39_check_digit(stringcode)
{
intnum2=0;
intnum3=Strings.Len(code);
for(inti=1;i<=num3;i++)
{
num2+=this.code39_get_num(Strings.Mid(code,i,1));
}
num2=num2%0x2b;
returnthis.code39_get_char(num2);
}
然后在code前后加”*”号,(必须加星号读取条形码的设备才能正确识别):
code="*"+code;
if(this.myAddCheckDigit)
{
code=code+this.code39_check_digit(code);
}
code=code+"*";
此时code="*1234567892*";
(2)把条码字元一个一个地转化为byte型(逻辑形式),并画出来
(请参阅<二>条形码之三九码(上)中39码编码对应表
intnum10=Strings.Len(code);
for(inti=1;i<=num10;i++)
{
stringexpression=this.code39_get_pattern(Strings.Mid(code,i,1));
if(expression!
="")
{
floatnum6=0.0F;
floatnum7=0.0F;
floatnum9=0.0F;
intnum11=Strings.Len(expression);
intstart=1;
while(start<=num11)
{
floatnum8;
if(Strings.Mid(expression,start,1)=="1")
{
num7=X+(num5*num2);
num6=2f*num2;
num9=Y;
num8=num;
num5+=2;
}
else
{
num7=X+(num5*num2);
num6=1f*num2;
num9=Y;
num8=num;
num5++;
}
if((start%2)==1)
{
ev.FillRectangle(brush,num7,num9,num6,num8);
}
start++;
}
num7=X+(num5*num2);
num5++;
}
}
(3)然后,确定是否要把条形码的内容显示在条形码下方,以下为显示条形码文本的程序段:
privatevoidWriteNumber(stringTITLE,floatX,floatY,floatX2,floatY2,Graphicsev)
{
Fontfont;
if(this.FontBold)
{
if(this.FontItalic)
{
font=newFont(this.myFontName,this.myFontSize,FontStyle.Italic|FontStyle.Bold);
}
else
{
font=newFont(this.myFontName,this.myFontSize,FontStyle.Bold);
}
}
elseif(this.FontItalic)
{
font=newFont(this.myFontName,this.myFontSize,FontStyle.Italic);
}
else
{
font=newFont(this.myFontName,this.myFontSize);
}
SolidBrushbrush2=newSolidBrush(this.myFontColor);
SolidBrushbrush=newSolidBrush(this.myFontBackGroundColor);
StringFormatformat=newStringFormat();
if(this.myPrintChar)
{
format.Alignment=StringAlignment.Center;
format.LineAlignment=StringAlignment.Center;
SizeFef=ev.MeasureString(TITLE,font);
floatwidth=ef.Width;
floatheight=ef.Height;
ev.FillRectangle(brush,0,Y-height,X2,height);
ev.DrawString(TITLE,font,brush2,X,Y-(height/2f),format);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 条形码 三九