PluginProbe
Welcart e-Commerce / 1.4.0
Welcart e-Commerce v1.4.0
2.12.4 2.12.3 2.11.35 2.12.2 2.12.1 2.11.34 2.11.33 2.11.32 2.11.31 2.11.30 1.3.16 1.3.17 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.10 1.4.11 1.4.12 All 292 releases
usc-e-shop / pdf / tcpdf / 2dbarcodes.php

2dbarcodes.php in Welcart e-Commerce 1.4.0, at pdf/tcpdf/2dbarcodes.php

333 lines 13.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 //============================================================+
3 // File name : 2dbarcodes.php
4 // Version : 1.0.013
5 // Begin : 2009-04-07
6 // Last Update : 2012-01-12
7 // Author : Nicola Asuni - Tecnick.com LTD - Manor Coach House, Church Hill, Aldershot, Hants, GU12 4RQ, UK - www.tecnick.com - info@tecnick.com
8 // License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
9 // -------------------------------------------------------------------
10 // Copyright (C) 2009-2012 Nicola Asuni - Tecnick.com LTD
11 //
12 // This file is part of TCPDF software library.
13 //
14 // TCPDF is free software: you can redistribute it and/or modify it
15 // under the terms of the GNU Lesser General Public License as
16 // published by the Free Software Foundation, either version 3 of the
17 // License, or (at your option) any later version.
18 //
19 // TCPDF is distributed in the hope that it will be useful, but
20 // WITHOUT ANY WARRANTY; without even the implied warranty of
21 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22 // See the GNU Lesser General Public License for more details.
23 //
24 // You should have received a copy of the GNU Lesser General Public License
25 // along with TCPDF. If not, see <http://www.gnu.org/licenses/>.
26 //
27 // See LICENSE.TXT file for more information.
28 // -------------------------------------------------------------------
29 //
30 // Description : PHP class to creates array representations for
31 // 2D barcodes to be used with TCPDF.
32 //
33 //============================================================+
34
35 /**
36 * @file
37 * PHP class to creates array representations for 2D barcodes to be used with TCPDF.
38 * @package com.tecnick.tcpdf
39 * @author Nicola Asuni
40 * @version 1.0.013
41 */
42
43 /**
44 * @class TCPDF2DBarcode
45 * PHP class to creates array representations for 2D barcodes to be used with TCPDF (http://www.tcpdf.org).
46 * @package com.tecnick.tcpdf
47 * @version 1.0.013
48 * @author Nicola Asuni
49 */
50 class TCPDF2DBarcode {
51
52 /**
53 * Array representation of barcode.
54 * @protected
55 */
56 protected $barcode_array = false;
57
58 /**
59 * This is the class constructor.
60 * Return an array representations for 2D barcodes:<ul>
61 * <li>$arrcode['code'] code to be printed on text label</li>
62 * <li>$arrcode['num_rows'] required number of rows</li>
63 * <li>$arrcode['num_cols'] required number of columns</li>
64 * <li>$arrcode['bcode'][$r][$c] value of the cell is $r row and $c column (0 = transparent, 1 = black)</li></ul>
65 * @param $code (string) code to print
66 * @param $type (string) type of barcode: <ul><li>DATAMATRIX : Datamatrix (ISO/IEC 16022)</li><li>PDF417 : PDF417 (ISO/IEC 15438:2006)</li><li>PDF417,a,e,t,s,f,o0,o1,o2,o3,o4,o5,o6 : PDF417 with parameters: a = aspect ratio (width/height); e = error correction level (0-8); t = total number of macro segments; s = macro segment index (0-99998); f = file ID; o0 = File Name (text); o1 = Segment Count (numeric); o2 = Time Stamp (numeric); o3 = Sender (text); o4 = Addressee (text); o5 = File Size (numeric); o6 = Checksum (numeric). NOTES: Parameters t, s and f are required for a Macro Control Block, all other parametrs are optional. To use a comma character ',' on text options, replace it with the character 255: "\xff".</li><li>QRCODE : QRcode Low error correction</li><li>QRCODE,L : QRcode Low error correction</li><li>QRCODE,M : QRcode Medium error correction</li><li>QRCODE,Q : QRcode Better error correction</li><li>QRCODE,H : QR-CODE Best error correction</li><li>RAW: raw mode - comma-separad list of array rows</li><li>RAW2: raw mode - array rows are surrounded by square parenthesis.</li><li>TEST : Test matrix</li></ul>
67 */
68 public function __construct($code, $type) {
69 $this->setBarcode($code, $type);
70 }
71
72 /**
73 * Return an array representations of barcode.
74 * @return array
75 */
76 public function getBarcodeArray() {
77 return $this->barcode_array;
78 }
79
80 /**
81 * Send barcode as SVG image object to the standard output.
82 * @param $w (int) Width of a single rectangle element in user units.
83 * @param $h (int) Height of a single rectangle element in user units.
84 * @param $color (string) Foreground color (in SVG format) for bar elements (background is transparent).
85 * @public
86 */
87 public function getBarcodeSVG($w=3, $h=3, $color='black') {
88 // send headers
89 $code = $this->getBarcodeSVGcode($w, $h, $color);
90 header('Content-Type: application/svg+xml');
91 header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
92 header('Pragma: public');
93 header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
94 header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
95 header('Content-Disposition: inline; filename="'.md5($code).'.svg";');
96 //header('Content-Length: '.strlen($code));
97 echo $code;
98 }
99
100 /**
101 * Return a SVG string representation of barcode.
102 * @param $w (int) Width of a single rectangle element in user units.
103 * @param $h (int) Height of a single rectangle element in user units.
104 * @param $color (string) Foreground color (in SVG format) for bar elements (background is transparent).
105 * @return string SVG code.
106 * @public
107 */
108 public function getBarcodeSVGcode($w=3, $h=3, $color='black') {
109 // replace table for special characters
110 $repstr = array("\0" => '', '&' => '&amp;', '<' => '&lt;', '>' => '&gt;');
111 $svg = '<'.'?'.'xml version="1.0" standalone="no"'.'?'.'>'."\n";
112 $svg .= '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'."\n";
113 $svg .= '<svg width="'.round(($this->barcode_array['num_cols'] * $w), 3).'" height="'.round(($this->barcode_array['num_rows'] * $h), 3).'" version="1.1" xmlns="http://www.w3.org/2000/svg">'."\n";
114 $svg .= "\t".'<desc>'.strtr($this->barcode_array['code'], $repstr).'</desc>'."\n";
115 $svg .= "\t".'<g id="elements" fill="'.$color.'" stroke="none">'."\n";
116 // print barcode elements
117 $y = 0;
118 // for each row
119 for ($r = 0; $r < $this->barcode_array['num_rows']; ++$r) {
120 $x = 0;
121 // for each column
122 for ($c = 0; $c < $this->barcode_array['num_cols']; ++$c) {
123 if ($this->barcode_array['bcode'][$r][$c] == 1) {
124 // draw a single barcode cell
125 $svg .= "\t\t".'<rect x="'.$x.'" y="'.$y.'" width="'.$w.'" height="'.$h.'" />'."\n";
126 }
127 $x += $w;
128 }
129 $y += $h;
130 }
131 $svg .= "\t".'</g>'."\n";
132 $svg .= '</svg>'."\n";
133 return $svg;
134 }
135
136 /**
137 * Return an HTML representation of barcode.
138 * @param $w (int) Width of a single rectangle element in pixels.
139 * @param $h (int) Height of a single rectangle element in pixels.
140 * @param $color (string) Foreground color for bar elements (background is transparent).
141 * @return string HTML code.
142 * @public
143 */
144 public function getBarcodeHTML($w=10, $h=10, $color='black') {
145 $html = '<div style="font-size:0;position:relative;width:'.($w * $this->barcode_array['num_cols']).'px;height:'.($h * $this->barcode_array['num_rows']).'px;">'."\n";
146 // print barcode elements
147 $y = 0;
148 // for each row
149 for ($r = 0; $r < $this->barcode_array['num_rows']; ++$r) {
150 $x = 0;
151 // for each column
152 for ($c = 0; $c < $this->barcode_array['num_cols']; ++$c) {
153 if ($this->barcode_array['bcode'][$r][$c] == 1) {
154 // draw a single barcode cell
155 $html .= '<div style="background-color:'.$color.';width:'.$w.'px;height:'.$h.'px;position:absolute;left:'.$x.'px;top:'.$y.'px;">&nbsp;</div>'."\n";
156 }
157 $x += $w;
158 }
159 $y += $h;
160 }
161 $html .= '</div>'."\n";
162 return $html;
163 }
164
165 /**
166 * Return a PNG image representation of barcode (requires GD or Imagick library).
167 * @param $w (int) Width of a single rectangle element in pixels.
168 * @param $h (int) Height of a single rectangle element in pixels.
169 * @param $color (array) RGB (0-255) foreground color for bar elements (background is transparent).
170 * @return image or false in case of error.
171 * @public
172 */
173 public function getBarcodePNG($w=3, $h=3, $color=array(0,0,0)) {
174 // calculate image size
175 $width = ($this->barcode_array['num_cols'] * $w);
176 $height = ($this->barcode_array['num_rows'] * $h);
177 if (function_exists('imagecreate')) {
178 // GD library
179 $imagick = false;
180 $png = imagecreate($width, $height);
181 $bgcol = imagecolorallocate($png, 255, 255, 255);
182 imagecolortransparent($png, $bgcol);
183 $fgcol = imagecolorallocate($png, $color[0], $color[1], $color[2]);
184 } elseif (extension_loaded('imagick')) {
185 $imagick = true;
186 $bgcol = new imagickpixel('rgb(255,255,255');
187 $fgcol = new imagickpixel('rgb('.$color[0].','.$color[1].','.$color[2].')');
188 $png = new Imagick();
189 $png->newImage($width, $height, 'none', 'png');
190 $bar = new imagickdraw();
191 $bar->setfillcolor($fgcol);
192 } else {
193 return false;
194 }
195 // print barcode elements
196 $y = 0;
197 // for each row
198 for ($r = 0; $r < $this->barcode_array['num_rows']; ++$r) {
199 $x = 0;
200 // for each column
201 for ($c = 0; $c < $this->barcode_array['num_cols']; ++$c) {
202 if ($this->barcode_array['bcode'][$r][$c] == 1) {
203 // draw a single barcode cell
204 if ($imagick) {
205 $bar->rectangle($x, $y, ($x + $w), ($y + $h));
206 } else {
207 imagefilledrectangle($png, $x, $y, ($x + $w), ($y + $h), $fgcol);
208 }
209 }
210 $x += $w;
211 }
212 $y += $h;
213 }
214 // send headers
215 header('Content-Type: image/png');
216 header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
217 header('Pragma: public');
218 header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
219 header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
220 if ($imagick) {
221 $png->drawimage($bar);
222 echo $png;
223 } else {
224 imagepng($png);
225 imagedestroy($png);
226 }
227 }
228
229 /**
230 * Set the barcode.
231 * @param $code (string) code to print
232 * @param $type (string) type of barcode: <ul><li>DATAMATRIX : Datamatrix (ISO/IEC 16022)</li><li>PDF417 : PDF417 (ISO/IEC 15438:2006)</li><li>PDF417,a,e,t,s,f,o0,o1,o2,o3,o4,o5,o6 : PDF417 with parameters: a = aspect ratio (width/height); e = error correction level (0-8); t = total number of macro segments; s = macro segment index (0-99998); f = file ID; o0 = File Name (text); o1 = Segment Count (numeric); o2 = Time Stamp (numeric); o3 = Sender (text); o4 = Addressee (text); o5 = File Size (numeric); o6 = Checksum (numeric). NOTES: Parameters t, s and f are required for a Macro Control Block, all other parametrs are optional. To use a comma character ',' on text options, replace it with the character 255: "\xff".</li><li>QRCODE : QRcode Low error correction</li><li>QRCODE,L : QRcode Low error correction</li><li>QRCODE,M : QRcode Medium error correction</li><li>QRCODE,Q : QRcode Better error correction</li><li>QRCODE,H : QR-CODE Best error correction</li><li>RAW: raw mode - comma-separad list of array rows</li><li>RAW2: raw mode - array rows are surrounded by square parenthesis.</li><li>TEST : Test matrix</li></ul>
233 * @return array
234 */
235 public function setBarcode($code, $type) {
236 $mode = explode(',', $type);
237 $qrtype = strtoupper($mode[0]);
238 switch ($qrtype) {
239 case 'DATAMATRIX': { // DATAMATRIX (ISO/IEC 16022)
240 require_once(dirname(__FILE__).'/datamatrix.php');
241 $qrcode = new Datamatrix($code);
242 $this->barcode_array = $qrcode->getBarcodeArray();
243 $this->barcode_array['code'] = $code;
244 break;
245 }
246 case 'PDF417': { // PDF417 (ISO/IEC 15438:2006)
247 require_once(dirname(__FILE__).'/pdf417.php');
248 if (!isset($mode[1]) OR ($mode[1] === '')) {
249 $aspectratio = 2; // default aspect ratio (width / height)
250 } else {
251 $aspectratio = floatval($mode[1]);
252 }
253 if (!isset($mode[2]) OR ($mode[2] === '')) {
254 $ecl = -1; // default error correction level (auto)
255 } else {
256 $ecl = intval($mode[2]);
257 }
258 // set macro block
259 $macro = array();
260 if (isset($mode[3]) AND ($mode[3] !== '') AND isset($mode[4]) AND ($mode[4] !== '') AND isset($mode[5]) AND ($mode[5] !== '')) {
261 $macro['segment_total'] = intval($mode[3]);
262 $macro['segment_index'] = intval($mode[4]);
263 $macro['file_id'] = strtr($mode[5], "\xff", ',');
264 for ($i = 0; $i < 7; ++$i) {
265 $o = $i + 6;
266 if (isset($mode[$o]) AND ($mode[$o] !== '')) {
267 // add option
268 $macro['option_'.$i] = strtr($mode[$o], "\xff", ',');
269 }
270 }
271 }
272 $qrcode = new PDF417($code, $ecl, $aspectratio, $macro);
273 $this->barcode_array = $qrcode->getBarcodeArray();
274 $this->barcode_array['code'] = $code;
275 break;
276 }
277 case 'QRCODE': { // QR-CODE
278 require_once(dirname(__FILE__).'/qrcode.php');
279 if (!isset($mode[1]) OR (!in_array($mode[1],array('L','M','Q','H')))) {
280 $mode[1] = 'L'; // Ddefault: Low error correction
281 }
282 $qrcode = new QRcode($code, strtoupper($mode[1]));
283 $this->barcode_array = $qrcode->getBarcodeArray();
284 $this->barcode_array['code'] = $code;
285 break;
286 }
287 case 'RAW':
288 case 'RAW2': { // RAW MODE
289 // remove spaces
290 $code = preg_replace('/[\s]*/si', '', $code);
291 if (strlen($code) < 3) {
292 break;
293 }
294 if ($qrtype == 'RAW') {
295 // comma-separated rows
296 $rows = explode(',', $code);
297 } else { // RAW2
298 // rows enclosed in square parentheses
299 $code = substr($code, 1, -1);
300 $rows = explode('][', $code);
301 }
302 $this->barcode_array['num_rows'] = count($rows);
303 $this->barcode_array['num_cols'] = strlen($rows[0]);
304 $this->barcode_array['bcode'] = array();
305 foreach ($rows as $r) {
306 $this->barcode_array['bcode'][] = str_split($r, 1);
307 }
308 $this->barcode_array['code'] = $code;
309 break;
310 }
311 case 'TEST': { // TEST MODE
312 $this->barcode_array['num_rows'] = 5;
313 $this->barcode_array['num_cols'] = 15;
314 $this->barcode_array['bcode'] = array(
315 array(1,1,1,0,1,1,1,0,1,1,1,0,1,1,1),
316 array(0,1,0,0,1,0,0,0,1,0,0,0,0,1,0),
317 array(0,1,0,0,1,1,0,0,1,1,1,0,0,1,0),
318 array(0,1,0,0,1,0,0,0,0,0,1,0,0,1,0),
319 array(0,1,0,0,1,1,1,0,1,1,1,0,0,1,0));
320 $this->barcode_array['code'] = $code;
321 break;
322 }
323 default: {
324 $this->barcode_array = false;
325 }
326 }
327 }
328 } // end of class
329
330 //============================================================+
331 // END OF FILE
332 //============================================================+
333