forked from davidscotttufts/php-barcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
barcode.php
150 lines (141 loc) · 11.5 KB
/
barcode.php
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
138
139
140
141
142
143
144
145
146
147
148
149
150
<?php
/*
* Author: David S. Tufts
* Improvements by Zach Stein (Holt's Cigar Company)
* Company: Rocketwood.LLC
* www.rocketwood.com
* Date: 05/25/2003
* Usage:
* <img src="/barcode.php?text=testing" alt="testing" />
*/
// Get pararameters that are passed in through $_GET or set to the default value
$text = (isset($_GET["text"]) ? $_GET["text"] : "0");
$size = (isset($_GET["size"]) ? $_GET["size"] : "20");
$orientation = (isset($_GET["orientation"]) ? $_GET["orientation"] : "horizontal");
$code_type = (isset($_GET["codetype"]) ? $_GET["codetype"] : "code128");
encode($text, $code_type, $orientation, $size);
// TODO: Create classes for each code type to further abstract encoding by type
function encode($text, $code_type = 'code128', $orientation = 'horizontal', $size = 20) {
// Define constants to eliminate random if statements.
$code_symbologies1 = array(
'code128' => array(" " => "212222", "!" => "222122", "\"" => "222221", "#" => "121223", "$" => "121322", "%" => "131222", "&" => "122213", "'" => "122312", "(" => "132212", ")" => "221213", "*" => "221312", "+" => "231212", "," => "112232", "-" => "122132", "." => "122231", "/" => "113222", "0" => "123122", "1" => "123221", "2" => "223211", "3" => "221132", "4" => "221231", "5" => "213212", "6" => "223112", "7" => "312131", "8" => "311222", "9" => "321122", ":" => "321221", ";" => "312212", "<" => "322112", "=" => "322211", ">" => "212123", "?" => "212321", "@" => "232121", "A" => "111323", "B" => "131123", "C" => "131321", "D" => "112313", "E" => "132113", "F" => "132311", "G" => "211313", "H" => "231113", "I" => "231311", "J" => "112133", "K" => "112331", "L" => "132131", "M" => "113123", "N" => "113321", "O" => "133121", "P" => "313121", "Q" => "211331", "R" => "231131", "S" => "213113", "T" => "213311", "U" => "213131", "V" => "311123", "W" => "311321", "X" => "331121", "Y" => "312113", "Z" => "312311", "[" => "332111", "\\" => "314111", "]" => "221411", "^" => "431111", "_" => "111224", "\`" => "111422", "a" => "121124", "b" => "121421", "c" => "141122", "d" => "141221", "e" => "112214", "f" => "112412", "g" => "122114", "h" => "122411", "i" => "142112", "j" => "142211", "k" => "241211", "l" => "221114", "m" => "413111", "n" => "241112", "o" => "134111", "p" => "111242", "q" => "121142", "r" => "121241", "s" => "114212", "t" => "124112", "u" => "124211", "v" => "411212", "w" => "421112", "x" => "421211", "y" => "212141", "z" => "214121", "{" => "412121", "|" => "111143", "}" => "111341", "~" => "131141", "DEL" => "114113", "FNC 3" => "114311", "FNC 2" => "411113", "SHIFT" => "411311", "CODE C" => "113141", "FNC 4" => "114131", "CODE A" => "311141", "FNC 1" => "411131", "Start A" => "211412", "Start B" => "211214", "Start C" => "211232", "Stop" => "2331112"),
'code128b' => array(" " => "212222", "!" => "222122", "\"" => "222221", "#" => "121223", "$" => "121322", "%" => "131222", "&" => "122213", "'" => "122312", "(" => "132212", ")" => "221213", "*" => "221312", "+" => "231212", "," => "112232", "-" => "122132", "." => "122231", "/" => "113222", "0" => "123122", "1" => "123221", "2" => "223211", "3" => "221132", "4" => "221231", "5" => "213212", "6" => "223112", "7" => "312131", "8" => "311222", "9" => "321122", ":" => "321221", ";" => "312212", "<" => "322112", "=" => "322211", ">" => "212123", "?" => "212321", "@" => "232121", "A" => "111323", "B" => "131123", "C" => "131321", "D" => "112313", "E" => "132113", "F" => "132311", "G" => "211313", "H" => "231113", "I" => "231311", "J" => "112133", "K" => "112331", "L" => "132131", "M" => "113123", "N" => "113321", "O" => "133121", "P" => "313121", "Q" => "211331", "R" => "231131", "S" => "213113", "T" => "213311", "U" => "213131", "V" => "311123", "W" => "311321", "X" => "331121", "Y" => "312113", "Z" => "312311", "[" => "332111", "\\" => "314111", "]" => "221411", "^" => "431111", "_" => "111224", "\`" => "111422", "a" => "121124", "b" => "121421", "c" => "141122", "d" => "141221", "e" => "112214", "f" => "112412", "g" => "122114", "h" => "122411", "i" => "142112", "j" => "142211", "k" => "241211", "l" => "221114", "m" => "413111", "n" => "241112", "o" => "134111", "p" => "111242", "q" => "121142", "r" => "121241", "s" => "114212", "t" => "124112", "u" => "124211", "v" => "411212", "w" => "421112", "x" => "421211", "y" => "212141", "z" => "214121", "{" => "412121", "|" => "111143", "}" => "111341", "~" => "131141", "DEL" => "114113", "FNC 3" => "114311", "FNC 2" => "411113", "SHIFT" => "411311", "CODE C" => "113141", "FNC 4" => "114131", "CODE A" => "311141", "FNC 1" => "411131", "Start A" => "211412", "Start B" => "211214", "Start C" => "211232", "Stop" => "2331112"),
'code128a' => $code_array1 = array(" " => "212222", "!" => "222122", "\"" => "222221", "#" => "121223", "$" => "121322", "%" => "131222", "&" => "122213", "'" => "122312", "(" => "132212", ")" => "221213", "*" => "221312", "+" => "231212", "," => "112232", "-" => "122132", "." => "122231", "/" => "113222", "0" => "123122", "1" => "123221", "2" => "223211", "3" => "221132", "4" => "221231", "5" => "213212", "6" => "223112", "7" => "312131", "8" => "311222", "9" => "321122", ":" => "321221", ";" => "312212", "<" => "322112", "=" => "322211", ">" => "212123", "?" => "212321", "@" => "232121", "A" => "111323", "B" => "131123", "C" => "131321", "D" => "112313", "E" => "132113", "F" => "132311", "G" => "211313", "H" => "231113", "I" => "231311", "J" => "112133", "K" => "112331", "L" => "132131", "M" => "113123", "N" => "113321", "O" => "133121", "P" => "313121", "Q" => "211331", "R" => "231131", "S" => "213113", "T" => "213311", "U" => "213131", "V" => "311123", "W" => "311321", "X" => "331121", "Y" => "312113", "Z" => "312311", "[" => "332111", "\\" => "314111", "]" => "221411", "^" => "431111", "_" => "111224", "NUL" => "111422", "SOH" => "121124", "STX" => "121421", "ETX" => "141122", "EOT" => "141221", "ENQ" => "112214", "ACK" => "112412", "BEL" => "122114", "BS" => "122411", "HT" => "142112", "LF" => "142211", "VT" => "241211", "FF" => "221114", "CR" => "413111", "SO" => "241112", "SI" => "134111", "DLE" => "111242", "DC1" => "121142", "DC2" => "121241", "DC3" => "114212", "DC4" => "124112", "NAK" => "124211", "SYN" => "411212", "ETB" => "421112", "CAN" => "421211", "EM" => "212141", "SUB" => "214121", "ESC" => "412121", "FS" => "111143", "GS" => "111341", "RS" => "131141", "US" => "114113", "FNC 3" => "114311", "FNC 2" => "411113", "SHIFT" => "411311", "CODE C" => "113141", "CODE B" => "114131", "FNC 4" => "311141", "FNC 1" => "411131", "Start A" => "211412", "Start B" => "211214", "Start C" => "211232", "Stop" => "2331112"),
'code39' => array("0" => "111221211", "1" => "211211112", "2" => "112211112", "3" => "212211111", "4" => "111221112", "5" => "211221111", "6" => "112221111", "7" => "111211212", "8" => "211211211", "9" => "112211211", "A" => "211112112", "B" => "112112112", "C" => "212112111", "D" => "111122112", "E" => "211122111", "F" => "112122111", "G" => "111112212", "H" => "211112211", "I" => "112112211", "J" => "111122211", "K" => "211111122", "L" => "112111122", "M" => "212111121", "N" => "111121122", "O" => "211121121", "P" => "112121121", "Q" => "111111222", "R" => "211111221", "S" => "112111221", "T" => "111121221", "U" => "221111112", "V" => "122111112", "W" => "222111111", "X" => "121121112", "Y" => "221121111", "Z" => "122121111", "-" => "121111212", "." => "221111211", " " => "122111211", "$" => "121212111", "/" => "121211121", "+" => "121112121", "%" => "111212121", "*" => "121121211"),
'code25' => array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0"),
'codabar' => array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "$", ":", "/", ".", "+", "A", "B", "C", "D")
);
$code_symbologies2 = array(
'code25' => array("3-1-1-1-3", "1-3-1-1-3", "3-3-1-1-1", "1-1-3-1-3", "3-1-3-1-1", "1-3-3-1-1", "1-1-1-3-3", "3-1-1-3-1", "1-3-1-3-1", "1-1-3-3-1"),
'codabar' => array("1111221", "1112112", "2211111", "1121121", "2111121", "1211112", "1211211", "1221111", "2112111", "1111122", "1112211", "1122111", "2111212", "2121112", "2121211", "1121212", "1122121", "1212112", "1112122", "1112221")
);
// Define checksums for codes that use checksums
$code_checksums = array(
'code128' => 104,
'code128b' => 104,
'code128a' => 103,
);
$code_prefix_suffix_fmt = array(
'code128' => '211214%s2331112',
'code128b' => '211214%s2331112',
'code128a' => '211214%s2331112',
'code39' => '1211212111%s121121211',
'code25' => '1111%s311',
'codabar' => '11221211%s1122121'
);
if (isset($code_symbologies1[$code_type])) {
// Initialize arguments
$code_array1 = $code_symbologies1[$code_type];
if (isset($code_symbologies2[$code_type])) {
$code_array2 = $code_symbologies2[$code_type];
}
$code_format_str = $code_prefix_suffix_fmt[$code_type];
if (isset($code_checksums[$code_type])) {
$chksum = $code_checksums[$code_type];
}
}
$code_string = "";
switch ($code_type) {
// Code 128 family is mostly the same. The biggest difference is code128a is uppercase.
case 'code128a':
$text = strtoupper($text);
case 'code128':
case 'code128b':
$code_keys = array_keys($code_array1);
$code_values = array_flip($code_keys);
for ($X = 1; $X <= strlen($text); $X++) {
$activeKey = substr($text, ($X - 1), 1);
$code_string .= $code_array1[$activeKey];
$chksum = ($chksum + ($code_values[$activeKey] * $X));
}
$code_string .= $code_array1[$code_keys[($chksum - (intval($chksum / 103) * 103))]];
break;
case 'code39':
$text = strtoupper($text);
for ($X = 1; $X <= strlen($text); $X++) {
$code_string .= $code_array1[substr($text, ($X - 1), 1)] . "1";
}
break;
case 'code25':
for ($X = 1; $X <= strlen($text); $X++) {
for ($Y = 0; $Y < count($code_array1); $Y++) {
if (substr($text, ($X - 1), 1) == $code_array1[$Y]) {
$temp[$X] = $code_array2[$Y];
}
}
}
for ($X = 1; $X <= strlen($text); $X+=2) {
if (isset($temp[$X]) && isset($temp[($X + 1)])) {
$temp1 = explode("-", $temp[$X]);
$temp2 = explode("-", $temp[($X + 1)]);
for ($Y = 0; $Y < count($temp1); $Y++) {
$code_string .= $temp1[$Y] . $temp2[$Y];
}
}
}
break;
case 'codabar':
// Convert to uppercase
$text = strtoupper($text);
for ($X = 1; $X <= strlen($text); $X++) {
for ($Y = 0; $Y < count($code_array1); $Y++) {
if (substr($text, ($X - 1), 1) == $code_array1[$Y]) {
$code_string .= $code_array2[$Y] . "1";
}
}
}
break;
}
// Pad the edges of the barcode
$code_length = 20;
$code_string = sprintf($code_format_str, $code_string);
for ($i = 1; $i <= strlen($code_string); $i++) {
$code_length = $code_length + (integer) (substr($code_string, ($i - 1), 1));
}
if (strtolower($orientation) == "horizontal") {
$img_width = $code_length;
$img_height = $size;
} else {
$img_width = $size;
$img_height = $code_length;
}
$image = imagecreate($img_width, $img_height);
$black = imagecolorallocate($image, 0, 0, 0);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$location = 10;
for ($position = 1; $position <= strlen($code_string); $position++) {
$cur_size = $location + ( substr($code_string, ($position - 1), 1) );
if (strtolower($orientation) == "horizontal") {
imagefilledrectangle($image, $location, 0, $cur_size, $img_height, ($position % 2 == 0 ? $white : $black));
} else {
imagefilledrectangle($image, 0, $location, $img_width, $cur_size, ($position % 2 == 0 ? $white : $black));
}
$location = $cur_size;
}
// Draw barcode to the screen
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
}
?>