home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / Servidores / xampp-win32-1.6.7-installer.exe / php / PEAR / Image / Barcode / code128.php next >
Encoding:
PHP Script  |  2008-07-02  |  11.9 KB  |  343 lines

  1. <?php
  2. /* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */
  3.  
  4. /**
  5.  * Image_Barcode_code128 class
  6.  *
  7.  * Renders Code128 barcodes
  8.  * Code128 is a high density encoding for alphanumeric strings.
  9.  * This module prints the Code128B representation of the most common
  10.  * ASCII characters (32 to 134).
  11.  *
  12.  * These are the components of a Code128 Bar code:
  13.  * - 10 Unit Quiet Zone
  14.  * - 6 Unit Start Character
  15.  * - (n * 6) Unit Message
  16.  * - 6 Unit "Check Digit" Character
  17.  * - 7 Unit Stop Character
  18.  * - 10 Unit Quiet Zone
  19.  *
  20.  * I originally wrote this algorithm in Visual Basic 6 for a Rapid 
  21.  * Software Development class, where we printed Code128 B bar codes
  22.  * to read using Cue Cat bar code readers.  I rewrote the algorithm
  23.  * using PHP for inclusion in the PEAR Image_Barcode project.
  24.  *
  25.  * The Code128B bar codes produced by the algorithm have been validated
  26.  * using my trusty Cue-Cat bar code reader.
  27.  *
  28.  * PHP versions 4
  29.  *
  30.  * LICENSE: This source file is subject to version 3.0 of the PHP license
  31.  * that is available through the world-wide-web at the following URI:
  32.  * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
  33.  * the PHP License and are unable to obtain it through the web, please
  34.  * send a note to license@php.net so we can mail you a copy immediately.
  35.  *
  36.  * @category   Image
  37.  * @package    Image_Barcode
  38.  * @author     Jeffrey K. Brown <jkb@darkfantastic.net>
  39.  * @copyright  2005 The PHP Group
  40.  * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  41.  * @version    CVS: $Id: code128.php,v 1.3 2006/12/13 19:29:30 cweiske Exp $
  42.  * @link       http://pear.php.net/package/Image_Barcode
  43.  */
  44.  
  45. require_once "Image/Barcode.php";
  46.  
  47. class Image_Barcode_code128 extends Image_Barcode
  48. {
  49.     var $_type = 'code128';
  50.     var $_barcodeheight = 60;
  51.     var $_font = 2;  
  52.     var $_barwidth = 1;
  53.     var $code;
  54.  
  55.  
  56.     /**
  57.      * Draws a Code128 image barcode
  58.      *
  59.      * @param  string $text     A text that should be in the image barcode
  60.      * @param  string $imgtype  The image type that will be generated
  61.      *
  62.      * @return image            The corresponding interleaved 2 of 5 image barcode
  63.      *
  64.      * @access public
  65.      *
  66.      * @author Jeffrey K. Brown <jkb@darkfantastic.net>
  67.      *
  68.      * @internal
  69.      * The draw() method is broken into three sections.  First, we take
  70.      * the input string and convert it to a string of barcode widths.
  71.      * Then, we size and allocate the image.  Finally, we print the bars to
  72.      * the image along with the barcode text and display it to the beholder.
  73.      *
  74.      */
  75.     function &draw($text, $imgtype = 'png')
  76.     {
  77.  
  78.         // We start with the Code128 Start Code character.  We
  79.         // initialize checksum to 104, rather than calculate it.
  80.         // We then add the startcode to $allbars, the main string
  81.         // containing the bar sizes for the entire code.
  82.         $startcode= $this->getStartCode();
  83.         $checksum = 104;
  84.         $allbars = $startcode;
  85.  
  86.  
  87.         // Next, we read the $text string that was passed to the
  88.         // method and for each character, we determine the bar
  89.         // pattern and add it to the end of the $allbars string.
  90.         // In addition, we continually add the character's value
  91.         // to the checksum
  92.         $bars = '';
  93.         for ($i=0; $i < strlen($text); ++$i) {
  94.             $char = $text[$i];
  95.             $val = $this->getCharNumber($char);
  96.  
  97.             $checksum += ($val * ($i + 1));
  98.  
  99.             $bars = $this->getCharCode($char);
  100.             $allbars = $allbars . $bars;
  101.         }
  102.  
  103.  
  104.         // Then, Take the Mod 103 of the total to get the index
  105.         // of the Code128 Check Character.  We get its bar
  106.         // pattern and add it to $allbars in the next section.
  107.         $checkdigit = $checksum % 103;
  108.         $bars = $this->getNumCode($checkdigit);
  109.  
  110.  
  111.         // Finally, we get the Stop Code pattern and put the
  112.         // remaining pieces together.  We are left with the
  113.         // string $allbars containing all of the bar widths
  114.         // and can now think about writing it to the image.
  115.  
  116.         $stopcode = $this->getStopCode();
  117.         $allbars = $allbars . $bars . $stopcode;
  118.  
  119.         //------------------------------------------------------//
  120.         // Next, we will calculate the width of the resulting
  121.         // bar code and size the image accordingly.
  122.  
  123.         // 10 Pixel "Quiet Zone" in front, and 10 Pixel
  124.         // "Quiet Zone" at the end.
  125.         $barcodewidth = 20;
  126.  
  127.  
  128.         // We will read each of the characters (1,2,3,or 4) in
  129.         // the $allbars string and add its width to the running
  130.         // total $barcodewidth.  The height of the barcode is
  131.         // calculated by taking the bar height plus the font height.
  132.  
  133.         for ($i=0; $i < strlen($allbars); ++$i) {
  134.             $nval = $allbars[$i];
  135.             $barcodewidth += ($nval * $this->_barwidth);
  136.         }
  137.         $barcodelongheight = (int) (imagefontheight($this->_font) / 2) + $this->_barcodeheight;
  138.  
  139.  
  140.         // Then, we create the image, allocate the colors, and fill
  141.         // the image with a nice, white background, ready for printing
  142.         // our black bars and the text.
  143.  
  144.         $img = ImageCreate($barcodewidth, $barcodelongheight+ imagefontheight($this->_font)+1);
  145.         $black = ImageColorAllocate($img, 0, 0, 0);
  146.         $white = ImageColorAllocate($img, 255, 255, 255);
  147.         imagefill($img, 0, 0, $white);
  148.  
  149.  
  150.         //------------------------------------------------------//
  151.         // Finally, we write our text line centered across the
  152.         // bottom and the bar patterns and display the image.
  153.  
  154.  
  155.         // First, print the image, centered across the bottom.
  156.         imagestring(
  157.             $img,
  158.             $this->_font,
  159.             $barcodewidth / 2 - strlen($text) / 2 * (imagefontwidth($this->_font)),
  160.             $this->_barcodeheight + imagefontheight($this->_font) / 2,
  161.             $text,
  162.             $black
  163.         );
  164.  
  165.         // We set $xpos to 10 so we start bar printing after 
  166.         // position 10 to simulate the 10 pixel "Quiet Zone"
  167.         $xpos = 10;
  168.  
  169.         // We will now process each of the characters in the $allbars
  170.         // array.  The number in each position is read and then alternating
  171.         // black bars and spaces are drawn with the corresponding width.
  172.         $bar = 1;
  173.         for ($i=0; $i < strlen($allbars); ++$i) {
  174.             $nval = $allbars[$i];
  175.             $width = $nval * $this->_barwidth;
  176.  
  177.             if ($bar==1) {
  178.                 imagefilledrectangle($img, $xpos, 0, $xpos + $width-1, $barcodelongheight, $black);
  179.                 $xpos += $width;
  180.                 $bar = 0;
  181.             } else {
  182.                 $xpos += $width;
  183.                 $bar = 1;
  184.             }
  185.         }
  186.  
  187.         return $img;
  188.     } // function draw()
  189.  
  190.  
  191.     /**
  192.     * @internal
  193.     * In the Image_Barcode_code128 constructor, we initialize
  194.     * the $code array, containing the bar and space pattern
  195.     * for the Code128 B character set.
  196.     */
  197.     function Image_Barcode_code128()
  198.     {
  199.         $this->code[0] = "212222";  // " "
  200.         $this->code[1] = "222122";  // "!"
  201.         $this->code[2] = "222221";  // "{QUOTE}"
  202.         $this->code[3] = "121223";  // "#"
  203.         $this->code[4] = "121322";  // "$"
  204.         $this->code[5] = "131222";  // "%"
  205.         $this->code[6] = "122213";  // "&"
  206.         $this->code[7] = "122312";  // "'"
  207.         $this->code[8] = "132212";  // "("
  208.         $this->code[9] = "221213";  // ")"
  209.         $this->code[10] = "221312"; // "*"
  210.         $this->code[11] = "231212"; // "+"
  211.         $this->code[12] = "112232"; // ","
  212.         $this->code[13] = "122132"; // "-"
  213.         $this->code[14] = "122231"; // "."
  214.         $this->code[15] = "113222"; // "/"
  215.         $this->code[16] = "123122"; // "0"
  216.         $this->code[17] = "123221"; // "1"
  217.         $this->code[18] = "223211"; // "2"
  218.         $this->code[19] = "221132"; // "3"
  219.         $this->code[20] = "221231"; // "4"
  220.         $this->code[21] = "213212"; // "5"
  221.         $this->code[22] = "223112"; // "6"
  222.         $this->code[23] = "312131"; // "7"
  223.         $this->code[24] = "311222"; // "8"
  224.         $this->code[25] = "321122"; // "9"
  225.         $this->code[26] = "321221"; // ":"
  226.         $this->code[27] = "312212"; // ";"
  227.         $this->code[28] = "322112"; // "<"
  228.         $this->code[29] = "322211"; // "="
  229.         $this->code[30] = "212123"; // ">"
  230.         $this->code[31] = "212321"; // "?"
  231.         $this->code[32] = "232121"; // "@"
  232.         $this->code[33] = "111323"; // "A"
  233.         $this->code[34] = "131123"; // "B"
  234.         $this->code[35] = "131321"; // "C"
  235.         $this->code[36] = "112313"; // "D"
  236.         $this->code[37] = "132113"; // "E"
  237.         $this->code[38] = "132311"; // "F"
  238.         $this->code[39] = "211313"; // "G"
  239.         $this->code[40] = "231113"; // "H"
  240.         $this->code[41] = "231311"; // "I"
  241.         $this->code[42] = "112133"; // "J"
  242.         $this->code[43] = "112331"; // "K"
  243.         $this->code[44] = "132131"; // "L"
  244.         $this->code[45] = "113123"; // "M"
  245.         $this->code[46] = "113321"; // "N"
  246.         $this->code[47] = "133121"; // "O"
  247.         $this->code[48] = "313121"; // "P"
  248.         $this->code[49] = "211331"; // "Q"
  249.         $this->code[50] = "231131"; // "R"
  250.         $this->code[51] = "213113"; // "S"
  251.         $this->code[52] = "213311"; // "T"
  252.         $this->code[53] = "213131"; // "U"
  253.         $this->code[54] = "311123"; // "V"
  254.         $this->code[55] = "311321"; // "W"
  255.         $this->code[56] = "331121"; // "X"
  256.         $this->code[57] = "312113"; // "Y"
  257.         $this->code[58] = "312311"; // "Z"
  258.         $this->code[59] = "332111"; // "["
  259.         $this->code[60] = "314111"; // "\"
  260.         $this->code[61] = "221411"; // "]"
  261.         $this->code[62] = "431111"; // "^"
  262.         $this->code[63] = "111224"; // "_"
  263.         $this->code[64] = "111422"; // "`"
  264.         $this->code[65] = "121124"; // "a"
  265.         $this->code[66] = "121421"; // "b"
  266.         $this->code[67] = "141122"; // "c"
  267.         $this->code[68] = "141221"; // "d"
  268.         $this->code[69] = "112214"; // "e"
  269.         $this->code[70] = "112412"; // "f"
  270.         $this->code[71] = "122114"; // "g"
  271.         $this->code[72] = "122411"; // "h"
  272.         $this->code[73] = "142112"; // "i"
  273.         $this->code[74] = "142211"; // "j"
  274.         $this->code[75] = "241211"; // "k"
  275.         $this->code[76] = "221114"; // "l"
  276.         $this->code[77] = "413111"; // "m"
  277.         $this->code[78] = "241112"; // "n"
  278.         $this->code[79] = "134111"; // "o"
  279.         $this->code[80] = "111242"; // "p"
  280.         $this->code[81] = "121142"; // "q"
  281.         $this->code[82] = "121241"; // "r"
  282.         $this->code[83] = "114212"; // "s"
  283.         $this->code[84] = "124112"; // "t"
  284.         $this->code[85] = "124211"; // "u"
  285.         $this->code[86] = "411212"; // "v"
  286.         $this->code[87] = "421112"; // "w"
  287.         $this->code[88] = "421211"; // "x"
  288.         $this->code[89] = "212141"; // "y"
  289.         $this->code[90] = "214121"; // "z"
  290.         $this->code[91] = "412121"; // "{"
  291.         $this->code[92] = "111143"; // "|"
  292.         $this->code[93] = "111341"; // "}"
  293.         $this->code[94] = "131141"; // "~"
  294.         $this->code[95] = "114113"; // 95
  295.         $this->code[96] = "114311"; // 96
  296.         $this->code[97] = "411113"; // 97
  297.         $this->code[98] = "411311"; // 98
  298.         $this->code[99] = "113141"; // 99
  299.         $this->code[100] = "114131"; // 100
  300.         $this->code[101] = "311141"; // 101
  301.         $this->code[102] = "411131"; // 102
  302.     }
  303.  
  304.     /**
  305.     * Return the Code128 code for a character
  306.     */
  307.     function getCharCode($c) {
  308.         $retval = $this->code[ord($c) - 32];
  309.         return $retval;
  310.     }
  311.  
  312.     /**
  313.     * Return the Start Code for Code128
  314.     */
  315.     function getStartCode() {
  316.         return '211214';
  317.     }
  318.  
  319.     /**
  320.     * Return the Stop Code for Code128
  321.     */
  322.     function getStopCode() {
  323.         return '2331112';
  324.     }
  325.  
  326.     /**
  327.     * Return the Code128 code equivalent of a character number
  328.     */
  329.     function getNumCode($index) {
  330.         $retval = $this->code[$index];
  331.         return $retval;
  332.     }
  333.  
  334.     /**
  335.     * Return the Code128 numerical equivalent of a character.
  336.     */
  337.     function getCharNumber($c) {
  338.         $retval = ord($c) - 32;
  339.         return $retval;
  340.     }
  341.  
  342. } // class
  343. ?>