|
<?php |
|
//============================================================+ |
|
// File name : barcodes.php |
|
// Version : 1.0.012 |
|
// Begin : 2008-06-09 |
|
// Last Update : 2010-12-16 |
|
// Author : Nicola Asuni - Tecnick.com S.r.l - Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com |
|
// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) |
|
// ------------------------------------------------------------------- |
|
// Copyright (C) 2008-2010 Nicola Asuni - Tecnick.com S.r.l. |
|
// |
|
// This file is part of TCPDF software library. |
|
// |
|
// TCPDF is free software: you can redistribute it and/or modify it |
|
// under the terms of the GNU Lesser General Public License as |
|
// published by the Free Software Foundation, either version 3 of the |
|
// License, or (at your option) any later version. |
|
// |
|
// TCPDF is distributed in the hope that it will be useful, but |
|
// WITHOUT ANY WARRANTY; without even the implied warranty of |
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|
// See the GNU Lesser General Public License for more details. |
|
// |
|
// You should have received a copy of the GNU Lesser General Public License |
|
// along with TCPDF. If not, see <http://www.gnu.org/licenses/>. |
|
// |
|
// See LICENSE.TXT file for more information. |
|
// ------------------------------------------------------------------- |
|
// |
|
// Description : PHP class to creates array representations for |
|
// common 1D barcodes to be used with TCPDF. |
|
// |
|
//============================================================+ |
|
|
|
/** |
|
* @file |
|
* PHP class to creates array representations for common 1D barcodes to be used with TCPDF. |
|
* @package com.tecnick.tcpdf |
|
* @author Nicola Asuni |
|
* @version 1.0.012 |
|
*/ |
|
|
|
/** |
|
* @class TCPDFBarcode |
|
* PHP class to creates array representations for common 1D barcodes to be used with TCPDF (http://www.tcpdf.org).<br> |
|
* @package com.tecnick.tcpdf |
|
* @version 1.0.012 |
|
* @author Nicola Asuni |
|
*/ |
|
class TCPDFBarcode { |
|
|
|
/** |
|
* Array representation of barcode. |
|
* @protected |
|
*/ |
|
protected $barcode_array; |
|
|
|
/** |
|
* This is the class constructor. |
|
* Return an array representations for common 1D barcodes:<ul> |
|
* <li>$arrcode['code'] code to be printed on text label</li> |
|
* <li>$arrcode['maxh'] max bar height</li> |
|
* <li>$arrcode['maxw'] max bar width</li> |
|
* <li>$arrcode['bcode'][$k] single bar or space in $k position</li> |
|
* <li>$arrcode['bcode'][$k]['t'] bar type: true = bar, false = space.</li> |
|
* <li>$arrcode['bcode'][$k]['w'] bar width in units.</li> |
|
* <li>$arrcode['bcode'][$k]['h'] bar height in units.</li> |
|
* <li>$arrcode['bcode'][$k]['p'] bar top position (0 = top, 1 = middle)</li></ul> |
|
* @param $code (string) code to print |
|
* @param $type (string) type of barcode: <ul><li>C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.</li><li>C39+ : CODE 39 with checksum</li><li>C39E : CODE 39 EXTENDED</li><li>C39E+ : CODE 39 EXTENDED + CHECKSUM</li><li>C93 : CODE 93 - USS-93</li><li>S25 : Standard 2 of 5</li><li>S25+ : Standard 2 of 5 + CHECKSUM</li><li>I25 : Interleaved 2 of 5</li><li>I25+ : Interleaved 2 of 5 + CHECKSUM</li><li>C128A : CODE 128 A</li><li>C128B : CODE 128 B</li><li>C128C : CODE 128 C</li><li>EAN2 : 2-Digits UPC-Based Extention</li><li>EAN5 : 5-Digits UPC-Based Extention</li><li>EAN8 : EAN 8</li><li>EAN13 : EAN 13</li><li>UPCA : UPC-A</li><li>UPCE : UPC-E</li><li>MSI : MSI (Variation of Plessey code)</li><li>MSI+ : MSI + CHECKSUM (modulo 11)</li><li>POSTNET : POSTNET</li><li>PLANET : PLANET</li><li>RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)</li><li>KIX : KIX (Klant index - Customer index)</li><li>IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200</li><li>CODABAR : CODABAR</li><li>CODE11 : CODE 11</li><li>PHARMA : PHARMACODE</li><li>PHARMA2T : PHARMACODE TWO-TRACKS</li></ul> |
|
*/ |
|
public function __construct($code, $type) { |
|
$this->setBarcode($code, $type); |
|
} |
|
|
|
/** |
|
* Return an array representations of barcode. |
|
* @return array |
|
*/ |
|
public function getBarcodeArray() { |
|
return $this->barcode_array; |
|
} |
|
|
|
/** |
|
* Set the barcode. |
|
* @param $code (string) code to print |
|
* @param $type (string) type of barcode: <ul><li>C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.</li><li>C39+ : CODE 39 with checksum</li><li>C39E : CODE 39 EXTENDED</li><li>C39E+ : CODE 39 EXTENDED + CHECKSUM</li><li>C93 : CODE 93 - USS-93</li><li>S25 : Standard 2 of 5</li><li>S25+ : Standard 2 of 5 + CHECKSUM</li><li>I25 : Interleaved 2 of 5</li><li>I25+ : Interleaved 2 of 5 + CHECKSUM</li><li>C128A : CODE 128 A</li><li>C128B : CODE 128 B</li><li>C128C : CODE 128 C</li><li>EAN2 : 2-Digits UPC-Based Extention</li><li>EAN5 : 5-Digits UPC-Based Extention</li><li>EAN8 : EAN 8</li><li>EAN13 : EAN 13</li><li>UPCA : UPC-A</li><li>UPCE : UPC-E</li><li>MSI : MSI (Variation of Plessey code)</li><li>MSI+ : MSI + CHECKSUM (modulo 11)</li><li>POSTNET : POSTNET</li><li>PLANET : PLANET</li><li>RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)</li><li>KIX : KIX (Klant index - Customer index)</li><li>IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200</li><li>CODABAR : CODABAR</li><li>CODE11 : CODE 11</li><li>PHARMA : PHARMACODE</li><li>PHARMA2T : PHARMACODE TWO-TRACKS</li></ul> |
|
* @return array |
|
*/ |
|
public function setBarcode($code, $type) { |
|
switch (strtoupper($type)) { |
|
case 'C39': { // CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9. |
|
$arrcode = $this->barcode_code39($code, false, false); |
|
break; |
|
} |
|
case 'C39+': { // CODE 39 with checksum |
|
$arrcode = $this->barcode_code39($code, false, true); |
|
break; |
|
} |
|
case 'C39E': { // CODE 39 EXTENDED |
|
$arrcode = $this->barcode_code39($code, true, false); |
|
break; |
|
} |
|
case 'C39E+': { // CODE 39 EXTENDED + CHECKSUM |
|
$arrcode = $this->barcode_code39($code, true, true); |
|
break; |
|
} |
|
case 'C93': { // CODE 93 - USS-93 |
|
$arrcode = $this->barcode_code93($code); |
|
break; |
|
} |
|
case 'S25': { // Standard 2 of 5 |
|
$arrcode = $this->barcode_s25($code, false); |
|
break; |
|
} |
|
case 'S25+': { // Standard 2 of 5 + CHECKSUM |
|
$arrcode = $this->barcode_s25($code, true); |
|
break; |
|
} |
|
case 'I25': { // Interleaved 2 of 5 |
|
$arrcode = $this->barcode_i25($code, false); |
|
break; |
|
} |
|
case 'I25+': { // Interleaved 2 of 5 + CHECKSUM |
|
$arrcode = $this->barcode_i25($code, true); |
|
break; |
|
} |
|
case 'C128A': { // CODE 128 A |
|
$arrcode = $this->barcode_c128($code, 'A'); |
|
break; |
|
} |
|
case 'C128B': { // CODE 128 B |
|
$arrcode = $this->barcode_c128($code, 'B'); |
|
break; |
|
} |
|
case 'C128C': { // CODE 128 C |
|
$arrcode = $this->barcode_c128($code, 'C'); |
|
break; |
|
} |
|
case 'EAN2': { // 2-Digits UPC-Based Extention |
|
$arrcode = $this->barcode_eanext($code, 2); |
|
break; |
|
} |
|
case 'EAN5': { // 5-Digits UPC-Based Extention |
|
$arrcode = $this->barcode_eanext($code, 5); |
|
break; |
|
} |
|
case 'EAN8': { // EAN 8 |
|
$arrcode = $this->barcode_eanupc($code, 8); |
|
break; |
|
} |
|
case 'EAN13': { // EAN 13 |
|
$arrcode = $this->barcode_eanupc($code, 13); |
|
break; |
|
} |
|
case 'UPCA': { // UPC-A |
|
$arrcode = $this->barcode_eanupc($code, 12); |
|
break; |
|
} |
|
case 'UPCE': { // UPC-E |
|
$arrcode = $this->barcode_eanupc($code, 6); |
|
break; |
|
} |
|
case 'MSI': { // MSI (Variation of Plessey code) |
|
$arrcode = $this->barcode_msi($code, false); |
|
break; |
|
} |
|
case 'MSI+': { // MSI + CHECKSUM (modulo 11) |
|
$arrcode = $this->barcode_msi($code, true); |
|
break; |
|
} |
|
case 'POSTNET': { // POSTNET |
|
$arrcode = $this->barcode_postnet($code, false); |
|
break; |
|
} |
|
case 'PLANET': { // PLANET |
|
$arrcode = $this->barcode_postnet($code, true); |
|
break; |
|
} |
|
case 'RMS4CC': { // RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) |
|
$arrcode = $this->barcode_rms4cc($code, false); |
|
break; |
|
} |
|
case 'KIX': { // KIX (Klant index - Customer index) |
|
$arrcode = $this->barcode_rms4cc($code, true); |
|
break; |
|
} |
|
case 'IMB': { // IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200 |
|
$arrcode = $this->barcode_imb($code); |
|
break; |
|
} |
|
case 'CODABAR': { // CODABAR |
|
$arrcode = $this->barcode_codabar($code); |
|
break; |
|
} |
|
case 'CODE11': { // CODE 11 |
|
$arrcode = $this->barcode_code11($code); |
|
break; |
|
} |
|
case 'PHARMA': { // PHARMACODE |
|
$arrcode = $this->barcode_pharmacode($code); |
|
break; |
|
} |
|
case 'PHARMA2T': { // PHARMACODE TWO-TRACKS |
|
$arrcode = $this->barcode_pharmacode2t($code); |
|
break; |
|
} |
|
default: { |
|
$this->barcode_array = false; |
|
$arrcode = false; |
|
break; |
|
} |
|
} |
|
$this->barcode_array = $arrcode; |
|
} |
|
|
|
/** |
|
* CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9. |
|
* General-purpose code in very wide use world-wide |
|
* @param $code (string) code to represent. |
|
* @param $extended (boolean) if true uses the extended mode. |
|
* @param $checksum (boolean) if true add a checksum to the code. |
|
* @return array barcode representation. |
|
* @protected |
|
*/ |
|
protected function barcode_code39($code, $extended=false, $checksum=false) { |
|
$chr['0'] = '111221211'; |
|
$chr['1'] = '211211112'; |
|
$chr['2'] = '112211112'; |
|
$chr['3'] = '212211111'; |
|
$chr['4'] = '111221112'; |
|
$chr['5'] = '211221111'; |
|
$chr['6'] = '112221111'; |
|
$chr['7'] = '111211212'; |
|
$chr['8'] = '211211211'; |
|
$chr['9'] = '112211211'; |
|
$chr['A'] = '211112112'; |
|
$chr['B'] = '112112112'; |
|
$chr['C'] = '212112111'; |
|
$chr['D'] = '111122112'; |
|
$chr['E'] = '211122111'; |
|
$chr['F'] = '112122111'; |
|
$chr['G'] = '111112212'; |
|
$chr['H'] = '211112211'; |
|
$chr['I'] = '112112211'; |
|
$chr['J'] = '111122211'; |
|
$chr['K'] = '211111122'; |
|
$chr['L'] = '112111122'; |
|
$chr['M'] = '212111121'; |
|
$chr['N'] = '111121122'; |
|
$chr['O'] = '211121121'; |
|
$chr['P'] = '112121121'; |
|
$chr['Q'] = '111111222'; |
|
$chr['R'] = '211111221'; |
|
$chr['S'] = '112111221'; |
|
$chr['T'] = '111121221'; |
|
$chr['U'] = '221111112'; |
|
$chr['V'] = '122111112'; |
|
$chr['W'] = '222111111'; |
|
$chr['X'] = '121121112'; |
|
$chr['Y'] = '221121111'; |
|
$chr['Z'] = '122121111'; |
|
$chr['-'] = '121111212'; |
|
$chr['.'] = '221111211'; |
|
$chr[' '] = '122111211'; |
|
$chr['$'] = '121212111'; |
|
$chr['/'] = '121211121'; |
|
$chr['+'] = '121112121'; |
|
$chr['%'] = '111212121'; |
|
$chr['*'] = '121121211'; |
|
|
|
$code = strtoupper($code); |
|
if ($extended) { |
|
// extended mode |
|
$code = $this->encode_code39_ext($code); |
|
} |
|
if ($code === false) { |
|
return false; |
|
} |
|
if ($checksum) { |
|
// checksum |
|
$code .= $this->checksum_code39($code); |
|
} |
|
// add start and stop codes |
|
$code = '*'.$code.'*'; |
|
|
|
$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); |
|
$k = 0; |
|
$clen = strlen($code); |
|
for ($i = 0; $i < $clen; ++$i) { |
|
$char = $code{$i}; |
|
if(!isset($chr[$char])) { |
|
// invalid character |
|
return false; |
|
} |
|
for ($j = 0; $j < 9; ++$j) { |
|
if (($j % 2) == 0) { |
|
$t = true; // bar |
|
} else { |
|
$t = false; // space |
|
} |
|
$w = $chr[$char]{$j}; |
|
$bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); |
|
$bararray['maxw'] += $w; |
|
++$k; |
|
} |
|
$bararray['bcode'][$k] = array('t' => false, 'w' => 1, 'h' => 1, 'p' => 0); |
|
$bararray['maxw'] += 1; |
|
++$k; |
|
} |
|
return $bararray; |
|
} |
|
|
|
/** |
|
* Encode a string to be used for CODE 39 Extended mode. |
|
* @param $code (string) code to represent. |
|
* @return encoded string. |
|
* @protected |
|
*/ |
|
protected function encode_code39_ext($code) { |
|
$encode = array( |
|
chr(0) => '%U', chr(1) => '$A', chr(2) => '$B', chr(3) => '$C', |
|
chr(4) => '$D', chr(5) => '$E', chr(6) => '$F', chr(7) => '$G', |
|
chr(8) => '$H', chr(9) => '$I', chr(10) => '$J', chr(11) => '£K', |
|
chr(12) => '$L', chr(13) => '$M', chr(14) => '$N', chr(15) => '$O', |
|
chr(16) => '$P', chr(17) => '$Q', chr(18) => '$R', chr(19) => '$S', |
|
chr(20) => '$T', chr(21) => '$U', chr(22) => '$V', chr(23) => '$W', |
|
chr(24) => '$X', chr(25) => '$Y', chr(26) => '$Z', chr(27) => '%A', |
|
chr(28) => '%B', chr(29) => '%C', chr(30) => '%D', chr(31) => '%E', |
|
chr(32) => ' ', chr(33) => '/A', chr(34) => '/B', chr(35) => '/C', |
|
chr(36) => '/D', chr(37) => '/E', chr(38) => '/F', chr(39) => '/G', |
|
chr(40) => '/H', chr(41) => '/I', chr(42) => '/J', chr(43) => '/K', |
|
chr(44) => '/L', chr(45) => '-', chr(46) => '.', chr(47) => '/O', |
|
chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3', |
|
chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7', |
|
chr(56) => '8', chr(57) => '9', chr(58) => '/Z', chr(59) => '%F', |
|
chr(60) => '%G', chr(61) => '%H', chr(62) => '%I', chr(63) => '%J', |
|
chr(64) => '%V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C', |
|
chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G', |
|
chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K', |
|
chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O', |
|
chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S', |
|
chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W', |
|
chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => '%K', |
|
chr(92) => '%L', chr(93) => '%M', chr(94) => '%N', chr(95) => '%O', |
|
chr(96) => '%W', chr(97) => '+A', chr(98) => '+B', chr(99) => '+C', |
|
chr(100) => '+D', chr(101) => '+E', chr(102) => '+F', chr(103) => '+G', |
|
chr(104) => '+H', chr(105) => '+I', chr(106) => '+J', chr(107) =& |