1d919a4deSMichael Große<?php 2d919a4deSMichael Große 3d919a4deSMichael Großenamespace Mpdf\Barcode; 4d919a4deSMichael Große 5d919a4deSMichael Große/** 6d919a4deSMichael Große * UPC-Based Extentions 7d919a4deSMichael Große * 2-Digit Ext.: Used to indicate magazines and newspaper issue numbers 8d919a4deSMichael Große * 5-Digit Ext.: Used to mark suggested retail price of books 9d919a4deSMichael Große */ 10d919a4deSMichael Großeclass EanExt extends \Mpdf\Barcode\AbstractBarcode implements \Mpdf\Barcode\BarcodeInterface 11d919a4deSMichael Große{ 12d919a4deSMichael Große 13d919a4deSMichael Große /** 14d919a4deSMichael Große * @param string $code 15d919a4deSMichael Große * @param int $length 16d919a4deSMichael Große * @param float $leftMargin 17d919a4deSMichael Große * @param float $rightMargin 18d919a4deSMichael Große * @param float $xDim 19d919a4deSMichael Große * @param float $barHeight 20d919a4deSMichael Große * @param float $separatorMargin 21d919a4deSMichael Große */ 22d919a4deSMichael Große public function __construct($code, $length, $leftMargin, $rightMargin, $xDim, $barHeight, $separatorMargin) 23d919a4deSMichael Große { 24d919a4deSMichael Große $this->init($code, $length); 25d919a4deSMichael Große 26d919a4deSMichael Große $this->data['lightmL'] = $leftMargin; // LEFT light margin = x X-dim (http://www.gs1uk.org) 27d919a4deSMichael Große $this->data['lightmR'] = $rightMargin; // RIGHT light margin = x X-dim (http://www.gs1uk.org) 28d919a4deSMichael Große $this->data['nom-X'] = $xDim; // Nominal value for X-dim in mm (http://www.gs1uk.org) 29d919a4deSMichael Große $this->data['nom-H'] = $barHeight; // Nominal bar height in mm incl. numerals (http://www.gs1uk.org) 30d919a4deSMichael Große $this->data['sepM'] = $separatorMargin; // SEPARATION margin = x X-dim (http://web.archive.org/web/19990501035133/http://www.uc-council.org/d36-d.htm) 31d919a4deSMichael Große } 32d919a4deSMichael Große 33d919a4deSMichael Große /** 34d919a4deSMichael Große * @param string $code 35d919a4deSMichael Große * @param int $length 36d919a4deSMichael Große */ 37d919a4deSMichael Große private function init($code, $length = 5) 38d919a4deSMichael Große { 39d919a4deSMichael Große // Padding 40d919a4deSMichael Große $code = str_pad($code, $length, '0', STR_PAD_LEFT); 41d919a4deSMichael Große 42d919a4deSMichael Große // Calculate check digit 43d919a4deSMichael Große if ($length == 2) { 44d919a4deSMichael Große $r = $code % 4; 45d919a4deSMichael Große } elseif ($length == 5) { 46dc4d9dc6SAnna Dabrowska $r = (3 * ($code[0] + $code[2] + $code[4])) + (9 * ($code[1] + $code[3])); 47d919a4deSMichael Große $r %= 10; 48d919a4deSMichael Große } else { 49*f6b6ef87SEduardo Mozart de Oliveira throw new \Mpdf\Barcode\BarcodeException(sprintf('Invalid EAN barcode value "%s"', $code)); 50d919a4deSMichael Große } 51d919a4deSMichael Große 52d919a4deSMichael Große // Convert digits to bars 53d919a4deSMichael Große $codes = [ 54d919a4deSMichael Große 'A' => [ // left odd parity 55d919a4deSMichael Große '0' => '0001101', 56d919a4deSMichael Große '1' => '0011001', 57d919a4deSMichael Große '2' => '0010011', 58d919a4deSMichael Große '3' => '0111101', 59d919a4deSMichael Große '4' => '0100011', 60d919a4deSMichael Große '5' => '0110001', 61d919a4deSMichael Große '6' => '0101111', 62d919a4deSMichael Große '7' => '0111011', 63d919a4deSMichael Große '8' => '0110111', 64d919a4deSMichael Große '9' => '0001011'], 65d919a4deSMichael Große 'B' => [ // left even parity 66d919a4deSMichael Große '0' => '0100111', 67d919a4deSMichael Große '1' => '0110011', 68d919a4deSMichael Große '2' => '0011011', 69d919a4deSMichael Große '3' => '0100001', 70d919a4deSMichael Große '4' => '0011101', 71d919a4deSMichael Große '5' => '0111001', 72d919a4deSMichael Große '6' => '0000101', 73d919a4deSMichael Große '7' => '0010001', 74d919a4deSMichael Große '8' => '0001001', 75d919a4deSMichael Große '9' => '0010111'] 76d919a4deSMichael Große ]; 77d919a4deSMichael Große $parities = []; 78d919a4deSMichael Große $parities[2] = [ 79d919a4deSMichael Große '0' => ['A', 'A'], 80d919a4deSMichael Große '1' => ['A', 'B'], 81d919a4deSMichael Große '2' => ['B', 'A'], 82d919a4deSMichael Große '3' => ['B', 'B'] 83d919a4deSMichael Große ]; 84d919a4deSMichael Große $parities[5] = [ 85d919a4deSMichael Große '0' => ['B', 'B', 'A', 'A', 'A'], 86d919a4deSMichael Große '1' => ['B', 'A', 'B', 'A', 'A'], 87d919a4deSMichael Große '2' => ['B', 'A', 'A', 'B', 'A'], 88d919a4deSMichael Große '3' => ['B', 'A', 'A', 'A', 'B'], 89d919a4deSMichael Große '4' => ['A', 'B', 'B', 'A', 'A'], 90d919a4deSMichael Große '5' => ['A', 'A', 'B', 'B', 'A'], 91d919a4deSMichael Große '6' => ['A', 'A', 'A', 'B', 'B'], 92d919a4deSMichael Große '7' => ['A', 'B', 'A', 'B', 'A'], 93d919a4deSMichael Große '8' => ['A', 'B', 'A', 'A', 'B'], 94d919a4deSMichael Große '9' => ['A', 'A', 'B', 'A', 'B'] 95d919a4deSMichael Große ]; 96d919a4deSMichael Große $p = $parities[$length][$r]; 97d919a4deSMichael Große $seq = '1011'; // left guard bar 98dc4d9dc6SAnna Dabrowska $seq .= $codes[$p[0]][$code[0]]; 99d919a4deSMichael Große for ($i = 1; $i < $length; ++$i) { 100d919a4deSMichael Große $seq .= '01'; // separator 101d919a4deSMichael Große $seq .= $codes[$p[$i]][$code[$i]]; 102d919a4deSMichael Große } 103d919a4deSMichael Große 104d919a4deSMichael Große $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; 105d919a4deSMichael Große 106d919a4deSMichael Große $this->data = $this->binseqToArray($seq, $bararray); 107d919a4deSMichael Große } 108d919a4deSMichael Große 109d919a4deSMichael Große public function getType() 110d919a4deSMichael Große { 111d919a4deSMichael Große return 'EAN EXT'; 112d919a4deSMichael Große } 113d919a4deSMichael Große 114d919a4deSMichael Große} 115