xref: /plugin/dw2pdf/vendor/mpdf/mpdf/src/Barcode/EanExt.php (revision f6b6ef8702ed2497118554fab8d66533b3b9b760)
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