our
$VERSION
=
'2.00'
;
use
vars
qw($VERSION @ISA $errStr)
;
@ISA
=
qw(GD::Barcode Exporter)
;
my
$leftOddBar
= {
'0'
=>
'0001101'
,
'1'
=>
'0011001'
,
'2'
=>
'0010011'
,
'3'
=>
'0111101'
,
'4'
=>
'0100011'
,
'5'
=>
'0110001'
,
'6'
=>
'0101111'
,
'7'
=>
'0111011'
,
'8'
=>
'0110111'
,
'9'
=>
'0001011'
};
my
$leftEvenBar
= {
'0'
=>
'0100111'
,
'1'
=>
'0110011'
,
'2'
=>
'0011011'
,
'3'
=>
'0100001'
,
'4'
=>
'0011101'
,
'5'
=>
'0111001'
,
'6'
=>
'0000101'
,
'7'
=>
'0010001'
,
'8'
=>
'0001001'
,
'9'
=>
'0010111'
};
my
$rightBar
= {
'0'
=>
'1110010'
,
'1'
=>
'1100110'
,
'2'
=>
'1101100'
,
'3'
=>
'1000010'
,
'4'
=>
'1011100'
,
'5'
=>
'1001110'
,
'6'
=>
'1010000'
,
'7'
=>
'1000100'
,
'8'
=>
'1001000'
,
'9'
=>
'1110100'
};
my
$guardBar
=
'G0G'
;
my
$centerBar
=
'0G0G0'
;
my
$oddEven4EAN
= {
0
=>
'OOOOOO'
,
1
=>
'OOEOEE'
,
2
=>
'OOEEOE'
,
3
=>
'OOEEEO'
,
4
=>
'OEOOEE'
,
5
=>
'OEEOOE'
,
6
=>
'OEEEOO'
,
7
=>
'OEOEOE'
,
8
=>
'OEOEEO'
,
9
=>
'OEEOEO'
};
sub
new {
my
(
$sClass
,
$sTxt
) =
@_
;
$errStr
=
''
;
my
$oThis
= {};
bless
$oThis
,
$sClass
;
return
if
(
$errStr
=
$oThis
->init(
$sTxt
) );
return
$oThis
;
}
sub
init {
my
(
$oThis
,
$sTxt
) =
@_
;
return
'Invalid Characters'
if
(
$sTxt
=~ /[^0-9]/ );
if
(
length
(
$sTxt
) == 12 ) {
$sTxt
.= calcEAN13CD(
$sTxt
);
}
elsif
(
length
(
$sTxt
) == 13 ) {
;
}
else
{
return
'Invalid Length'
;
}
$oThis
->{text} =
$sTxt
;
return
''
;
}
sub
calcEAN13CD {
my
(
$sTxt
) =
@_
;
my
(
$i
,
$iSum
);
my
@aWeight
= ( 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3 );
$iSum
= 0;
for
(
$i
= 0 ;
$i
< 12 ;
$i
++ ) {
$iSum
+=
substr
(
$sTxt
,
$i
, 1 ) *
$aWeight
[
$i
];
}
$iSum
%= 10;
$iSum
= (
$iSum
== 0 ) ? 0 : ( 10 -
$iSum
);
return
"$iSum"
;
}
sub
barcode {
my
(
$oThis
) =
@_
;
my
(
$sTxt
);
my
(
$oddEven
,
$i
,
$sBar
);
my
(
$sRes
);
$sTxt
=
$oThis
->{text};
$sRes
=
$guardBar
;
$oddEven
=
$oddEven4EAN
->{
substr
(
$sTxt
, 0, 1 ) };
for
(
$i
= 1 ;
$i
< 7 ;
$i
++ ) {
$sBar
=
(
substr
(
$oddEven
,
$i
- 1, 1 ) eq
'O'
) ?
$leftOddBar
:
$leftEvenBar
;
$sRes
.= GD::Barcode::barPtn(
substr
(
$sTxt
,
$i
, 1 ),
$sBar
);
}
$sRes
.=
$centerBar
;
for
(
$i
= 7 ;
$i
< 13 ;
$i
++ ) {
$sRes
.= GD::Barcode::barPtn(
substr
(
$sTxt
,
$i
, 1 ),
$rightBar
);
}
$sRes
.=
$guardBar
;
return
$sRes
;
}
sub
plot {
my
(
$oThis
,
%hParam
) =
@_
;
my
$sPtn
=
$oThis
->barcode();
my
$iHeight
= (
$hParam
{Height} ) ?
$hParam
{Height} : 50;
my
(
$oGd
,
$cBlack
);
if
(
$hParam
{NoText} ) {
(
$oGd
,
$cBlack
) =
GD::Barcode::plot(
$sPtn
,
length
(
$sPtn
),
$iHeight
, 0, 0 );
}
else
{
my
(
$fW
,
$fH
) = ( GD::Font->Small->width, GD::Font->Small->height );
my
$iWidth
=
length
(
$sPtn
) +
$fW
+ 1;
(
$oGd
,
$cBlack
) =
GD::Barcode::plot(
$sPtn
,
$iWidth
,
$iHeight
,
$fH
,
$fW
+ 1 );
$oGd
->string(
GD::Font->Small, 0,
$iHeight
-
$fH
,
substr
(
$oThis
->{text}, 0, 1 ),
$cBlack
);
$oGd
->string(
GD::Font->Small,
$fW
+ 8,
$iHeight
-
$fH
,
substr
(
$oThis
->{text}, 1, 6 ),
$cBlack
);
$oGd
->string(
GD::Font->Small,
$fW
+ 55,
$iHeight
-
$fH
,
substr
(
$oThis
->{text}, 7, 6 ),
$cBlack
);
}
return
$oGd
;
}
1;