Chris@441
|
1
|
Chris@441
|
2 #============================================================+
|
Chris@441
|
3 # File name : c39object.rb
|
Chris@441
|
4 # Begin : 2002-07-31
|
Chris@441
|
5 # Last Update : 2004-12-29
|
Chris@441
|
6 # Author : Karim Mribti [barcode@mribti.com]
|
Chris@441
|
7 # : Nicola Asuni [info@tecnick.com]
|
Chris@441
|
8 # Version : 0.0.8a 2001-04-01 (original code)
|
Chris@441
|
9 # License : GNU LGPL (Lesser General Public License) 2.1
|
Chris@441
|
10 # http://www.gnu.org/copyleft/lesser.txt
|
Chris@441
|
11 # Source Code : http://www.mribti.com/barcode/
|
Chris@441
|
12 #
|
Chris@441
|
13 # Description : Code 39 Barcode Render Class for PHP using
|
Chris@441
|
14 # the GD graphics library.
|
Chris@441
|
15 # Code 39 is an alphanumeric bar code that can
|
Chris@441
|
16 # encode decimal number, case alphabet and some
|
Chris@441
|
17 # special symbols.
|
Chris@441
|
18 #
|
Chris@441
|
19 # NOTE:
|
Chris@441
|
20 # This version contains changes by Nicola Asuni:
|
Chris@441
|
21 # - porting to Ruby
|
Chris@441
|
22 # - code style and formatting
|
Chris@441
|
23 # - automatic php documentation in PhpDocumentor Style
|
Chris@441
|
24 # (www.phpdoc.org)
|
Chris@441
|
25 # - minor bug fixing
|
Chris@441
|
26 #============================================================+
|
Chris@441
|
27
|
Chris@441
|
28 #
|
Chris@441
|
29 # Code 39 Barcode Render Class.<br>
|
Chris@441
|
30 # Code 39 is an alphanumeric bar code that can encode decimal number, case alphabet and some special symbols.
|
Chris@441
|
31 # @author Karim Mribti, Nicola Asuni
|
Chris@441
|
32 # @name BarcodeObject
|
Chris@441
|
33 # @package com.tecnick.tcpdf
|
Chris@441
|
34 # @@version 0.0.8a 2001-04-01 (original code)
|
Chris@441
|
35 # @since 2001-03-25
|
Chris@441
|
36 # @license http://www.gnu.org/copyleft/lesser.html LGPL
|
Chris@441
|
37 #
|
Chris@441
|
38
|
Chris@441
|
39 #
|
Chris@441
|
40 # Code 39 Barcode Render Class.<br>
|
Chris@441
|
41 # Code 39 is an alphanumeric bar code that can encode decimal number, case alphabet and some special symbols.
|
Chris@441
|
42 # @author Karim Mribti, Nicola Asuni
|
Chris@441
|
43 # @name BarcodeObject
|
Chris@441
|
44 # @package com.tecnick.tcpdf
|
Chris@441
|
45 # @@version 0.0.8a 2001-04-01 (original code)
|
Chris@441
|
46 # @since 2001-03-25
|
Chris@441
|
47 # @license http://www.gnu.org/copyleft/lesser.html LGPL
|
Chris@441
|
48 #
|
Chris@441
|
49 class C39Object extends BarcodeObject {
|
Chris@441
|
50
|
Chris@441
|
51 #
|
Chris@441
|
52 # Class Constructor.
|
Chris@441
|
53 # @param int $Width Image width in pixels.
|
Chris@441
|
54 # @param int $Height Image height in pixels.
|
Chris@441
|
55 # @param int $Style Barcode style.
|
Chris@441
|
56 # @param int $Value value to print on barcode.
|
Chris@441
|
57 #
|
Chris@441
|
58 def __construct($Width, $Height, $Style, $Value)
|
Chris@441
|
59 parent::__construct($Width, $Height, $Style);
|
Chris@441
|
60 @mValue = $Value;
|
Chris@441
|
61 @mChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-.#$/+%";
|
Chris@441
|
62 @mCharSet = array (
|
Chris@441
|
63 # 0 # "000110100",
|
Chris@441
|
64 # 1 # "100100001",
|
Chris@441
|
65 # 2 # "001100001",
|
Chris@441
|
66 # 3 # "101100000",
|
Chris@441
|
67 # 4 # "000110001",
|
Chris@441
|
68 # 5 # "100110000",
|
Chris@441
|
69 # 6 # "001110000",
|
Chris@441
|
70 # 7 # "000100101",
|
Chris@441
|
71 # 8 # "100100100",
|
Chris@441
|
72 # 9 # "001100100",
|
Chris@441
|
73 # A # "100001001",
|
Chris@441
|
74 # B # "001001001",
|
Chris@441
|
75 # C # "101001000",
|
Chris@441
|
76 # D # "000011001",
|
Chris@441
|
77 # E # "100011000",
|
Chris@441
|
78 # F # "001011000",
|
Chris@441
|
79 # G # "000001101",
|
Chris@441
|
80 # H # "100001100",
|
Chris@441
|
81 # I # "001001100",
|
Chris@441
|
82 # J # "000011100",
|
Chris@441
|
83 # K # "100000011",
|
Chris@441
|
84 # L # "001000011",
|
Chris@441
|
85 # M # "101000010",
|
Chris@441
|
86 # N # "000010011",
|
Chris@441
|
87 # O # "100010010",
|
Chris@441
|
88 # P # "001010010",
|
Chris@441
|
89 # Q # "000000111",
|
Chris@441
|
90 # R # "100000110",
|
Chris@441
|
91 # S # "001000110",
|
Chris@441
|
92 # T # "000010110",
|
Chris@441
|
93 # U # "110000001",
|
Chris@441
|
94 # V # "011000001",
|
Chris@441
|
95 # W # "111000000",
|
Chris@441
|
96 # X # "010010001",
|
Chris@441
|
97 # Y # "110010000",
|
Chris@441
|
98 # Z # "011010000",
|
Chris@441
|
99 # - # "010000101",
|
Chris@441
|
100 # . # "110000100",
|
Chris@441
|
101 # SP# "011000100",
|
Chris@441
|
102 /*# # "010010100",
|
Chris@441
|
103 # $ # "010101000",
|
Chris@441
|
104 # / # "010100010",
|
Chris@441
|
105 # + # "010001010",
|
Chris@441
|
106 # % # "000101010"
|
Chris@441
|
107 );
|
Chris@441
|
108 end
|
Chris@441
|
109
|
Chris@441
|
110 #
|
Chris@441
|
111 # Returns the character index.
|
Chris@441
|
112 # @param char $char character.
|
Chris@441
|
113 # @return int character index or -1 in case of error.
|
Chris@441
|
114 # @access private
|
Chris@441
|
115 #
|
Chris@441
|
116 def GetCharIndex($char)
|
Chris@441
|
117 for ($i=0;$i<44;$i++)
|
Chris@441
|
118 if (@mChars[$i] == $char)
|
Chris@441
|
119 return $i;
|
Chris@441
|
120 end
|
Chris@441
|
121 end
|
Chris@441
|
122 return -1;
|
Chris@441
|
123 end
|
Chris@441
|
124
|
Chris@441
|
125 #
|
Chris@441
|
126 # Returns barcode size.
|
Chris@441
|
127 # @param int $xres Horizontal resolution.
|
Chris@441
|
128 # @return barcode size.
|
Chris@441
|
129 # @access private
|
Chris@441
|
130 #
|
Chris@441
|
131 def GetSize($xres)
|
Chris@441
|
132 $len = @mValue.length;
|
Chris@441
|
133
|
Chris@441
|
134 if ($len == 0) {
|
Chris@441
|
135 @mError = "Null value";
|
Chris@441
|
136 return false;
|
Chris@441
|
137 end
|
Chris@441
|
138
|
Chris@441
|
139 for ($i=0;$i<$len;$i++)
|
Chris@441
|
140 if (GetCharIndex(@mValue[$i]) == -1 || @mValue[$i] == '*')
|
Chris@441
|
141 # The asterisk is only used as a start and stop code#
|
Chris@441
|
142 @mError = "C39 not include the char '".@mValue[$i]."'";
|
Chris@441
|
143 return false;
|
Chris@441
|
144 end
|
Chris@441
|
145 end
|
Chris@441
|
146
|
Chris@441
|
147 # Start, Stop is 010010100 == '*' #
|
Chris@441
|
148 $StartSize = BCD_C39_NARROW_BAR# $xres# 6 + BCD_C39_WIDE_BAR# $xres# 3;
|
Chris@441
|
149 $StopSize = BCD_C39_NARROW_BAR# $xres# 6 + BCD_C39_WIDE_BAR# $xres# 3;
|
Chris@441
|
150 $CharSize = BCD_C39_NARROW_BAR# $xres# 6 + BCD_C39_WIDE_BAR# $xres# 3; # Same for all chars#
|
Chris@441
|
151
|
Chris@441
|
152 return $CharSize# $len + $StartSize + $StopSize + # Space between chars# BCD_C39_NARROW_BAR# $xres# ($len-1);
|
Chris@441
|
153 end
|
Chris@441
|
154
|
Chris@441
|
155 #
|
Chris@441
|
156 # Draws the start code.
|
Chris@441
|
157 # @param int $DrawPos Drawing position.
|
Chris@441
|
158 # @param int $yPos Vertical position.
|
Chris@441
|
159 # @param int $ySize Vertical size.
|
Chris@441
|
160 # @param int $xres Horizontal resolution.
|
Chris@441
|
161 # @return int drawing position.
|
Chris@441
|
162 # @access private
|
Chris@441
|
163 #
|
Chris@441
|
164 def DrawStart($DrawPos, $yPos, $ySize, $xres)
|
Chris@441
|
165 # Start code is '*'#
|
Chris@441
|
166 $narrow = BCD_C39_NARROW_BAR# $xres;
|
Chris@441
|
167 $wide = BCD_C39_WIDE_BAR# $xres;
|
Chris@441
|
168 @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize);
|
Chris@441
|
169 $DrawPos += $narrow;
|
Chris@441
|
170 $DrawPos += $wide;
|
Chris@441
|
171 @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize);
|
Chris@441
|
172 $DrawPos += $narrow;
|
Chris@441
|
173 $DrawPos += $narrow;
|
Chris@441
|
174 @DrawSingleBar($DrawPos, $yPos, $wide , $ySize);
|
Chris@441
|
175 $DrawPos += $wide;
|
Chris@441
|
176 $DrawPos += $narrow;
|
Chris@441
|
177 @DrawSingleBar($DrawPos, $yPos, $wide , $ySize);
|
Chris@441
|
178 $DrawPos += $wide;
|
Chris@441
|
179 $DrawPos += $narrow;
|
Chris@441
|
180 @DrawSingleBar($DrawPos, $yPos, $narrow, $ySize);
|
Chris@441
|
181 $DrawPos += $narrow;
|
Chris@441
|
182 $DrawPos += $narrow; # Space between chars#
|
Chris@441
|
183 return $DrawPos;
|
Chris@441
|
184 end
|
Chris@441
|
185
|
Chris@441
|
186 #
|
Chris@441
|
187 # Draws the stop code.
|
Chris@441
|
188 # @param int $DrawPos Drawing position.
|
Chris@441
|
189 # @param int $yPos Vertical position.
|
Chris@441
|
190 # @param int $ySize Vertical size.
|
Chris@441
|
191 # @param int $xres Horizontal resolution.
|
Chris@441
|
192 # @return int drawing position.
|
Chris@441
|
193 # @access private
|
Chris@441
|
194 #
|
Chris@441
|
195 def DrawStop($DrawPos, $yPos, $ySize, $xres)
|
Chris@441
|
196 # Stop code is '*'#
|
Chris@441
|
197 $narrow = BCD_C39_NARROW_BAR# $xres;
|
Chris@441
|
198 $wide = BCD_C39_WIDE_BAR# $xres;
|
Chris@441
|
199 @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize);
|
Chris@441
|
200 $DrawPos += $narrow;
|
Chris@441
|
201 $DrawPos += $wide;
|
Chris@441
|
202 @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize);
|
Chris@441
|
203 $DrawPos += $narrow;
|
Chris@441
|
204 $DrawPos += $narrow;
|
Chris@441
|
205 @DrawSingleBar($DrawPos, $yPos, $wide , $ySize);
|
Chris@441
|
206 $DrawPos += $wide;
|
Chris@441
|
207 $DrawPos += $narrow;
|
Chris@441
|
208 @DrawSingleBar($DrawPos, $yPos, $wide , $ySize);
|
Chris@441
|
209 $DrawPos += $wide;
|
Chris@441
|
210 $DrawPos += $narrow;
|
Chris@441
|
211 @DrawSingleBar($DrawPos, $yPos, $narrow, $ySize);
|
Chris@441
|
212 $DrawPos += $narrow;
|
Chris@441
|
213 return $DrawPos;
|
Chris@441
|
214 end
|
Chris@441
|
215
|
Chris@441
|
216 #
|
Chris@441
|
217 # Draws the barcode object.
|
Chris@441
|
218 # @param int $xres Horizontal resolution.
|
Chris@441
|
219 # @return bool true in case of success.
|
Chris@441
|
220 #
|
Chris@441
|
221 def DrawObject($xres)
|
Chris@441
|
222 $len = @mValue.length;
|
Chris@441
|
223
|
Chris@441
|
224 $narrow = BCD_C39_NARROW_BAR# $xres;
|
Chris@441
|
225 $wide = BCD_C39_WIDE_BAR# $xres;
|
Chris@441
|
226
|
Chris@441
|
227 if (($size = GetSize($xres))==0)
|
Chris@441
|
228 return false;
|
Chris@441
|
229 end
|
Chris@441
|
230
|
Chris@441
|
231 $cPos = 0;
|
Chris@441
|
232 if (@mStyle & BCS_ALIGN_CENTER) $sPos = (integer)((@mWidth - $size ) / 2);
|
Chris@441
|
233 elsif (@mStyle & BCS_ALIGN_RIGHT) $sPos = @mWidth - $size;
|
Chris@441
|
234 else $sPos = 0;
|
Chris@441
|
235
|
Chris@441
|
236 # Total height of bar code -Bars only-#
|
Chris@441
|
237 if (@mStyle & BCS_DRAW_TEXT) $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2 - GetFontHeight(@mFont);
|
Chris@441
|
238 else $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2;
|
Chris@441
|
239
|
Chris@441
|
240 # Draw text#
|
Chris@441
|
241 if (@mStyle & BCS_DRAW_TEXT)
|
Chris@441
|
242 if (@mStyle & BCS_STRETCH_TEXT)
|
Chris@441
|
243 for ($i=0;$i<$len;$i++)
|
Chris@441
|
244 @DrawChar(@mFont, $sPos+($narrow*6+$wide*3)+($size/$len)*$i,
|
Chris@441
|
245 $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue[$i]);
|
Chris@441
|
246 else# Center#
|
Chris@441
|
247 $text_width = GetFontWidth(@mFont)# @mValue.length;
|
Chris@441
|
248 @DrawText(@mFont, $sPos+(($size-$text_width)/2)+($narrow*6+$wide*3),
|
Chris@441
|
249 $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue);
|
Chris@441
|
250 end
|
Chris@441
|
251 end
|
Chris@441
|
252
|
Chris@441
|
253 $DrawPos = @DrawStart($sPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres);
|
Chris@441
|
254 do {
|
Chris@441
|
255 $c = GetCharIndex(@mValue[$cPos]);
|
Chris@441
|
256 $cset = @mCharSet[$c];
|
Chris@441
|
257 @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[0] == '0') ? $narrow : $wide , $ysize);
|
Chris@441
|
258 $DrawPos += ($cset[0] == '0') ? $narrow : $wide;
|
Chris@441
|
259 $DrawPos += ($cset[1] == '0') ? $narrow : $wide;
|
Chris@441
|
260 @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[2] == '0') ? $narrow : $wide , $ysize);
|
Chris@441
|
261 $DrawPos += ($cset[2] == '0') ? $narrow : $wide;
|
Chris@441
|
262 $DrawPos += ($cset[3] == '0') ? $narrow : $wide;
|
Chris@441
|
263 @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[4] == '0') ? $narrow : $wide , $ysize);
|
Chris@441
|
264 $DrawPos += ($cset[4] == '0') ? $narrow : $wide;
|
Chris@441
|
265 $DrawPos += ($cset[5] == '0') ? $narrow : $wide;
|
Chris@441
|
266 @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[6] == '0') ? $narrow : $wide , $ysize);
|
Chris@441
|
267 $DrawPos += ($cset[6] == '0') ? $narrow : $wide;
|
Chris@441
|
268 $DrawPos += ($cset[7] == '0') ? $narrow : $wide;
|
Chris@441
|
269 @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[8] == '0') ? $narrow : $wide , $ysize);
|
Chris@441
|
270 $DrawPos += ($cset[8] == '0') ? $narrow : $wide;
|
Chris@441
|
271 $DrawPos += $narrow; # Space between chars#
|
Chris@441
|
272 $cPos += 1;
|
Chris@441
|
273 end while ($cPos<$len);
|
Chris@441
|
274 $DrawPos = @DrawStop($DrawPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres);
|
Chris@441
|
275 return true;
|
Chris@441
|
276 end
|
Chris@441
|
277 }
|
Chris@441
|
278
|
Chris@441
|
279 #============================================================+
|
Chris@441
|
280 # END OF FILE
|
Chris@441
|
281 #============================================================+
|