source: trunk/client/inc/hpdf/_mypdf/00_fpdf_codebar.class.php@ 2

Last change on this file since 2 was 2, checked in by root, 15 years ago

importo il progetto

File size: 7.2 KB
Line 
1<?php
2/*************************************************************************
3 * http://www.fpdf.org/en/script/script5.php
4 *
5 * @author Olivier
6 *
7 * This script implements EAN13 and UPC-A barcodes (the second being a particular case of the first one). Bars are drawn directly in the PDF (no image is generated).
8 * EAN13(float x, float y, string barcode [, float h [, float w]])
9 * x: abscissa of barcode.
10 * y: ordinate of barcode.
11 * barcode: value of barcode.
12 * h: height of barcode. Default value: 16.
13 * w: width of a bar. Default value: 0.35.
14 *
15 * UPC_A(float x, float y, string barcode [, float h [, float w]])
16 *
17 * Same parameters.
18 *
19 * An EAN13 barcode is made up of 13 digits, UPC-A of 12 (leading zeroes are added if necessary). The last digit is a check digit; if it's not supplied, it will be automatically computed.
20 ************************************************************************/
21
22/*************************************************************************
23 * http://www.fpdf.org/en/script/script46.php
24 *
25 * @author The-eh
26 *
27 * This script implements Code 39 barcodes. A Code 39 barcode can encode a string with the following characters: digits (0 to 9), uppercase letters (A to Z) and 8 additional characters (- . space $ / + % *).
28 * Code39(float xpos, float ypos, string code [, float baseline [, float height]])
29 * xpos: abscissa of barcode
30 * ypos: ordinate of barcode
31 * code: value of barcode
32 * height: bar height
33 * baseline: corresponds to the width of a wide bar
34 ************************************************************************/
35
36
37if (!defined('__CLASS_FPDF_CODEBAR__'))
38{
39 define('__CLASS_FPDF_CODEBAR__', true);
40
41 require_once(dirname(__FILE__).'/../_fpdf/fpdf.php');
42
43 class FPDF_Codebar extends FPDF
44 {
45 var $footer_param = array();
46
47 function FPDF_Codebar($sens = 'P', $unit = 'mm', $format = 'A4')
48 {
49 $this->FPDF($sens, $unit, $format);
50 }
51
52 function BARCODE_EAN13($x,$y,$barcode,$h=10,$w=.35)
53 {
54 return $this->Barcode($x,$y,$barcode,$h,$w,13);
55 }
56
57 function BARCODE_UPC_A($x,$y,$barcode,$h=10,$w=.35)
58 {
59 return $this->Barcode($x,$y,$barcode,$h,$w,12);
60 }
61
62 function GetCheckDigit($barcode)
63 {
64 //Compute the check digit
65 $sum=0;
66 for($i=1;$i<=11;$i+=2)
67 $sum+=3*$barcode{$i};
68 for($i=0;$i<=10;$i+=2)
69 $sum+=$barcode{$i};
70 $r=$sum%10;
71 if($r>0)
72 $r=10-$r;
73 return $r;
74 }
75
76 function TestCheckDigit($barcode)
77 {
78 //Test validity of check digit
79 $sum=0;
80 for($i=1;$i<=11;$i+=2)
81 $sum+=3*$barcode{$i};
82 for($i=0;$i<=10;$i+=2)
83 $sum+=$barcode{$i};
84 return ($sum+$barcode{12})%10==0;
85 }
86
87 function Barcode($x,$y,$barcode,$h,$w,$len)
88 {
89 //Padding
90 $barcode=str_pad($barcode,$len-1,'0',STR_PAD_LEFT);
91 if($len==12)
92 $barcode='0'.$barcode;
93 //Add or control the check digit
94 if(strlen($barcode)==12)
95 $barcode.=$this->GetCheckDigit($barcode);
96 elseif(!$this->TestCheckDigit($barcode))
97 $this->Error('Incorrect check digit');
98 //Convert digits to bars
99 $codes=array(
100 'A'=>array(
101 '0'=>'0001101','1'=>'0011001','2'=>'0010011','3'=>'0111101','4'=>'0100011',
102 '5'=>'0110001','6'=>'0101111','7'=>'0111011','8'=>'0110111','9'=>'0001011'),
103 'B'=>array(
104 '0'=>'0100111','1'=>'0110011','2'=>'0011011','3'=>'0100001','4'=>'0011101',
105 '5'=>'0111001','6'=>'0000101','7'=>'0010001','8'=>'0001001','9'=>'0010111'),
106 'C'=>array(
107 '0'=>'1110010','1'=>'1100110','2'=>'1101100','3'=>'1000010','4'=>'1011100',
108 '5'=>'1001110','6'=>'1010000','7'=>'1000100','8'=>'1001000','9'=>'1110100')
109 );
110 $parities=array(
111 '0'=>array('A','A','A','A','A','A'),
112 '1'=>array('A','A','B','A','B','B'),
113 '2'=>array('A','A','B','B','A','B'),
114 '3'=>array('A','A','B','B','B','A'),
115 '4'=>array('A','B','A','A','B','B'),
116 '5'=>array('A','B','B','A','A','B'),
117 '6'=>array('A','B','B','B','A','A'),
118 '7'=>array('A','B','A','B','A','B'),
119 '8'=>array('A','B','A','B','B','A'),
120 '9'=>array('A','B','B','A','B','A')
121 );
122 $code='101';
123 $p=$parities[$barcode{0}];
124 for($i=1;$i<=6;$i++)
125 $code.=$codes[$p[$i-1]][$barcode{$i}];
126 $code.='01010';
127 for($i=7;$i<=12;$i++)
128 $code.=$codes['C'][$barcode{$i}];
129 $code.='101';
130 //Draw bars
131 for($i=0;$i<strlen($code);$i++)
132 {
133 if($code{$i}=='1')
134 $this->Rect($x+$i*$w,$y,$w,$h,'F');
135 }
136
137 $code_w = strlen($code)*$w;
138 $code_t = substr($barcode,-$len);
139
140 $code_f = $code_w/strlen($code_t)*$this->k/0.60;
141 $code_h = $h+$code_f/$this->k;
142
143 //Print text uder barcode
144 $this->SetFont('Arial','',$code_f);
145 $this->Text($x,$y+$h+0.90*$code_f/$this->k,$code_t);
146
147 return array($code_w, $code_h);
148 }
149
150 function BARCODE_CODE39($xpos, $ypos, $code,$height=10, $baseline=0.5 )
151 {
152
153 $wide = $baseline;
154 $narrow = $baseline / 3 ;
155 $gap = $narrow;
156
157 $barChar['0'] = 'nnnwwnwnn';
158 $barChar['1'] = 'wnnwnnnnw';
159 $barChar['2'] = 'nnwwnnnnw';
160 $barChar['3'] = 'wnwwnnnnn';
161 $barChar['4'] = 'nnnwwnnnw';
162 $barChar['5'] = 'wnnwwnnnn';
163 $barChar['6'] = 'nnwwwnnnn';
164 $barChar['7'] = 'nnnwnnwnw';
165 $barChar['8'] = 'wnnwnnwnn';
166 $barChar['9'] = 'nnwwnnwnn';
167 $barChar['A'] = 'wnnnnwnnw';
168 $barChar['B'] = 'nnwnnwnnw';
169 $barChar['C'] = 'wnwnnwnnn';
170 $barChar['D'] = 'nnnnwwnnw';
171 $barChar['E'] = 'wnnnwwnnn';
172 $barChar['F'] = 'nnwnwwnnn';
173 $barChar['G'] = 'nnnnnwwnw';
174 $barChar['H'] = 'wnnnnwwnn';
175 $barChar['I'] = 'nnwnnwwnn';
176 $barChar['J'] = 'nnnnwwwnn';
177 $barChar['K'] = 'wnnnnnnww';
178 $barChar['L'] = 'nnwnnnnww';
179 $barChar['M'] = 'wnwnnnnwn';
180 $barChar['N'] = 'nnnnwnnww';
181 $barChar['O'] = 'wnnnwnnwn';
182 $barChar['P'] = 'nnwnwnnwn';
183 $barChar['Q'] = 'nnnnnnwww';
184 $barChar['R'] = 'wnnnnnwwn';
185 $barChar['S'] = 'nnwnnnwwn';
186 $barChar['T'] = 'nnnnwnwwn';
187 $barChar['U'] = 'wwnnnnnnw';
188 $barChar['V'] = 'nwwnnnnnw';
189 $barChar['W'] = 'wwwnnnnnn';
190 $barChar['X'] = 'nwnnwnnnw';
191 $barChar['Y'] = 'wwnnwnnnn';
192 $barChar['Z'] = 'nwwnwnnnn';
193 $barChar['-'] = 'nwnnnnwnw';
194 $barChar['.'] = 'wwnnnnwnn';
195 $barChar[' '] = 'nwwnnnwnn';
196 $barChar['*'] = 'nwnnwnwnn';
197 $barChar['$'] = 'nwnwnwnnn';
198 $barChar['/'] = 'nwnwnnnwn';
199 $barChar['+'] = 'nwnnnwnwn';
200 $barChar['%'] = 'nnnwnwnwn';
201
202 $xpos_dep = $xpos;
203 $code = '*'.strtoupper($code).'*';
204 for($i=0; $i<strlen($code); $i++){
205 $char = $code{$i};
206 if(!isset($barChar[$char])){
207 $this->Error('Invalid character in barcode: '.$char);
208 }
209 $seq = $barChar[$char];
210 for($bar=0; $bar<9; $bar++){
211 if($seq{$bar} == 'n'){
212 $lineWidth = $narrow;
213 }else{
214 $lineWidth = $wide;
215 }
216 if($bar % 2 == 0){
217 $this->Rect($xpos, $ypos, $lineWidth, $height, 'F');
218 }
219 $xpos += $lineWidth;
220 }
221 $xpos += $gap;
222 }
223
224 $code_w = $xpos-$xpos_dep;
225 $code_t = $code;
226
227 $code_f = $code_w/strlen($code_t)*$this->k/0.60/3;
228 $code_h = $height+$code_f/$this->k;
229
230 //Print text uder barcode
231 $this->SetFont('Arial','',$code_f);
232 $this->Text($xpos_dep,$ypos+$height+0.90*$code_f/$this->k,$code_t);
233
234 return array($code_w, $code_h);
235 }
236 }
237}
238?>
Note: See TracBrowser for help on using the repository browser.