- Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathI25.php
More file actions
137 lines (125 loc) · 3.25 KB
/
I25.php
File metadata and controls
137 lines (125 loc) · 3.25 KB
1
2
3
4
5
6
7
8
9
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php
namespace Mpdf\Barcode;
/**
* Interleaved 2 of 5 barcodes.
* Compact numeric code, widely used in industry, air cargo
* Contains digits (0 to 9) and encodes the data in the width of both bars and spaces.
*/
class I25 extends \Mpdf\Barcode\AbstractBarcode implements \Mpdf\Barcode\BarcodeInterface
{
/**
* @param string $code
* @param float $topBottomMargin
* @param float $printRatio
* @param bool $checksum
*/
public function __construct($code, $topBottomMargin, $printRatio, $checksum = false, $quiet_zone_left = null, $quiet_zone_right = null)
{
$this->init($code, $printRatio, $checksum);
$this->data['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.)
$this->data['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.)
$this->data['lightmL'] = ($quiet_zone_left !== null ? $quiet_zone_left : 10); // LEFT light margin = x X-dim (spec.)
$this->data['lightmR'] = ($quiet_zone_right !== null ? $quiet_zone_right : 10); // RIGHT light margin = x X-dim (spec.)
$this->data['lightTB'] = $topBottomMargin; // TOP/BOTTOM light margin = x X-dim (non-spec.)
}
/**
* @param string $code
* @param float $printRatio
* @param bool $checksum
*/
private function init($code, $printRatio, $checksum)
{
$chr = [
'0' => '11221',
'1' => '21112',
'2' => '12112',
'3' => '22111',
'4' => '11212',
'5' => '21211',
'6' => '12211',
'7' => '11122',
'8' => '21121',
'9' => '12121',
'A' => '11',
'Z' => '21',
];
$checkdigit = '';
if ($checksum) {
// add checksum
$checkdigit = $this->checksum($code);
$code .= $checkdigit;
}
if ((strlen($code) % 2) != 0) {
// add leading zero if code-length is odd
$code = '0' . $code;
}
// add start and stop codes
$code = 'AA' . strtolower($code) . 'ZA';
$bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []];
$k = 0;
$clen = strlen($code);
for ($i = 0; $i < $clen; $i = ($i + 2)) {
$charBar = $code[$i];
$charSpace = $code[$i + 1];
if ((!isset($chr[$charBar])) or (!isset($chr[$charSpace]))) {
// invalid character
throw new \Mpdf\Barcode\BarcodeException(sprintf('Invalid I25 barcode value "%s"', $code));
}
// create a bar-space sequence
$seq = '';
$chrlen = strlen($chr[$charBar]);
for ($s = 0; $s < $chrlen; $s++) {
$seq .= $chr[$charBar][$s] . $chr[$charSpace][$s];
}
$seqlen = strlen($seq);
for ($j = 0; $j < $seqlen; ++$j) {
if (($j % 2) == 0) {
$t = true; // bar
} else {
$t = false; // space
}
$x = $seq[$j];
if ($x == 2) {
$w = $printRatio;
} else {
$w = 1;
}
$bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0];
$bararray['maxw'] += $w;
++$k;
}
}
$bararray['checkdigit'] = $checkdigit;
$this->data = $bararray;
}
/**
* Checksum for standard 2 of 5 barcodes.
*
* @param string $code
* @return int
*/
private function checksum($code)
{
$len = strlen($code);
$sum = 0;
for ($i = 0; $i < $len; $i += 2) {
$sum += $code[$i];
}
$sum *= 3;
for ($i = 1; $i < $len; $i += 2) {
$sum += ($code[$i]);
}
$r = $sum % 10;
if ($r > 0) {
$r = (10 - $r);
}
return $r;
}
/**
* @inheritdoc
*/
public function getType()
{
return 'I25';
}
}