1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184:
<?php
namespace emberlabs\Barcode;
class Code39 extends BarcodeBase
{
private static $binMap = array(
' ' => '011000100',
'$' => '010101000',
'%' => '000101010',
'*' => '010010100',
'+' => '010001010',
'|' => '010000101',
'.' => '110000100',
'/' => '010100010',
'-' => '010000101',
'0' => '000110100',
'1' => '100100001',
'2' => '001100001',
'3' => '101100000',
'4' => '000110001',
'5' => '100110000',
'6' => '001110000',
'7' => '000100101',
'8' => '100100100',
'9' => '001100100',
'A' => '100001001',
'B' => '001001001',
'C' => '101001000',
'D' => '000011001',
'E' => '100011000',
'F' => '001011000',
'G' => '000001101',
'H' => '100001100',
'I' => '001001100',
'J' => '000011100',
'K' => '100000011',
'L' => '001000011',
'M' => '101000010',
'N' => '000010011',
'O' => '100010010',
'P' => '001010010',
'Q' => '000000111',
'R' => '100000110',
'S' => '001000110',
'T' => '000010110',
'U' => '110000001',
'V' => '011000001',
'W' => '111000000',
'X' => '010010001',
'Y' => '110010000',
'Z' => '011010000',
);
const NARROW_BAR = 20;
const WIDE_BAR = 55;
const QUIET_BAR = 35;
public function setData($data)
{
$this->data = $data;
}
private function getMap($char)
{
return self::$binMap[$char] ?: self::$this->binMap[' '];
}
public function draw()
{
$data = '*' . strtoupper(ltrim(rtrim(trim($this->data), '*'), '*')) . '*';
$pxPerChar = (strlen($data) * ((6 * self::NARROW_BAR) + (3 * self::WIDE_BAR) + self::QUIET_BAR)) - self::QUIET_BAR;
$widthQuotient = $this->x / $pxPerChar;
$narrowBar = (int) (self::NARROW_BAR * $widthQuotient);
$wideBar = (int) (self::WIDE_BAR * $widthQuotient);
$quietBar = (int) (self::QUIET_BAR * $widthQuotient);
$imageWidth = (strlen($data) * ((6 * $narrowBar) + (3 * $wideBar) + $quietBar)) - $quietBar;
if ($narrowBar < 1 || $wideBar < 1 || $quietBar < 1 || $narrowBar == $quietBar || $narrowBar == $wideBar || $wideBar == $quietBar)
{
throw new \OverflowException("You need to specify a bigger width to properly display this barcode");
}
$currentBarX = (int)(($this->x - $imageWidth) / 2);
$charAry = str_split($data);
$this->img = @imagecreate($this->x, $this->y);
if (!$this->img)
{
throw new \RuntimeException("Code39: Image failed to initialize");
}
$white = imagecolorallocate($this->img, 255, 255, 255);
$black = imagecolorallocate($this->img, 0, 0, 0);
$color = $black;
foreach($charAry as $_k => $char)
{
$code = str_split($this->getMap($char));
$color = $black;
foreach($code as $k => $bit)
{
if ($bit == '0')
{
imagefilledrectangle($this->img, $currentBarX, 0, ($currentBarX + $narrowBar), ($this->y - 1), $color);
$currentBarX += $narrowBar;
}
elseif($bit == '1')
{
imagefilledrectangle($this->img, $currentBarX, 0, ($currentBarX + $wideBar), ($this->y - 1), $color);
$currentBarX += $wideBar;
}
$color = ($color == $black) ? $white : $black;
}
if ($_k == (sizeof($charAry) - 1))
{
break;
}
imagefilledrectangle($this->img, $currentBarX, 0, ($currentBarX + $quietBar), ($this->y - 1), $white);
$currentBarX += $quietBar;
}
}
}
?>