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

Source for file Code39.php

Documentation is available at Code39.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */
  3.  
  4. /**
  5.  * Image_Barcode2_Driver_Code39 class
  6.  *
  7.  * Image_Barcode2_Code39 creates Code 3 of 9 ( Code39 ) barcode images.
  8.  * It's implementation borrows heavily for the perl module GD::Barcode::Code39
  9.  *
  10.  * PHP versions 5
  11.  *
  12.  * LICENSE: This source file is subject to version 3.0 of the PHP license
  13.  * that is available through the world-wide-web at the following URI:
  14.  * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
  15.  * the PHP License and are unable to obtain it through the web, please
  16.  * send a note to license@php.net so we can mail you a copy immediately.
  17.  *
  18.  * @category  Image
  19.  * @package   Image_Barcode2
  20.  * @author    Ryan Briones <ryanbriones@webxdesign.org>
  21.  * @copyright 2005 The PHP Group
  22.  * @license   http://www.php.net/license/3_0.txt  PHP License 3.0
  23.  * @link      http://pear.php.net/package/Image_Barcode2
  24.  */
  25.  
  26. require_once 'Image/Barcode2/Driver.php';
  27. require_once 'Image/Barcode2/Common.php';
  28. require_once 'Image/Barcode2/DualWidth.php';
  29. require_once 'Image/Barcode2/Exception.php';
  30.  
  31. /**
  32.  * Code 3 of 9
  33.  *
  34.  * Package which provides a method to create Code 3 of 9 using GD library.
  35.  *
  36.  * @category  Image
  37.  * @package   Image_Barcode2
  38.  * @author    Ryan Briones <ryanbriones@webxdesign.org>
  39.  * @copyright 2005 The PHP Group
  40.  * @license   http://www.php.net/license/3_0.txt  PHP License 3.0
  41.  * @version   Release: @package_version@
  42.  * @link      http://pear.php.net/package/Image_Barcode2
  43.  * @since     Image_Barcode2 0.5
  44.  */
  45. {
  46.     /**
  47.      * Coding map
  48.      * @var array 
  49.      */
  50.     private $_codingmap = array(
  51.         '0' => '000110100',
  52.         '1' => '100100001',
  53.         '2' => '001100001',
  54.         '3' => '101100000',
  55.         '4' => '000110001',
  56.         '5' => '100110000',
  57.         '6' => '001110000',
  58.         '7' => '000100101',
  59.         '8' => '100100100',
  60.         '9' => '001100100',
  61.         'A' => '100001001',
  62.         'B' => '001001001',
  63.         'C' => '101001000',
  64.         'D' => '000011001',
  65.         'E' => '100011000',
  66.         'F' => '001011000',
  67.         'G' => '000001101',
  68.         'H' => '100001100',
  69.         'I' => '001001100',
  70.         'J' => '000011100',
  71.         'K' => '100000011',
  72.         'L' => '001000011',
  73.         'M' => '101000010',
  74.         'N' => '000010011',
  75.         'O' => '100010010',
  76.         'P' => '001010010',
  77.         'Q' => '000000111',
  78.         'R' => '100000110',
  79.         'S' => '001000110',
  80.         'T' => '000010110',
  81.         'U' => '110000001',
  82.         'V' => '011000001',
  83.         'W' => '111000000',
  84.         'X' => '010010001',
  85.         'Y' => '110010000',
  86.         'Z' => '011010000',
  87.         '-' => '010000101',
  88.         '*' => '010010100',
  89.         '+' => '010001010',
  90.         '$' => '010101000',
  91.         '%' => '000101010',
  92.         '/' => '010100010',
  93.         '.' => '110000100',
  94.         ' ' => '011000100'
  95.     );
  96.  
  97.     /**
  98.      * Class constructor
  99.      *
  100.      * @param Image_Barcode2_Writer $writer Library to use.
  101.      */
  102.     public function __construct(Image_Barcode2_Writer $writer
  103.     {
  104.         parent::__construct($writer);
  105.         $this->setBarcodeHeight(50);
  106.         $this->setBarcodeWidthThin(1);
  107.         $this->setBarcodeWidthThick(3);
  108.     }
  109.  
  110.  
  111.     /**
  112.      * Validate barcode
  113.      *
  114.      * @return void 
  115.      * @throws Image_Barcode2_Exception
  116.      */
  117.     public function validate()
  118.     {
  119.         // Check barcode for invalid characters
  120.         if (preg_match("/[^0-9A-Z\-*+\$%\/. ]/"$this->getBarcode())) {
  121.             throw new Image_Barcode2_Exception('Invalid barcode');
  122.         }
  123.     }
  124.  
  125.  
  126.     /**
  127.      * Make an image resource using the GD image library
  128.      *
  129.      * @return resource           The Barcode Image (TM)
  130.      *
  131.      * @author Ryan Briones <ryanbriones@webxdesign.org>
  132.      */
  133.     public function draw()
  134.     {
  135.         $text     $this->getBarcode();
  136.         $writer   $this->getWriter();
  137.         $fontsize $this->getFontSize();
  138.  
  139.         // add start and stop * characters
  140.         $final_text '*' $text '*';
  141.  
  142.         $barcode '';
  143.         foreach (str_split($final_textas $character{
  144.             $barcode .= $this->_dumpCode($this->_codingmap[$character'0');
  145.         }
  146.  
  147.         $barcode_len strlen($barcode);
  148.  
  149.         // Create GD image object
  150.         $img $writer->imagecreate($barcode_len$this->getBarcodeHeight());
  151.  
  152.         // Allocate black and white colors to the image
  153.         $black $writer->imagecolorallocate($img000);
  154.         $white $writer->imagecolorallocate($img255255255);
  155.         $font_height $writer->imagefontheight($fontsize);
  156.         $font_width $writer->imagefontwidth($fontsize);
  157.  
  158.         // fill background with white color
  159.         $writer->imagefill($img00$white);
  160.  
  161.         // Initialize X position
  162.         $xpos = 0;
  163.  
  164.         // draw barcode bars to image
  165.         foreach (str_split($barcodeas $character_code{
  166.             if ($character_code == 0{
  167.                 $writer->imageline(
  168.                     $img
  169.                     $xpos
  170.                     0
  171.                     $xpos
  172.                     $this->getBarcodeHeight($font_height - 1
  173.                     $white
  174.                 );
  175.             else {
  176.                 $writer->imageline(
  177.                     $img
  178.                     $xpos
  179.                     0
  180.                     $xpos
  181.                     $this->getBarcodeHeight($font_height - 1
  182.                     $black
  183.                 );
  184.             }
  185.  
  186.             $xpos++;
  187.         }
  188.  
  189.         // draw text under barcode
  190.         if ($this->showText{
  191.             $writer->imagestring(
  192.                 $img,
  193.                 $fontsize,
  194.                 ($barcode_len $font_width strlen($text)) / 2,
  195.                 $this->getBarcodeHeight($font_height,
  196.                 $text,
  197.                 $black
  198.             );
  199.         }
  200.  
  201.  
  202.         return $img;
  203.     }
  204.  
  205.  
  206.     /**
  207.      * _dumpCode is a PHP implementation of dumpCode from the Perl module
  208.      * GD::Barcode::Code39. I royally screwed up when trying to do the thing
  209.      * my own way the first time. This way works.
  210.      *
  211.      * @param string $code Code39 barcode code
  212.      *
  213.      * @return string $result      barcode line code
  214.      * @access private
  215.      * @author Ryan Briones <ryanbriones@webxdesign.org>
  216.      */
  217.     private function _dumpCode($code)
  218.     {
  219.         $result '';
  220.         $color = 1; // 1: Black, 0: White
  221.  
  222.         // if $bit is 1, line is wide; if $bit is 0 line is thin
  223.         foreach (str_split($codeas $bit{
  224.             if ($bit == 1{
  225.                 $result .= str_repeat($color$this->getBarcodeWidthThick());
  226.             else {
  227.                 $result .= str_repeat($color$this->getBarcodeWidthThin());
  228.             }
  229.  
  230.             $color ($color == 0? 1 : 0;
  231.         }
  232.  
  233.         return $result;
  234.     }
  235. }

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