- <?php
- class BarCode128 {
- const STARTA = 103;
- const STARTB = 104;
- const STARTC = 105;
- const STOP = 106;
- private $unit_width = 2; // 单位宽度 缺省 1 个象素
- private $is_set_height = false;
- private $width = -1;
- private $heith = 70;
- private $quiet_zone = 6;
- private $font_height = 15;
- private $font_type = 5;
- private $color =0x000000;
- private $bgcolor =0xFFFFFF;
- private $image = null;
- private $codes = array("212222","222122","222221","121223","121322","131222","122213","122312","132212","221213","221312","231212","112232","122132","122231","113222","123122","123221","223211","221132","221231","213212","223112","312131","311222","321122","321221","312212","322112","322211","212123","212321","232121","111323","131123","131321","112313","132113","132311","211313","231113","231311","112133","112331","132131","113123","113321","133121","313121","211331","231131","213113","213311","213131","311123","311321","331121","312113","312311","332111","314111","221411","431111","111224","111422","121124","121421","141122","141221","112214","112412","122114","122411","142112","142211","241211","221114","413111","241112","134111","111242","121142","121241","114212","124112","124211","411212","421112","421211","212141","214121","412121","111143","111341","131141","114113","114311","411113","411311","113141","114131","311141","411131","211412","211214","211412","2331112");
- private $valid_code = -1;
- private $type ='B';
- private $start_codes =array('A'=>self::STARTA,'B'=>self::STARTB,'C'=>self::STARTC);
- private $code ='';
- private $bin_code ='';
- private $text ='';
- public function __construct()
- {
- }
- public function setUnitWidth($unit_width)
- {
- $this->unit_width = $unit_width;
- $this->quiet_zone = $this->unit_width*6;
- $this->font_height = $this->unit_width*15;
- if (!$this->is_set_height)
- {
- $this->heith = $this->unit_width*35;
- }
- }
- public function setFontType($font_type)
- {
- $this->font_type = $font_type;
- }
- public function setBgcolor($bgcoloe)
- {
- $this->bgcolor = $bgcoloe;
- }
- public function setColor($color)
- {
- $this->color = $color;
- }
- public function setCode($code)
- {
- if ($code !='')
- {
- $this->code= $code;
- if ($this->text ==='')
- $this->text = $code;
- }
- }
- public function setText($text)
- {
- $this->text = $text;
- }
- public function setType($type)
- {
- $this->type = $type;
- }
- public function setHeight($height)
- {
- $this->height = $height;
- $this->is_set_height = true;
- }
- private function getValueFromChar($ch)
- {
- $val = ord($ch);
- try
- {
- if ($this->type =='A')
- {
- if ($val> 95)
- throw new Exception('illegal barcode character'.$ch.'for code128A in'.__FILE__.'on line'.__LINE__);
- if ($val <32)
- $val += 64;
- else
- $val -=32;
- }
- elseif ($this->type =='B')
- {
- if ($val <32 || $val> 127)
- throw new Exception('illegal barcode character'.$ch.'for code128B in'.__FILE__.'on line'.__LINE__);
- else
- $val -=32;
- }
- else
- {
- if (!is_numeric($ch) || (int)$ch <0 || (int)($ch)> 99)
- throw new Exception('illegal barcode character'.$ch.'for code128C in'.__FILE__.'on line'.__LINE__);
- else
- {
- if (strlen($ch) ==1)
- $ch .='0';
- $val = (int)($ch);
- }
- }
- }
- catch(Exception $ex)
- {
- errorlog('die',$ex->getMessage());
- }
- return $val;
- }
- private function parseCode()
- {
- $this->type=='C'?$step=2:$step=1;
- $val_sum = $this->start_codes[$this->type];
- $this->width = 35;
- $this->bin_code = $this->codes[$val_sum];
- for($i =0;$i<strlen($this->code);$i+=$step)
- {
- $this->width +=11;
- $ch = substr($this->code,$i,$step);
- $val = $this->getValueFromChar($ch);
- $val_sum += $val;
- $this->bin_code .= $this->codes[$val];
- }
- $this->width *=$this->unit_width;
- $val_sum = $val_sum%103;
- $this->valid_code = $val_sum;
- $this->bin_code .= $this->codes[$this->valid_code];
- $this->bin_code .= $this->codes[self::STOP];
- }
- public function getValidCode()
- {
- if ($this->valid_code == -1)
- $this->parseCode();
- return $this->valid_code;
- }
- public function getWidth()
- {
- if ($this->width ==-1)
- $this->parseCode();
- return $this->width;
- }
- public function getHeight()
- {
- if ($this->width ==-1)
- $this->parseCode();
- return $this->height;
- }
- public function createBarCode($code='',$text='',$file_name=null,$type='B', $image_type ='png')
- {
- if (in_array($type,array('A','B','C')))
- $this->setType($type);
- else
- $this->setType('B');
- if ($code !=='')
- $this->setCode($code);
- if ($text !=='')
- $this->setText($text);
- $this->parseCode();
- $this->image = ImageCreate($this->width+2*$this->quiet_zone,$this->heith + $this->font_height);
- $this->bgcolor = imagecolorallocate($this->image,$this->bgcolor>> 16,($this->bgcolor>> 8)&0x00FF,$this->bgcolor & 0xFF);
- $this->color = imagecolorallocate($this->image,$this->color>> 16,($this->color>> 8)&0x00FF,$this->color & 0xFF);
- ImageFilledRectangle($this->image, 0, 0, $this->width + 2*$this->quiet_zone,$this->heith + $this->font_height, $this->bgcolor);
- $sx = $this->quiet_zone;
- $sy = $this->font_height -1;
- $fw = 10; // 編號為 2 或 3 的字體的寬度為 10, 為 4 或 5 的字體寬度為 11
- if ($this->font_type>3)
- {
- $sy++;
- $fw=11;
- }
- $ex = 0;
- $ey = $this->heith + $this->font_height - 2;
- for($i=0;$i<strlen($this->bin_code);$i++)
- {
- $ex = $sx + $this->unit_width*(int) $this->bin_code{$i} -1;
- if ($i%2==0)
- ImageFilledRectangle($this->image, $sx, 1, $ex, 60, $this->color); // 原 ImageFilledRectangle($this->image, $sx, $sy, $ex,$ey, $this->color); $sy 改为 1 条形码距离顶部 1 距离 $ey 改为 60 条形码高度 60
- $sx =$ex + 1;
- }
- $t_num = strlen($this->text);
- $t_x = $this->width/$t_num;
- $t_sx = ($t_x -$fw)/2; // 目的为了使文字居中平均分布
- for($i=0;$i<$t_num;$i++)
- {
- imagechar($this->image,$this->font_type,6*$this->unit_width +$t_sx +$i*$t_x,65,$this->text{$i},$this->color); // 原 imagechar($this->image,$this->font_type,6*$this->unit_width +$t_sx +$i*$t_x,0,$this->text{$i},$this->color); 将 0 改为 65 文本距离顶部 65 距离
- }
- if (!$file_name)
- {
- header("Content-Type: image/".$image_type);
- }
- switch ($image_type)
- {
- case 'jpg':
- case 'jpeg':
- Imagejpeg($this->image,$file_name);
- break;
- case 'png':
- Imagepng($this->image,$file_name);
- break;
- case 'gif':
- break;
- Imagegif($this->image,$file_name);
- default:
- Imagepng($this->image,$file_name);
- break;
- }
- }
- }
- $barcode = new BarCode128();
- // 第一个参数为用来生成条形码的字符串, 第二个参数为条形码下面显示的字符内容, 第三个为生成的路径文件名称
- $barcode->createBarCode('SP89867','SP8986712','test.png');
- ?>
来源: http://www.bubuko.com/infodetail-2690906.html