Rearrange php libs/includes and produce sitemap.xml
[busui.git] / lib / tcpdf / barcodes.php
blob:a/lib/tcpdf/barcodes.php -> blob:b/lib/tcpdf/barcodes.php
--- a/lib/tcpdf/barcodes.php
+++ b/lib/tcpdf/barcodes.php
@@ -1,1 +1,1966 @@
-
+<?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) => '+K',
+			chr(108) => '+L', chr(109) => '+M', chr(110) => '+N', chr(111) => '+O',
+			chr(112) => '+P', chr(113) => '+Q', chr(114) => '+R', chr(115) => '+S',
+			chr(116) => '+T', chr(117) => '+U', chr(118) => '+V', chr(119) => '+W',
+			chr(120) => '+X', chr(121) => '+Y', chr(122) => '+Z', chr(123) => '%P',
+			chr(124) => '%Q', chr(125) => '%R', chr(126) => '%S', chr(127) => '%T');
+		$code_ext = '';
+		$clen = strlen($code);
+		for ($i = 0 ; $i < $clen; ++$i) {
+			if (ord($code{$i}) > 127) {
+				return false;
+			}
+			$code_ext .= $encode[$code{$i}];
+		}
+		return $code_ext;
+	}
+
+	/**
+	 * Calculate CODE 39 checksum (modulo 43).
+	 * @param $code (string) code to represent.
+	 * @return char checksum.
+	 * @protected
+	 */
+	protected function checksum_code39($code) {
+		$chars = array(
+			'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+			'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
+			'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
+			'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%');
+		$sum = 0;
+		$clen = strlen($code);
+		for ($i = 0 ; $i < $clen; ++$i) {
+			$k = array_keys($chars, $code{$i});
+			$sum += $k[0];
+		}
+		$j = ($sum % 43);
+		return $chars[$j];
+	}
+
+	/**
+	 * CODE 93 - USS-93
+	 * Compact code similar to Code 39
+	 * @param $code (string) code to represent.
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_code93($code) {
+		$chr['0'] = '131112';
+		$chr['1'] = '111213';
+		$chr['2'] = '111312';
+		$chr['3'] = '111411';
+		$chr['4'] = '121113';
+		$chr['5'] = '121212';
+		$chr['6'] = '121311';
+		$chr['7'] = '111114';
+		$chr['8'] = '131211';
+		$chr['9'] = '141111';
+		$chr['A'] = '211113';
+		$chr['B'] = '211212';
+		$chr['C'] = '211311';
+		$chr['D'] = '221112';
+		$chr['E'] = '221211';
+		$chr['F'] = '231111';
+		$chr['G'] = '112113';
+		$chr['H'] = '112212';
+		$chr['I'] = '112311';
+		$chr['J'] = '122112';
+		$chr['K'] = '132111';
+		$chr['L'] = '111123';
+		$chr['M'] = '111222';
+		$chr['N'] = '111321';
+		$chr['O'] = '121122';
+		$chr['P'] = '131121';
+		$chr['Q'] = '212112';
+		$chr['R'] = '212211';
+		$chr['S'] = '211122';
+		$chr['T'] = '211221';
+		$chr['U'] = '221121';
+		$chr['V'] = '222111';
+		$chr['W'] = '112122';
+		$chr['X'] = '112221';
+		$chr['Y'] = '122121';
+		$chr['Z'] = '123111';
+		$chr['-'] = '121131';
+		$chr['.'] = '311112';
+		$chr[' '] = '311211';
+		$chr['$'] = '321111';
+		$chr['/'] = '112131';
+		$chr['+'] = '113121';
+		$chr['%'] = '211131';
+		$chr[128] = '121221'; // ($)
+		$chr[129] = '311121'; // (/)
+		$chr[130] = '122211'; // (+)
+		$chr[131] = '312111'; // (%)
+		$chr['*'] = '111141';
+		$code = strtoupper($code);
+		$encode = array(
+			chr(0) => chr(131).'U', chr(1) => chr(128).'A', chr(2) => chr(128).'B', chr(3) => chr(128).'C',
+			chr(4) => chr(128).'D', chr(5) => chr(128).'E', chr(6) => chr(128).'F', chr(7) => chr(128).'G',
+			chr(8) => chr(128).'H', chr(9) => chr(128).'I', chr(10) => chr(128).'J', chr(11) => '£K',
+			chr(12) => chr(128).'L', chr(13) => chr(128).'M', chr(14) => chr(128).'N', chr(15) => chr(128).'O',
+			chr(16) => chr(128).'P', chr(17) => chr(128).'Q', chr(18) => chr(128).'R', chr(19) => chr(128).'S',
+			chr(20) => chr(128).'T', chr(21) => chr(128).'U', chr(22) => chr(128).'V', chr(23) => chr(128).'W',
+			chr(24) => chr(128).'X', chr(25) => chr(128).'Y', chr(26) => chr(128).'Z', chr(27) => chr(131).'A',
+			chr(28) => chr(131).'B', chr(29) => chr(131).'C', chr(30) => chr(131).'D', chr(31) => chr(131).'E',
+			chr(32) => ' ', chr(33) => chr(129).'A', chr(34) => chr(129).'B', chr(35) => chr(129).'C',
+			chr(36) => chr(129).'D', chr(37) => chr(129).'E', chr(38) => chr(129).'F', chr(39) => chr(129).'G',
+			chr(40) => chr(129).'H', chr(41) => chr(129).'I', chr(42) => chr(129).'J', chr(43) => chr(129).'K',
+			chr(44) => chr(129).'L', chr(45) => '-', chr(46) => '.', chr(47) => chr(129).'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) => chr(129).'Z', chr(59) => chr(131).'F',
+			chr(60) => chr(131).'G', chr(61) => chr(131).'H', chr(62) => chr(131).'I', chr(63) => chr(131).'J',
+			chr(64) => chr(131).'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) => chr(131).'K',
+			chr(92) => chr(131).'L', chr(93) => chr(131).'M', chr(94) => chr(131).'N', chr(95) => chr(131).'O',
+			chr(96) => chr(131).'W', chr(97) => chr(130).'A', chr(98) => chr(130).'B', chr(99) => chr(130).'C',
+			chr(100) => chr(130).'D', chr(101) => chr(130).'E', chr(102) => chr(130).'F', chr(103) => chr(130).'G',
+			chr(104) => chr(130).'H', chr(105) => chr(130).'I', chr(106) => chr(130).'J', chr(107) => chr(130).'K',
+			chr(108) => chr(130).'L', chr(109) => chr(130).'M', chr(110) => chr(130).'N', chr(111) => chr(130).'O',
+			chr(112) => chr(130).'P', chr(113) => chr(130).'Q', chr(114) => chr(130).'R', chr(115) => chr(130).'S',
+			chr(116) => chr(130).'T', chr(117) => chr(130).'U', chr(118) => chr(130).'V', chr(119) => chr(130).'W',
+			chr(120) => chr(130).'X', chr(121) => chr(130).'Y', chr(122) => chr(130).'Z', chr(123) => chr(131).'P',
+			chr(124) => chr(131).'Q', chr(125) => chr(131).'R', chr(126) => chr(131).'S', chr(127) => chr(131).'T');
+		$code_ext = '';
+		$clen = strlen($code);
+		for ($i = 0 ; $i < $clen; ++$i) {
+			if (ord($code{$i}) > 127) {
+				return false;
+			}
+			$code_ext .= $encode[$code{$i}];
+		}
+		// checksum
+		$code .= $this->checksum_code93($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 < 6; ++$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' => true, 'w' => 1, 'h' => 1, 'p' => 0);
+		$bararray['maxw'] += 1;
+		++$k;
+		return $bararray;
+	}
+
+	/**
+	 * Calculate CODE 93 checksum (modulo 47).
+	 * @param $code (string) code to represent.
+	 * @return string checksum code.
+	 * @protected
+	 */
+	protected function checksum_code93($code) {
+		$chars = array(
+			'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+			'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
+			'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
+			'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%');
+		// translate special characters
+		$code = strtr($code, chr(128).chr(129).chr(130).chr(131), '$/+%');
+		$len = strlen($code);
+		// calculate check digit C
+		$p = 1;
+		$check = 0;
+		for ($i = ($len - 1); $i >= 0; --$i) {
+			$k = array_keys($chars, $code{$i});
+			$check += ($k[0] * $p);
+			++$p;
+			if ($p > 20) {
+				$p = 1;
+			}
+		}
+		$check %= 47;
+		$c = $chars[$check];
+		$code .= $c;
+		// calculate check digit K
+		$p = 1;
+		$check = 0;
+		for ($i = $len; $i >= 0; --$i) {
+			$k = array_keys($chars, $code{$i});
+			$check += ($k[0] * $p);
+			++$p;
+			if ($p > 15) {
+				$p = 1;
+			}
+		}
+		$check %= 47;
+		$k = $chars[$check];
+		return $c.$k;
+	}
+
+	/**
+	 * Checksum for standard 2 of 5 barcodes.
+	 * @param $code (string) code to process.
+	 * @return int checksum.
+	 * @protected
+	 */
+	protected function checksum_s25($code) {
+		$len = strlen($code);
+		$sum = 0;
+		for ($i = 0; $i < $len; $i+=2) {
+			$sum += $code{$i};
+		}
+		$sum *= 3;
+		for ($i = 1; $i < $len; $i+=2) {
+			$sum += ($code{$i});
+		}
+		$r = $sum % 10;
+		if($r > 0) {
+			$r = (10 - $r);
+		}
+		return $r;
+	}
+
+	/**
+	 * MSI.
+	 * Variation of Plessey code, with similar applications
+	 * Contains digits (0 to 9) and encodes the data only in the width of bars.
+	 * @param $code (string) code to represent.
+	 * @param $checksum (boolean) if true add a checksum to the code (modulo 11)
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_msi($code, $checksum=false) {
+		$chr['0'] = '100100100100';
+		$chr['1'] = '100100100110';
+		$chr['2'] = '100100110100';
+		$chr['3'] = '100100110110';
+		$chr['4'] = '100110100100';
+		$chr['5'] = '100110100110';
+		$chr['6'] = '100110110100';
+		$chr['7'] = '100110110110';
+		$chr['8'] = '110100100100';
+		$chr['9'] = '110100100110';
+		$chr['A'] = '110100110100';
+		$chr['B'] = '110100110110';
+		$chr['C'] = '110110100100';
+		$chr['D'] = '110110100110';
+		$chr['E'] = '110110110100';
+		$chr['F'] = '110110110110';
+		if ($checksum) {
+			// add checksum
+			$clen = strlen($code);
+			$p = 2;
+			$check = 0;
+			for ($i = ($clen - 1); $i >= 0; --$i) {
+				$check += (hexdec($code{$i}) * $p);
+				++$p;
+				if ($p > 7) {
+					$p = 2;
+				}
+			}
+			$check %= 11;
+			if ($check > 0) {
+				$check = 11 - $check;
+			}
+			$code .= $check;
+		}
+		$seq = '110'; // left guard
+		$clen = strlen($code);
+		for ($i = 0; $i < $clen; ++$i) {
+			$digit = $code{$i};
+			if (!isset($chr[$digit])) {
+				// invalid character
+				return false;
+			}
+			$seq .= $chr[$digit];
+		}
+		$seq .= '1001'; // right guard
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		return $this->binseq_to_array($seq, $bararray);
+	}
+
+	/**
+	 * Standard 2 of 5 barcodes.
+	 * Used in airline ticket marking, photofinishing
+	 * Contains digits (0 to 9) and encodes the data only in the width of bars.
+	 * @param $code (string) code to represent.
+	 * @param $checksum (boolean) if true add a checksum to the code
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_s25($code, $checksum=false) {
+		$chr['0'] = '10101110111010';
+		$chr['1'] = '11101010101110';
+		$chr['2'] = '10111010101110';
+		$chr['3'] = '11101110101010';
+		$chr['4'] = '10101110101110';
+		$chr['5'] = '11101011101010';
+		$chr['6'] = '10111011101010';
+		$chr['7'] = '10101011101110';
+		$chr['8'] = '10101110111010';
+		$chr['9'] = '10111010111010';
+		if ($checksum) {
+			// add checksum
+			$code .= $this->checksum_s25($code);
+		}
+		if((strlen($code) % 2) != 0) {
+			// add leading zero if code-length is odd
+			$code = '0'.$code;
+		}
+		$seq = '11011010';
+		$clen = strlen($code);
+		for ($i = 0; $i < $clen; ++$i) {
+			$digit = $code{$i};
+			if (!isset($chr[$digit])) {
+				// invalid character
+				return false;
+			}
+			$seq .= $chr[$digit];
+		}
+		$seq .= '1101011';
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		return $this->binseq_to_array($seq, $bararray);
+	}
+
+	/**
+	 * Convert binary barcode sequence to TCPDF barcode array.
+	 * @param $seq (string) barcode as binary sequence.
+	 * @param $bararray (array) barcode array.
+	 * òparam array $bararray TCPDF barcode array to fill up
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function binseq_to_array($seq, $bararray) {
+		$len = strlen($seq);
+		$w = 0;
+		$k = 0;
+		for ($i = 0; $i < $len; ++$i) {
+			$w += 1;
+			if (($i == ($len - 1)) OR (($i < ($len - 1)) AND ($seq{$i} != $seq{($i+1)}))) {
+				if ($seq{$i} == '1') {
+					$t = true; // bar
+				} else {
+					$t = false; // space
+				}
+				$bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+				$bararray['maxw'] += $w;
+				++$k;
+				$w = 0;
+			}
+		}
+		return $bararray;
+	}
+
+	/**
+	 * Interleaved 2 of 5 barcodes.
+	 * Compact numeric code, widely used in industry, air cargo
+	 * Contains digits (0 to 9) and encodes the data in the width of both bars and spaces.
+	 * @param $code (string) code to represent.
+	 * @param $checksum (boolean) if true add a checksum to the code
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_i25($code, $checksum=false) {
+		$chr['0'] = '11221';
+		$chr['1'] = '21112';
+		$chr['2'] = '12112';
+		$chr['3'] = '22111';
+		$chr['4'] = '11212';
+		$chr['5'] = '21211';
+		$chr['6'] = '12211';
+		$chr['7'] = '11122';
+		$chr['8'] = '21121';
+		$chr['9'] = '12121';
+		$chr['A'] = '11';
+		$chr['Z'] = '21';
+		if ($checksum) {
+			// add checksum
+			$code .= $this->checksum_s25($code);
+		}
+		if((strlen($code) % 2) != 0) {
+			// add leading zero if code-length is odd
+			$code = '0'.$code;
+		}
+		// add start and stop codes
+		$code = 'AA'.strtolower($code).'ZA';
+
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		$k = 0;
+		$clen = strlen($code);
+		for ($i = 0; $i < $clen; $i = ($i + 2)) {
+			$char_bar = $code{$i};
+			$char_space = $code{$i+1};
+			if((!isset($chr[$char_bar])) OR (!isset($chr[$char_space]))) {
+				// invalid