Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php/* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: *//*** Image_Barcode_code128 class** Renders Code128 barcodes* Code128 is a high density encoding for alphanumeric strings.* This module prints the Code128B representation of the most common* ASCII characters (32 to 134).** These are the components of a Code128 Bar code:* - 10 Unit Quiet Zone* - 6 Unit Start Character* - (n * 6) Unit Message* - 6 Unit "Check Digit" Character* - 7 Unit Stop Character* - 10 Unit Quiet Zone** I originally wrote this algorithm in Visual Basic 6 for a Rapid* Software Development class, where we printed Code128 B bar codes* to read using Cue Cat bar code readers. I rewrote the algorithm* using PHP for inclusion in the PEAR Image_Barcode project.** The Code128B bar codes produced by the algorithm have been validated* using my trusty Cue-Cat bar code reader.** PHP versions 4** LICENSE: This source file is subject to version 3.0 of the PHP license* that is available through the world-wide-web at the following URI:* http://www.php.net/license/3_0.txt. If you did not receive a copy of* the PHP License and are unable to obtain it through the web, please* send a note to license@php.net so we can mail you a copy immediately.** @category Image* @package Image_Barcode* @author Jeffrey K. Brown <jkb@darkfantastic.net>* @copyright 2005 The PHP Group* @license http://www.php.net/license/3_0.txt PHP License 3.0* @version CVS: $Id: code128.php 304741 2010-10-25 09:14:17Z clockwerx $* @link http://pear.php.net/package/Image_Barcode*/require_once "Image/Barcode.php";class Image_Barcode_code128 extends Image_Barcode{var $_type = 'code128';var $_barcodeheight = 60;var $_font = 2;var $_barwidth = 1;var $code;/*** Draws a Code128 image barcode** @param string $text A text that should be in the image barcode* @param string $imgtype The image type that will be generated** @return image The corresponding interleaved 2 of 5 image barcode** @access public** @author Jeffrey K. Brown <jkb@darkfantastic.net>** @internal* The draw() method is broken into three sections. First, we take* the input string and convert it to a string of barcode widths.* Then, we size and allocate the image. Finally, we print the bars to* the image along with the barcode text and display it to the beholder.**/function &draw($text, $imgtype = 'png'){// We start with the Code128 Start Code character. We// initialize checksum to 104, rather than calculate it.// We then add the startcode to $allbars, the main string// containing the bar sizes for the entire code.$startcode= $this->getStartCode();$checksum = 104;$allbars = $startcode;// Next, we read the $text string that was passed to the// method and for each character, we determine the bar// pattern and add it to the end of the $allbars string.// In addition, we continually add the character's value// to the checksum$bars = '';for ($i=0; $i < strlen($text); ++$i) {$char = $text[$i];$val = $this->getCharNumber($char);$checksum += ($val * ($i + 1));$bars = $this->getCharCode($char);$allbars = $allbars . $bars;}// Then, Take the Mod 103 of the total to get the index// of the Code128 Check Character. We get its bar// pattern and add it to $allbars in the next section.$checkdigit = $checksum % 103;$bars = $this->getNumCode($checkdigit);// Finally, we get the Stop Code pattern and put the// remaining pieces together. We are left with the// string $allbars containing all of the bar widths// and can now think about writing it to the image.$stopcode = $this->getStopCode();$allbars = $allbars . $bars . $stopcode;//------------------------------------------------------//// Next, we will calculate the width of the resulting// bar code and size the image accordingly.// 10 Pixel "Quiet Zone" in front, and 10 Pixel// "Quiet Zone" at the end.$barcodewidth = 20;// We will read each of the characters (1,2,3,or 4) in// the $allbars string and add its width to the running// total $barcodewidth. The height of the barcode is// calculated by taking the bar height plus the font height.for ($i=0; $i < strlen($allbars); ++$i) {$nval = $allbars[$i];$barcodewidth += ($nval * $this->_barwidth);}$barcodelongheight = (int) (imagefontheight($this->_font) / 2) + $this->_barcodeheight;// Then, we create the image, allocate the colors, and fill// the image with a nice, white background, ready for printing// our black bars and the text.$img = ImageCreate($barcodewidth, $barcodelongheight+ imagefontheight($this->_font)+1);$black = ImageColorAllocate($img, 0, 0, 0);$white = ImageColorAllocate($img, 255, 255, 255);imagefill($img, 0, 0, $white);//------------------------------------------------------//// Finally, we write our text line centered across the// bottom and the bar patterns and display the image.// First, print the image, centered across the bottom.imagestring($img,$this->_font,$barcodewidth / 2 - strlen($text) / 2 * (imagefontwidth($this->_font)),$this->_barcodeheight + imagefontheight($this->_font) / 2,$text,$black);// We set $xpos to 10 so we start bar printing after// position 10 to simulate the 10 pixel "Quiet Zone"$xpos = 10;// We will now process each of the characters in the $allbars// array. The number in each position is read and then alternating// black bars and spaces are drawn with the corresponding width.$bar = 1;for ($i=0; $i < strlen($allbars); ++$i) {$nval = $allbars[$i];$width = $nval * $this->_barwidth;if ($bar==1) {imagefilledrectangle($img, $xpos, 0, $xpos + $width-1, $barcodelongheight, $black);$xpos += $width;$bar = 0;} else {$xpos += $width;$bar = 1;}}return $img;} // function draw()/*** @internal* In the Image_Barcode_code128 constructor, we initialize* the $code array, containing the bar and space pattern* for the Code128 B character set.*/function Image_Barcode_code128(){$this->code[0] = "212222"; // " "$this->code[1] = "222122"; // "!"$this->code[2] = "222221"; // "{QUOTE}"$this->code[3] = "121223"; // "#"$this->code[4] = "121322"; // "$"$this->code[5] = "131222"; // "%"$this->code[6] = "122213"; // "&"$this->code[7] = "122312"; // "'"$this->code[8] = "132212"; // "("$this->code[9] = "221213"; // ")"$this->code[10] = "221312"; // "*"$this->code[11] = "231212"; // "+"$this->code[12] = "112232"; // ","$this->code[13] = "122132"; // "-"$this->code[14] = "122231"; // "."$this->code[15] = "113222"; // "/"$this->code[16] = "123122"; // "0"$this->code[17] = "123221"; // "1"$this->code[18] = "223211"; // "2"$this->code[19] = "221132"; // "3"$this->code[20] = "221231"; // "4"$this->code[21] = "213212"; // "5"$this->code[22] = "223112"; // "6"$this->code[23] = "312131"; // "7"$this->code[24] = "311222"; // "8"$this->code[25] = "321122"; // "9"$this->code[26] = "321221"; // ":"$this->code[27] = "312212"; // ";"$this->code[28] = "322112"; // "<"$this->code[29] = "322211"; // "="$this->code[30] = "212123"; // ">"$this->code[31] = "212321"; // "?"$this->code[32] = "232121"; // "@"$this->code[33] = "111323"; // "A"$this->code[34] = "131123"; // "B"$this->code[35] = "131321"; // "C"$this->code[36] = "112313"; // "D"$this->code[37] = "132113"; // "E"$this->code[38] = "132311"; // "F"$this->code[39] = "211313"; // "G"$this->code[40] = "231113"; // "H"$this->code[41] = "231311"; // "I"$this->code[42] = "112133"; // "J"$this->code[43] = "112331"; // "K"$this->code[44] = "132131"; // "L"$this->code[45] = "113123"; // "M"$this->code[46] = "113321"; // "N"$this->code[47] = "133121"; // "O"$this->code[48] = "313121"; // "P"$this->code[49] = "211331"; // "Q"$this->code[50] = "231131"; // "R"$this->code[51] = "213113"; // "S"$this->code[52] = "213311"; // "T"$this->code[53] = "213131"; // "U"$this->code[54] = "311123"; // "V"$this->code[55] = "311321"; // "W"$this->code[56] = "331121"; // "X"$this->code[57] = "312113"; // "Y"$this->code[58] = "312311"; // "Z"$this->code[59] = "332111"; // "["$this->code[60] = "314111"; // "\"$this->code[61] = "221411"; // "]"$this->code[62] = "431111"; // "^"$this->code[63] = "111224"; // "_"$this->code[64] = "111422"; // "`"$this->code[65] = "121124"; // "a"$this->code[66] = "121421"; // "b"$this->code[67] = "141122"; // "c"$this->code[68] = "141221"; // "d"$this->code[69] = "112214"; // "e"$this->code[70] = "112412"; // "f"$this->code[71] = "122114"; // "g"$this->code[72] = "122411"; // "h"$this->code[73] = "142112"; // "i"$this->code[74] = "142211"; // "j"$this->code[75] = "241211"; // "k"$this->code[76] = "221114"; // "l"$this->code[77] = "413111"; // "m"$this->code[78] = "241112"; // "n"$this->code[79] = "134111"; // "o"$this->code[80] = "111242"; // "p"$this->code[81] = "121142"; // "q"$this->code[82] = "121241"; // "r"$this->code[83] = "114212"; // "s"$this->code[84] = "124112"; // "t"$this->code[85] = "124211"; // "u"$this->code[86] = "411212"; // "v"$this->code[87] = "421112"; // "w"$this->code[88] = "421211"; // "x"$this->code[89] = "212141"; // "y"$this->code[90] = "214121"; // "z"$this->code[91] = "412121"; // "{"$this->code[92] = "111143"; // "|"$this->code[93] = "111341"; // "}"$this->code[94] = "131141"; // "~"$this->code[95] = "114113"; // 95$this->code[96] = "114311"; // 96$this->code[97] = "411113"; // 97$this->code[98] = "411311"; // 98$this->code[99] = "113141"; // 99$this->code[100] = "114131"; // 100$this->code[101] = "311141"; // 101$this->code[102] = "411131"; // 102}/*** Return the Code128 code for a character*/function getCharCode($c) {$retval = $this->code[ord($c) - 32];return $retval;}/*** Return the Start Code for Code128*/function getStartCode() {return '211214';}/*** Return the Stop Code for Code128*/function getStopCode() {return '2331112';}/*** Return the Code128 code equivalent of a character number*/function getNumCode($index) {$retval = $this->code[$index];return $retval;}/*** Return the Code128 numerical equivalent of a character.*/function getCharNumber($c) {$retval = ord($c) - 32;return $retval;}} // class?>