PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/reporting/includes/barcodes.php

https://bitbucket.org/meerdevelopersoffice/bolivia
PHP | 808 lines | 623 code | 23 blank | 162 comment | 68 complexity | 9dbdb5168193dbea9c661c476f452b30 MD5 | raw file
Possible License(s): Apache-2.0, GPL-3.0, LGPL-3.0
  1. <?php
  2. //============================================================+
  3. // File name : barcodes.php
  4. // Begin : 2008-06-09
  5. // Last Update : 2008-07-16
  6. // Version : 1.0.002
  7. // License : GNU LGPL (http://www.gnu.org/copyleft/lesser.html)
  8. // ----------------------------------------------------------------------------
  9. // Copyright (C) 2008 Nicola Asuni - Tecnick.com S.r.l.
  10. //
  11. // This program is free software: you can redistribute it and/or modify
  12. // it under the terms of the GNU Lesser General Public License as published by
  13. // the Free Software Foundation, either version 2.1 of the License, or
  14. // (at your option) any later version.
  15. //
  16. // This program is distributed in the hope that it will be useful,
  17. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. // GNU Lesser General Public License for more details.
  20. //
  21. // You should have received a copy of the GNU Lesser General Public License
  22. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  23. //
  24. // See LICENSE.TXT file for more information.
  25. // ----------------------------------------------------------------------------
  26. //
  27. // Description : PHP class to creates array representations for
  28. // common 1D barcodes to be used with TCPDF.
  29. //
  30. // Author: Nicola Asuni
  31. //
  32. // (c) Copyright:
  33. // Nicola Asuni
  34. // Tecnick.com S.r.l.
  35. // Via della Pace, 11
  36. // 09044 Quartucciu (CA)
  37. // ITALY
  38. // www.tecnick.com
  39. // info@tecnick.com
  40. //============================================================+
  41. /**
  42. * PHP class to creates array representations for common 1D barcodes to be used with TCPDF.
  43. * @package com.tecnick.tcpdf
  44. * @abstract Functions for generating string representation of common 1D barcodes.
  45. * @author Nicola Asuni
  46. * @copyright 2008 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
  47. * @link http://www.tcpdf.org
  48. * @license http://www.gnu.org/copyleft/lesser.html LGPL
  49. * @version 1.0.001
  50. */
  51. /**
  52. * PHP class to creates array representations for common 1D barcodes to be used with TCPDF (http://www.tcpdf.org).<br>
  53. * @name TCPDFBarcode
  54. * @package com.tecnick.tcpdf
  55. * @version 1.0.001
  56. * @author Nicola Asuni
  57. * @link http://www.tcpdf.org
  58. * @license http://www.gnu.org/copyleft/lesser.html LGPL
  59. */
  60. class TCPDFBarcode {
  61. /**
  62. * @var array representation of barcode.
  63. * @access protected
  64. */
  65. var $barcode_array;
  66. /**
  67. * This is the class constructor.
  68. * Return an array representations for common 1D barcodes:<ul>
  69. * <li>$arrcode["code"] code to be printed on text label</li>
  70. * <li>$arrcode["maxh"] max bar height</li>
  71. * <li>$arrcode["maxw"] max bar width</li>
  72. * <li>$arrcode["bcode"][$k] single bar or space in $k position</li>
  73. * <li>$arrcode["bcode"][$k]["t"] bar type: true = bar, false = space.</li>
  74. * <li>$arrcode["bcode"][$k]["w"] bar width in units.</li>
  75. * <li>$arrcode["bcode"][$k]["h"] bar height in units.</li>
  76. * <li>$arrcode["bcode"][$k]["p"] bar top position (0 = top, 1 = middle)</li></ul>
  77. * @param string $code code to print
  78. * @param string $type type of barcode: <ul><li>C39 : CODE 39</li><li>C39+ : CODE 39 with checksum</li><li>C39E : CODE 39 EXTENDED</li><li>C39E+ : CODE 39 EXTENDED with checksum</li><li>I25 : Interleaved 2 of 5</li><li>C128A : CODE 128 A</li><li>C128B : CODE 128 B</li><li>C128C : CODE 128 C</li><li>EAN13 : EAN 13</li><li>UPCA : UPC-A</li><li>POSTNET : POSTNET</li><li>CODABAR : CODABAR</li></ul>
  79. */
  80. function TCPDFBarcode($code, $type) {
  81. $this->setBarcode($code, $type);
  82. }
  83. /**
  84. * Return an array representations of barcode.
  85. * @return array
  86. */
  87. function getBarcodeArray() {
  88. return $this->barcode_array;
  89. }
  90. /**
  91. * Set the barcode.
  92. * @param string $code code to print
  93. * @param string $type type of barcode: <ul><li>C39 : CODE 39</li><li>C39+ : CODE 39 with checksum</li><li>C39E : CODE 39 EXTENDED</li><li>C39E+ : CODE 39 EXTENDED with checksum</li><li>I25 : Interleaved 2 of 5</li><li>C128A : CODE 128 A</li><li>C128B : CODE 128 B</li><li>C128C : CODE 128 C</li><li>EAN13 : EAN 13</li><li>UPCA : UPC-A</li><li>POSTNET : POSTNET</li><li>CODABAR : CODABAR</li></ul>
  94. * @return array
  95. */
  96. function setBarcode($code, $type) {
  97. switch (strtoupper($type)) {
  98. case "C39": { // CODE 39
  99. $arrcode = $this->barcode_code39($code, false, false);
  100. break;
  101. }
  102. case "C39+": { // CODE 39 with checksum
  103. $arrcode = $this->barcode_code39($code, false, true);
  104. break;
  105. }
  106. case "C39E": { // CODE 39 EXTENDED
  107. $arrcode = $this->barcode_code39($code, true, false);
  108. break;
  109. }
  110. case "C39E+": { // CODE 39 EXTENDED with checksum
  111. $arrcode = $this->barcode_code39($code, true, true);
  112. break;
  113. }
  114. case "I25": { // Interleaved 2 of 5
  115. $arrcode = $this->barcode_i25($code);
  116. break;
  117. }
  118. case "C128A": { // CODE 128 A
  119. $arrcode = $this->barcode_c128($code, "A");
  120. break;
  121. }
  122. case "C128B": { // CODE 128 B
  123. $arrcode = $this->barcode_c128($code, "B");
  124. break;
  125. }
  126. case "C128C": { // CODE 128 C
  127. $arrcode = $this->barcode_c128($code, "C");
  128. break;
  129. }
  130. case "EAN13": { // EAN 13
  131. $arrcode = $this->barcode_ean13($code, 13);
  132. break;
  133. }
  134. case "UPCA": { // UPC-A
  135. $arrcode = $this->barcode_ean13($code, 12);
  136. break;
  137. }
  138. case "POSTNET": { // POSTNET
  139. $arrcode = $this->barcode_postnet($code);
  140. break;
  141. }
  142. case "CODABAR": { // CODABAR
  143. $arrcode = $this->barcode_codabar($code);
  144. break;
  145. }
  146. default: {
  147. $this->barcode_array = false;
  148. }
  149. }
  150. $this->barcode_array = $arrcode;
  151. }
  152. /**
  153. * CODE 39
  154. * @param string $code code to represent.
  155. * @param boolean $checksum if true add a checksum to the code
  156. * @return array barcode representation.
  157. * @access protected
  158. */
  159. function barcode_code39($code, $extended=false, $checksum=false) {
  160. $chr['0'] = '111221211';
  161. $chr['1'] = '211211112';
  162. $chr['2'] = '112211112';
  163. $chr['3'] = '212211111';
  164. $chr['4'] = '111221112';
  165. $chr['5'] = '211221111';
  166. $chr['6'] = '112221111';
  167. $chr['7'] = '111211212';
  168. $chr['8'] = '211211211';
  169. $chr['9'] = '112211211';
  170. $chr['A'] = '211112112';
  171. $chr['B'] = '112112112';
  172. $chr['C'] = '212112111';
  173. $chr['D'] = '111122112';
  174. $chr['E'] = '211122111';
  175. $chr['F'] = '112122111';
  176. $chr['G'] = '111112212';
  177. $chr['H'] = '211112211';
  178. $chr['I'] = '112112211';
  179. $chr['J'] = '111122211';
  180. $chr['K'] = '211111122';
  181. $chr['L'] = '112111122';
  182. $chr['M'] = '212111121';
  183. $chr['N'] = '111121122';
  184. $chr['O'] = '211121121';
  185. $chr['P'] = '112121121';
  186. $chr['Q'] = '111111222';
  187. $chr['R'] = '211111221';
  188. $chr['S'] = '112111221';
  189. $chr['T'] = '111121221';
  190. $chr['U'] = '221111112';
  191. $chr['V'] = '122111112';
  192. $chr['W'] = '222111111';
  193. $chr['X'] = '121121112';
  194. $chr['Y'] = '221121111';
  195. $chr['Z'] = '122121111';
  196. $chr['-'] = '121111212';
  197. $chr['.'] = '221111211';
  198. $chr[' '] = '122111211';
  199. $chr['*'] = '121121211';
  200. $chr['$'] = '121212111';
  201. $chr['/'] = '121211121';
  202. $chr['+'] = '121112121';
  203. $chr['%'] = '111212121';
  204. $code = strtoupper($code);
  205. if ($extended) {
  206. // extended mode
  207. $code = $this->encode_code39_ext($code);
  208. }
  209. if ($code === false) {
  210. return false;
  211. }
  212. if ($checksum) {
  213. // checksum
  214. $code .= $this->checksum_code39($code);
  215. }
  216. // add start and stop codes
  217. $code = "*".$code."*";
  218. $bararray = array("code" => $code, "maxw" => 0, "maxh" => 1, "bcode" => array());
  219. $k = 0;
  220. for($i=0; $i < strlen($code); $i++) {
  221. $char = $code{$i};
  222. if(!isset($chr[$char])) {
  223. // invalid character
  224. return false;
  225. }
  226. for($j=0; $j < 9; $j++) {
  227. if (($j % 2) == 0) {
  228. $t = true; // bar
  229. } else {
  230. $t = false; // space
  231. }
  232. $w = $chr[$char]{$j};
  233. $bararray["bcode"][$k] = array("t" => $t, "w" => $w, "h" => 1, "p" => 0);
  234. $bararray["maxw"] += $w;
  235. $k++;
  236. }
  237. $bararray["bcode"][$k] = array("t" => false, "w" => 1, "h" => 1, "p" => 0);
  238. $bararray["maxw"] += 1;
  239. $k++;
  240. }
  241. return $bararray;
  242. }
  243. /**
  244. * Encode a string to be used for CODE 39 Extended mode.
  245. * @param string $code code to represent.
  246. * @return encoded string.
  247. * @access protected
  248. */
  249. function encode_code39_ext($code) {
  250. $encode = array(
  251. chr(0) => '%U', chr(1) => '$A', chr(2) => '$B', chr(3) => '$C',
  252. chr(4) => '$D', chr(5) => '$E', chr(6) => '$F', chr(7) => '$G',
  253. chr(8) => '$H', chr(9) => '$I', chr(10) => '$J', chr(11) => 'ŁK',
  254. chr(12) => '$L', chr(13) => '$M', chr(14) => '$N', chr(15) => '$O',
  255. chr(16) => '$P', chr(17) => '$Q', chr(18) => '$R', chr(19) => '$S',
  256. chr(20) => '$T', chr(21) => '$U', chr(22) => '$V', chr(23) => '$W',
  257. chr(24) => '$X', chr(25) => '$Y', chr(26) => '$Z', chr(27) => '%A',
  258. chr(28) => '%B', chr(29) => '%C', chr(30) => '%D', chr(31) => '%E',
  259. chr(32) => ' ', chr(33) => '/A', chr(34) => '/B', chr(35) => '/C',
  260. chr(36) => '/D', chr(37) => '/E', chr(38) => '/F', chr(39) => '/G',
  261. chr(40) => '/H', chr(41) => '/I', chr(42) => '/J', chr(43) => '/K',
  262. chr(44) => '/L', chr(45) => '-', chr(46) => '.', chr(47) => '/O',
  263. chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3',
  264. chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7',
  265. chr(56) => '8', chr(57) => '9', chr(58) => '/Z', chr(59) => '%F',
  266. chr(60) => '%G', chr(61) => '%H', chr(62) => '%I', chr(63) => '%J',
  267. chr(64) => '%V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C',
  268. chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G',
  269. chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K',
  270. chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O',
  271. chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S',
  272. chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W',
  273. chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => '%K',
  274. chr(92) => '%L', chr(93) => '%M', chr(94) => '%N', chr(95) => '%O',
  275. chr(96) => '%W', chr(97) => '+A', chr(98) => '+B', chr(99) => '+C',
  276. chr(100) => '+D', chr(101) => '+E', chr(102) => '+F', chr(103) => '+G',
  277. chr(104) => '+H', chr(105) => '+I', chr(106) => '+J', chr(107) => '+K',
  278. chr(108) => '+L', chr(109) => '+M', chr(110) => '+N', chr(111) => '+O',
  279. chr(112) => '+P', chr(113) => '+Q', chr(114) => '+R', chr(115) => '+S',
  280. chr(116) => '+T', chr(117) => '+U', chr(118) => '+V', chr(119) => '+W',
  281. chr(120) => '+X', chr(121) => '+Y', chr(122) => '+Z', chr(123) => '%P',
  282. chr(124) => '%Q', chr(125) => '%R', chr(126) => '%S', chr(127) => '%T');
  283. $code_ext = '';
  284. for ($i = 0 ; $i < strlen($code); $i++) {
  285. if (ord($code{$i}) > 127) {
  286. return false;
  287. }
  288. $code_ext .= $encode[$code{$i}];
  289. }
  290. return $code_ext;
  291. }
  292. /**
  293. * Calculate CODE 39 checksum (modulo 43).
  294. * @param string $code code to represent.
  295. * @return char checksum.
  296. * @access protected
  297. */
  298. function checksum_code39($code) {
  299. $chars = array(
  300. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  301. 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
  302. 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
  303. 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%');
  304. $sum = 0;
  305. for ($i=0 ; $i < strlen($code); $i++) {
  306. $k = array_keys($chars, $code{$i});
  307. $sum += $k[0];
  308. }
  309. $j = ($sum % 43);
  310. return $chars[$j];
  311. }
  312. /**
  313. * Interleaved 2 of 5 barcodes.
  314. * Contains digits (0 to 9) and encodes the data in the width of both bars and spaces.
  315. * @param string $code code to represent.
  316. * @param boolean $checksum if true add a checksum to the code
  317. * @return array barcode representation.
  318. * @access protected
  319. */
  320. function barcode_i25($code) {
  321. $chr['0'] = '11221';
  322. $chr['1'] = '21112';
  323. $chr['2'] = '12112';
  324. $chr['3'] = '22111';
  325. $chr['4'] = '11212';
  326. $chr['5'] = '21211';
  327. $chr['6'] = '12211';
  328. $chr['7'] = '11122';
  329. $chr['8'] = '21121';
  330. $chr['9'] = '12121';
  331. $chr['A'] = '11';
  332. $chr['Z'] = '21';
  333. if((strlen($code) % 2) != 0) {
  334. // add leading zero if code-length is odd
  335. $code = '0'.$code;
  336. }
  337. // add start and stop codes
  338. $code = 'AA'.strtolower($code).'ZA';
  339. $bararray = array("code" => $code, "maxw" => 0, "maxh" => 1, "bcode" => array());
  340. $k = 0;
  341. for($i=0; $i < strlen($code); $i=$i+2) {
  342. $char_bar = $code{$i};
  343. $char_space = $code{$i+1};
  344. if((!isset($chr[$char_bar])) OR (!isset($chr[$char_space]))) {
  345. // invalid character
  346. return false;
  347. }
  348. // create a bar-space sequence
  349. $seq = "";
  350. for($s=0; $s < strlen($chr[$char_bar]); $s++){
  351. $seq .= $chr[$char_bar]{$s} . $chr[$char_space]{$s};
  352. }
  353. for($j=0; $j < strlen($seq); $j++) {
  354. if (($j % 2) == 0) {
  355. $t = true; // bar
  356. } else {
  357. $t = false; // space
  358. }
  359. $w = $seq{$j};
  360. $bararray["bcode"][$k] = array("t" => $t, "w" => $w, "h" => 1, "p" => 0);
  361. $bararray["maxw"] += $w;
  362. $k++;
  363. }
  364. }
  365. return $bararray;
  366. }
  367. /**
  368. * C128 barcodes.
  369. *
  370. * @param string $code code to represent.
  371. * @param string $type barcode type: A, B or C
  372. * @return array barcode representation.
  373. * @access protected
  374. */
  375. function barcode_c128($code, $type="B") {
  376. $chr = array(
  377. '212222', /* 00 */
  378. '222122', /* 01 */
  379. '222221', /* 02 */
  380. '121223', /* 03 */
  381. '121322', /* 04 */
  382. '131222', /* 05 */
  383. '122213', /* 06 */
  384. '122312', /* 07 */
  385. '132212', /* 08 */
  386. '221213', /* 09 */
  387. '221312', /* 10 */
  388. '231212', /* 11 */
  389. '112232', /* 12 */
  390. '122132', /* 13 */
  391. '122231', /* 14 */
  392. '113222', /* 15 */
  393. '123122', /* 16 */
  394. '123221', /* 17 */
  395. '223211', /* 18 */
  396. '221132', /* 19 */
  397. '221231', /* 20 */
  398. '213212', /* 21 */
  399. '223112', /* 22 */
  400. '312131', /* 23 */
  401. '311222', /* 24 */
  402. '321122', /* 25 */
  403. '321221', /* 26 */
  404. '312212', /* 27 */
  405. '322112', /* 28 */
  406. '322211', /* 29 */
  407. '212123', /* 30 */
  408. '212321', /* 31 */
  409. '232121', /* 32 */
  410. '111323', /* 33 */
  411. '131123', /* 34 */
  412. '131321', /* 35 */
  413. '112313', /* 36 */
  414. '132113', /* 37 */
  415. '132311', /* 38 */
  416. '211313', /* 39 */
  417. '231113', /* 40 */
  418. '231311', /* 41 */
  419. '112133', /* 42 */
  420. '112331', /* 43 */
  421. '132131', /* 44 */
  422. '113123', /* 45 */
  423. '113321', /* 46 */
  424. '133121', /* 47 */
  425. '313121', /* 48 */
  426. '211331', /* 49 */
  427. '231131', /* 50 */
  428. '213113', /* 51 */
  429. '213311', /* 52 */
  430. '213131', /* 53 */
  431. '311123', /* 54 */
  432. '311321', /* 55 */
  433. '331121', /* 56 */
  434. '312113', /* 57 */
  435. '312311', /* 58 */
  436. '332111', /* 59 */
  437. '314111', /* 60 */
  438. '221411', /* 61 */
  439. '431111', /* 62 */
  440. '111224', /* 63 */
  441. '111422', /* 64 */
  442. '121124', /* 65 */
  443. '121421', /* 66 */
  444. '141122', /* 67 */
  445. '141221', /* 68 */
  446. '112214', /* 69 */
  447. '112412', /* 70 */
  448. '122114', /* 71 */
  449. '122411', /* 72 */
  450. '142112', /* 73 */
  451. '142211', /* 74 */
  452. '241211', /* 75 */
  453. '221114', /* 76 */
  454. '413111', /* 77 */
  455. '241112', /* 78 */
  456. '134111', /* 79 */
  457. '111242', /* 80 */
  458. '121142', /* 81 */
  459. '121241', /* 82 */
  460. '114212', /* 83 */
  461. '124112', /* 84 */
  462. '124211', /* 85 */
  463. '411212', /* 86 */
  464. '421112', /* 87 */
  465. '421211', /* 88 */
  466. '212141', /* 89 */
  467. '214121', /* 90 */
  468. '412121', /* 91 */
  469. '111143', /* 92 */
  470. '111341', /* 93 */
  471. '131141', /* 94 */
  472. '114113', /* 95 */
  473. '114311', /* 96 */
  474. '411113', /* 97 */
  475. '411311', /* 98 */
  476. '113141', /* 99 */
  477. '114131', /* 100 */
  478. '311141', /* 101 */
  479. '411131', /* 102 */
  480. '211412', /* 103 START A */
  481. '211214', /* 104 START B */
  482. '211232', /* 105 START C */
  483. '233111', /* STOP */
  484. '200000' /* END */
  485. );
  486. $keys = "";
  487. switch(strtoupper($type)) {
  488. case "A": {
  489. $startid = 103;
  490. $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_';
  491. for($i = 0; $i < 32; $i++) {
  492. $keys .= chr($i);
  493. }
  494. break;
  495. }
  496. case "B": {
  497. $startid = 104;
  498. $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'.chr(127);
  499. break;
  500. }
  501. case "C": {
  502. $startid = 105;
  503. $keys = "";
  504. if ((strlen($code) % 2) != 0) {
  505. //echo "The length of barcode value must be even ($code). You must pad the number with zeros.\n";
  506. return false;
  507. }
  508. for($i = 0; $i <= 99; $i++) {
  509. $keys .= chr($i);
  510. }
  511. $new_code = "";
  512. for ($i=0; $i < (strlen($code) / 2); $i++) {
  513. $new_code .= chr(intval($code{(2 * $i)}.$code{(2 * $i + 1)}));
  514. }
  515. $code = $new_code;
  516. break;
  517. }
  518. default: {
  519. return false;
  520. }
  521. }
  522. // calculate check character
  523. $sum = $startid;
  524. for ($i=0; $i < strlen($code); $i++) {
  525. $sum += (strpos($keys, $code{$i}) * ($i+1));
  526. }
  527. $check = ($sum % 103);
  528. // add start, check and stop codes
  529. $code = chr($startid).$code.chr($check).chr(106).chr(107);
  530. $bararray = array("code" => $code, "maxw" => 0, "maxh" => 1, "bcode" => array());
  531. $k = 0;
  532. $len = strlen($code);
  533. for($i=0; $i < $len; $i++) {
  534. $ck = strpos($keys, $code{$i});
  535. if (($i == 0) OR ($i > ($len-4))) {
  536. $seq = $chr[ord($code{$i})];
  537. } elseif(($ck >= 0) AND isset($chr[$ck])) {
  538. $seq = $chr[$ck];
  539. } else {
  540. // invalid character
  541. return false;
  542. }
  543. for($j=0; $j < 6; $j++) {
  544. if (($j % 2) == 0) {
  545. $t = true; // bar
  546. } else {
  547. $t = false; // space
  548. }
  549. $w = $seq{$j};
  550. $bararray["bcode"][$k] = array("t" => $t, "w" => $w, "h" => 1, "p" => 0);
  551. $bararray["maxw"] += $w;
  552. $k++;
  553. }
  554. }
  555. return $bararray;
  556. }
  557. /**
  558. * EAN13 and UPC-A barcodes.
  559. * @param string $code code to represent.
  560. * @param string $len barcode type: 13 = EAN13, 12 = UPC-A
  561. * @return array barcode representation.
  562. * @access protected
  563. */
  564. function barcode_ean13($code, $len=13) {
  565. //Padding
  566. $code = str_pad($code, $len-1, '0', STR_PAD_LEFT);
  567. if($len == 12) {
  568. $code = '0'.$code;
  569. }
  570. // add check digit
  571. if(strlen($code) == 12) {
  572. $sum=0;
  573. for($i=1;$i<=11;$i+=2) {
  574. $sum += (3 * $code{$i});
  575. }
  576. for($i=0; $i <= 10; $i+=2) {
  577. $sum += ($code{$i});
  578. }
  579. $r = $sum % 10;
  580. if($r > 0) {
  581. $r = (10 - $r);
  582. }
  583. $code .= $r;
  584. } else { // test checkdigit
  585. $sum = 0;
  586. for($i=1; $i <= 11; $i+=2) {
  587. $sum += (3 * $code{$i});
  588. }
  589. for($i=0; $i <= 10; $i+=2) {
  590. $sum += $code{$i};
  591. }
  592. if ((($sum + $code{12}) % 10) != 0) {
  593. return false;
  594. }
  595. }
  596. //Convert digits to bars
  597. $codes = array(
  598. 'A'=>array(
  599. '0'=>'0001101',
  600. '1'=>'0011001',
  601. '2'=>'0010011',
  602. '3'=>'0111101',
  603. '4'=>'0100011',
  604. '5'=>'0110001',
  605. '6'=>'0101111',
  606. '7'=>'0111011',
  607. '8'=>'0110111',
  608. '9'=>'0001011'),
  609. 'B'=>array(
  610. '0'=>'0100111',
  611. '1'=>'0110011',
  612. '2'=>'0011011',
  613. '3'=>'0100001',
  614. '4'=>'0011101',
  615. '5'=>'0111001',
  616. '6'=>'0000101',
  617. '7'=>'0010001',
  618. '8'=>'0001001',
  619. '9'=>'0010111'),
  620. 'C'=>array(
  621. '0'=>'1110010',
  622. '1'=>'1100110',
  623. '2'=>'1101100',
  624. '3'=>'1000010',
  625. '4'=>'1011100',
  626. '5'=>'1001110',
  627. '6'=>'1010000',
  628. '7'=>'1000100',
  629. '8'=>'1001000',
  630. '9'=>'1110100')
  631. );
  632. $parities = array(
  633. '0'=>array('A','A','A','A','A','A'),
  634. '1'=>array('A','A','B','A','B','B'),
  635. '2'=>array('A','A','B','B','A','B'),
  636. '3'=>array('A','A','B','B','B','A'),
  637. '4'=>array('A','B','A','A','B','B'),
  638. '5'=>array('A','B','B','A','A','B'),
  639. '6'=>array('A','B','B','B','A','A'),
  640. '7'=>array('A','B','A','B','A','B'),
  641. '8'=>array('A','B','A','B','B','A'),
  642. '9'=>array('A','B','B','A','B','A')
  643. );
  644. $bararray = array("code" => $code, "maxw" => 0, "maxh" => 1, "bcode" => array());
  645. $k = 0;
  646. $seq = '101';
  647. $p = $parities[$code{0}];
  648. for($i=1; $i < 7; $i++) {
  649. $seq .= $codes[$p[$i-1]][$code{$i}];
  650. }
  651. $seq .= '01010';
  652. for($i=7; $i < 13; $i++) {
  653. $seq .= $codes['C'][$code{$i}];
  654. }
  655. $seq .= '101';
  656. $len = strlen($seq);
  657. $w = 0;
  658. for($i=0; $i < $len; $i++) {
  659. $w += 1;
  660. if (($i == ($len - 1)) OR (($i < ($len - 1)) AND ($seq{$i} != $seq{($i+1)}))) {
  661. if ($seq{$i} == '1') {
  662. $t = true; // bar
  663. } else {
  664. $t = false; // space
  665. }
  666. $bararray["bcode"][$k] = array("t" => $t, "w" => $w, "h" => 1, "p" => 0);
  667. $bararray["maxw"] += $w;
  668. $k++;
  669. $w = 0;
  670. }
  671. }
  672. return $bararray;
  673. }
  674. /**
  675. * POSTNET barcodes.
  676. * @param string $code zip code to represent. Must be a string containing a zip code of the form DDDDD or DDDDD-DDDD.
  677. * @return array barcode representation.
  678. * @access protected
  679. */
  680. function barcode_postnet($code) {
  681. // bar lenght
  682. $barlen = Array(
  683. 0 => Array(2,2,1,1,1),
  684. 1 => Array(1,1,1,2,2),
  685. 2 => Array(1,1,2,1,2),
  686. 3 => Array(1,1,2,2,1),
  687. 4 => Array(1,2,1,1,2),
  688. 5 => Array(1,2,1,2,1),
  689. 6 => Array(1,2,2,1,1),
  690. 7 => Array(2,1,1,1,2),
  691. 8 => Array(2,1,1,2,1),
  692. 9 => Array(2,1,2,1,1)
  693. );
  694. $bararray = array("code" => $code, "maxw" => 0, "maxh" => 2, "bcode" => array());
  695. $k = 0;
  696. $code = str_replace("-", "", $code);
  697. $code = str_replace(" ", "", $code);
  698. $len = strlen($code);
  699. // calculate checksum
  700. $sum = 0;
  701. for($i=0; $i < $len; $i++) {
  702. $sum += intval($code{$i});
  703. }
  704. if(($sum % 10) == 0) {
  705. return false;
  706. }
  707. $code .= "".(10 - ($sum % 10))."";
  708. $len = strlen($code);
  709. // start bar
  710. $bararray["bcode"][$k++] = array("t" => 1, "w" => 1, "h" => 2, "p" => 0);
  711. $bararray["bcode"][$k++] = array("t" => 0, "w" => 1, "h" => 2, "p" => 0);
  712. $bararray["maxw"] += 2;
  713. for ($i=0; $i < $len; $i++) {
  714. for ($j=0; $j < 5; $j++) {
  715. $h = $barlen[$code{$i}][$j];
  716. $p = floor(1 / $h);
  717. $bararray["bcode"][$k++] = array("t" => 1, "w" => 1, "h" => $h, "p" => $p);
  718. $bararray["bcode"][$k++] = array("t" => 0, "w" => 1, "h" => 2, "p" => 0);
  719. $bararray["maxw"] += 2;
  720. }
  721. }
  722. // end bar
  723. $bararray["bcode"][$k++] = array("t" => 1, "w" => 1, "h" => 2, "p" => 0);
  724. $bararray["maxw"] += 1;
  725. return $bararray;
  726. }
  727. /**
  728. * CODABAR barcodes.
  729. * @param string $code code to represent.
  730. * @return array barcode representation.
  731. * @access protected
  732. */
  733. function barcode_codabar($code) {
  734. $chr = array(
  735. '0' => '11111221',
  736. '1' => '11112211',
  737. '2' => '11121121',
  738. '3' => '22111111',
  739. '4' => '11211211',
  740. '5' => '21111211',
  741. '6' => '12111121',
  742. '7' => '12112111',
  743. '8' => '12211111',
  744. '9' => '21121111',
  745. '-' => '11122111',
  746. '$' => '11221111',
  747. ':' => '21112121',
  748. '/' => '21211121',
  749. '.' => '21212111',
  750. '+' => '11222221',
  751. 'A' => '11221211',
  752. 'B' => '12121121',
  753. 'C' => '11121221',
  754. 'D' => '11122211'
  755. );
  756. $bararray = array("code" => $code, "maxw" => 0, "maxh" => 1, "bcode" => array());
  757. $k = 0;
  758. $w = 0;
  759. $seq = "";
  760. $code = "A".strtoupper($code)."A";
  761. $len = strlen($code);
  762. for($i=0; $i < $len; $i++) {
  763. if (!isset($chr[$code{$i}])) {
  764. return false;
  765. }
  766. $seq = $chr[$code{$i}];
  767. for($j=0; $j < 8; $j++) {
  768. if (($j % 2) == 0) {
  769. $t = true; // bar
  770. } else {
  771. $t = false; // space
  772. }
  773. $w = $seq{$j};
  774. $bararray["bcode"][$k] = array("t" => $t, "w" => $w, "h" => 1, "p" => 0);
  775. $bararray["maxw"] += $w;
  776. $k++;
  777. }
  778. }
  779. return $bararray;
  780. }
  781. } // end of class
  782. //============================================================+
  783. // END OF FILE
  784. //============================================================+
  785. ?>