Image_Barcode2
[ class tree: Image_Barcode2 ] [ index: Image_Barcode2 ] [ all elements ]

Source for file Code128.php

Documentation is available at Code128.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */
  3.  
  4. /**
  5.  * Image_Barcode2_Driver_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_Barcode2 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 5
  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_Barcode2
  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.  * @link      http://pear.php.net/package/Image_Barcode2
  42.  */
  43.  
  44. require_once 'Image/Barcode2/Driver.php';
  45. require_once 'Image/Barcode2/Common.php';
  46. require_once 'Image/Barcode2/Exception.php';
  47.  
  48. /**
  49.  * Code128
  50.  *
  51.  * @category  Image
  52.  * @package   Image_Barcode2
  53.  * @author    Jeffrey K. Brown <jkb@darkfantastic.net>
  54.  * @copyright 2005 The PHP Group
  55.  * @license   http://www.php.net/license/3_0.txt  PHP License 3.0
  56.  * @link      http://pear.php.net/package/Image_Barcode2
  57.  */
  58.  
  59. {
  60.     /**
  61.      * Coding map
  62.      * @var array 
  63.      */
  64.     private $_codingmap = array(
  65.         0 => '212222',  // " "
  66.         1 => '222122',  // "!"
  67.         2 => '222221',  // "{QUOTE}"
  68.         3 => '121223',  // "#"
  69.         4 => '121322',  // "$"
  70.         5 => '131222',  // "%"
  71.         6 => '122213',  // "&"
  72.         7 => '122312',  // "'"
  73.         8 => '132212',  // "("
  74.         9 => '221213',  // ")"
  75.         10 => '221312'// "*"
  76.         11 => '231212'// "+"
  77.         12 => '112232'// ","
  78.         13 => '122132'// "-"
  79.         14 => '122231'// "."
  80.         15 => '113222'// "/"
  81.         16 => '123122'// "0"
  82.         17 => '123221'// "1"
  83.         18 => '223211'// "2"
  84.         19 => '221132'// "3"
  85.         20 => '221231'// "4"
  86.         21 => '213212'// "5"
  87.         22 => '223112'// "6"
  88.         23 => '312131'// "7"
  89.         24 => '311222'// "8"
  90.         25 => '321122'// "9"
  91.         26 => '321221'// ":"
  92.         27 => '312212'// ";"
  93.         28 => '322112'// "<"
  94.         29 => '322211'// "="
  95.         30 => '212123'// ">"
  96.         31 => '212321'// "?"
  97.         32 => '232121'// "@"
  98.         33 => '111323'// "A"
  99.         34 => '131123'// "B"
  100.         35 => '131321'// "C"
  101.         36 => '112313'// "D"
  102.         37 => '132113'// "E"
  103.         38 => '132311'// "F"
  104.         39 => '211313'// "G"
  105.         40 => '231113'// "H"
  106.         41 => '231311'// "I"
  107.         42 => '112133'// "J"
  108.         43 => '112331'// "K"
  109.         44 => '132131'// "L"
  110.         45 => '113123'// "M"
  111.         46 => '113321'// "N"
  112.         47 => '133121'// "O"
  113.         48 => '313121'// "P"
  114.         49 => '211331'// "Q"
  115.         50 => '231131'// "R"
  116.         51 => '213113'// "S"
  117.         52 => '213311'// "T"
  118.         53 => '213131'// "U"
  119.         54 => '311123'// "V"
  120.         55 => '311321'// "W"
  121.         56 => '331121'// "X"
  122.         57 => '312113'// "Y"
  123.         58 => '312311'// "Z"
  124.         59 => '332111'// "["
  125.         60 => '314111'// "\"
  126.         61 => '221411'// "]"
  127.         62 => '431111'// "^"
  128.         63 => '111224'// "_"
  129.         64 => '111422'// "`"
  130.         65 => '121124'// "a"
  131.         66 => '121421'// "b"
  132.         67 => '141122'// "c"
  133.         68 => '141221'// "d"
  134.         69 => '112214'// "e"
  135.         70 => '112412'// "f"
  136.         71 => '122114'// "g"
  137.         72 => '122411'// "h"
  138.         73 => '142112'// "i"
  139.         74 => '142211'// "j"
  140.         75 => '241211'// "k"
  141.         76 => '221114'// "l"
  142.         77 => '413111'// "m"
  143.         78 => '241112'// "n"
  144.         79 => '134111'// "o"
  145.         80 => '111242'// "p"
  146.         81 => '121142'// "q"
  147.         82 => '121241'// "r"
  148.         83 => '114212'// "s"
  149.         84 => '124112'// "t"
  150.         85 => '124211'// "u"
  151.         86 => '411212'// "v"
  152.         87 => '421112'// "w"
  153.         88 => '421211'// "x"
  154.         89 => '212141'// "y"
  155.         90 => '214121'// "z"
  156.         91 => '412121'// "{"
  157.         92 => '111143'// "|"
  158.         93 => '111341'// "}"
  159.         94 => '131141'// "~"
  160.         95 => '114113'// 95
  161.         96 => '114311'// 96
  162.         97 => '411113'// 97
  163.         98 => '411311'// 98
  164.         99 => '113141'// 99
  165.         100 => '114131'// 100
  166.         101 => '311141'// 101
  167.         102 => '411131'// 102
  168.     );
  169.  
  170.     /**
  171.      * Class constructor
  172.      *
  173.      * @param Image_Barcode2_Writer $writer Library to use.
  174.      */
  175.     public function __construct(Image_Barcode2_Writer $writer
  176.     {
  177.         parent::__construct($writer);
  178.         $this->setBarcodeHeight(60);
  179.         $this->setBarcodeWidth(1);
  180.     }
  181.  
  182.  
  183.     /**
  184.      * Validate barcode
  185.      *
  186.      * @return void 
  187.      * @throws Image_Barcode2_Exception
  188.      */
  189.     public function validate()
  190.     {
  191.         //
  192.     }
  193.  
  194.  
  195.     /**
  196.      * Draws a Code128 image barcode
  197.      *
  198.      * @return resource            The corresponding Code128 image barcode
  199.      *
  200.      * @access public
  201.      *
  202.      * @author Jeffrey K. Brown <jkb@darkfantastic.net>
  203.      *
  204.      * @internal
  205.      *  The draw() method is broken into three sections.  First, we take
  206.      *  the input string and convert it to a string of barcode widths.
  207.      *  Then, we size and allocate the image.  Finally, we print the bars to
  208.      *  the image along with the barcode text and display it to the beholder.
  209.      */
  210.     public function draw()
  211.     {
  212.         // We start with the Code128 Start Code character.  We
  213.         // initialize checksum to 104, rather than calculate it.
  214.         // We then add the startcode to $allbars, the main string
  215.         // containing the bar sizes for the entire code.
  216.         $startcode $this->_getStartCode();
  217.         $checksum  = 104;
  218.         $allbars   $startcode;
  219.         $text      $this->getBarcode();
  220.         $writer    $this->getWriter();
  221.         $fontsize  $this->getFontSize();
  222.  
  223.  
  224.         // Next, we read the barcode string that was passed to the
  225.         // method and for each character, we determine the bar
  226.         // pattern and add it to the end of the $allbars string.
  227.         // In addition, we continually add the character's value
  228.         // to the checksum
  229.         for ($i = 0$all strlen($text)$i $all; ++$i{
  230.             $char $text[$i];
  231.             $val $this->_getCharNumber($char);
  232.  
  233.             $checksum += ($val ($i + 1));
  234.  
  235.             $allbars .= $this->_getCharCode($char);
  236.         }
  237.  
  238.  
  239.         // Then, Take the Mod 103 of the total to get the index
  240.         // of the Code128 Check Character.  We get its bar
  241.         // pattern and add it to $allbars in the next section.
  242.         $checkdigit $checksum % 103;
  243.         $bars $this->_getNumCode($checkdigit);
  244.  
  245.  
  246.         // Finally, we get the Stop Code pattern and put the
  247.         // remaining pieces together.  We are left with the
  248.         // string $allbars containing all of the bar widths
  249.         // and can now think about writing it to the image.
  250.  
  251.         $stopcode $this->_getStopCode();
  252.         $allbars $allbars $bars $stopcode;
  253.  
  254.         //------------------------------------------------------//
  255.         // Next, we will calculate the width of the resulting
  256.         // bar code and size the image accordingly.
  257.  
  258.         // 10 Pixel "Quiet Zone" in front, and 10 Pixel
  259.         // "Quiet Zone" at the end.
  260.         $barcodewidth = 20;
  261.  
  262.  
  263.         // We will read each of the characters (1,2,3,or 4) in
  264.         // the $allbars string and add its width to the running
  265.         // total $barcodewidth.  The height of the barcode is
  266.         // calculated by taking the bar height plus the font height.
  267.  
  268.         for ($i = 0$all strlen($allbars)$i $all; ++$i{
  269.             $nval $allbars[$i];
  270.             $barcodewidth += ($nval $this->getBarcodeWidth());
  271.         }
  272.  
  273.         $barcodelongheight = (int)($writer->imagefontheight($fontsize/ 2)
  274.             + $this->getBarcodeHeight();
  275.  
  276.  
  277.         // Then, we create the image, allocate the colors, and fill
  278.         // the image with a nice, white background, ready for printing
  279.         // our black bars and the text.
  280.  
  281.         $img $writer->imagecreate(
  282.             $barcodewidth,
  283.             $barcodelongheight $writer->imagefontheight($fontsize+ 1
  284.         );
  285.         $black $writer->imagecolorallocate($img000);
  286.         $white $writer->imagecolorallocate($img255255255);
  287.         $writer->imagefill($img00$white);
  288.  
  289.  
  290.         //------------------------------------------------------//
  291.         // Finally, we write our text line centered across the
  292.         // bottom and the bar patterns and display the image.
  293.  
  294.  
  295.         // First, print the image, centered across the bottom.
  296.         if ($this->showText{
  297.             $writer->imagestring(
  298.                 $img,
  299.                 $fontsize,
  300.                 $barcodewidth / 2 - strlen($text/ 2 * ($writer->imagefontwidth($fontsize)),
  301.                 $this->getBarcodeHeight($writer->imagefontheight($fontsize/ 2,
  302.                 $text,
  303.                 $black
  304.             );
  305.         }
  306.  
  307.         // We set $xpos to 10 so we start bar printing after 
  308.         // position 10 to simulate the 10 pixel "Quiet Zone"
  309.         $xpos = 10;
  310.  
  311.         // We will now process each of the characters in the $allbars
  312.         // array.  The number in each position is read and then alternating
  313.         // black bars and spaces are drawn with the corresponding width.
  314.         $bar = 1;
  315.         for ($i = 0$all strlen($allbars)$i $all; ++$i{
  316.             $nval $allbars[$i];
  317.             $width $nval $this->getBarcodeWidth();
  318.  
  319.             if ($bar == 1{
  320.                 $writer->imagefilledrectangle(
  321.                     $img
  322.                     $xpos
  323.                     0
  324.                     $xpos $width - 1
  325.                     $barcodelongheight
  326.                     $black
  327.                 );
  328.                 $xpos += $width;
  329.                 $bar = 0;
  330.             else {
  331.                 $xpos += $width;
  332.                 $bar = 1;
  333.             }
  334.         }
  335.  
  336.         return $img;
  337.     }
  338.  
  339.  
  340.     /**
  341.      * Get the Code128 code for a character
  342.      *
  343.      * @param string $char Chacter
  344.      *
  345.      * @return string 
  346.      */
  347.     private function _getCharCode($char)
  348.     {
  349.         return $this->_codingmap[ord($char- 32];
  350.     }
  351.  
  352.  
  353.     /**
  354.      * Get the Start Code for Code128
  355.      *
  356.      * @return string 
  357.      */
  358.     private function _getStartCode()
  359.     {
  360.         return '211214';
  361.     }
  362.  
  363.  
  364.     /**
  365.      * Get the Stop Code for Code128
  366.      *
  367.      * @return string 
  368.      */
  369.     private function _getStopCode()
  370.     {
  371.         return '2331112';
  372.     }
  373.  
  374.  
  375.     /**
  376.      * Rhe Code128 code equivalent of a character number
  377.      *
  378.      * @param int $index Index
  379.      *
  380.      * @return string 
  381.      */
  382.     private function _getNumCode($index)
  383.     {
  384.         return $this->_codingmap[$index];
  385.     }
  386.  
  387.  
  388.     /**
  389.      * Get the Code128 numerical equivalent of a character.
  390.      *
  391.      * @param string $char Character
  392.      *
  393.      * @return int 
  394.      */
  395.     private function _getCharNumber($char)
  396.     {
  397.         return ord($char- 32;
  398.     }
  399.  
  400. // class

Documentation generated on Mon, 25 Feb 2013 13:00:04 +0000 by phpDocumentor 1.4.3. PEAR Logo Copyright © PHP Group 2004.