home *** CD-ROM | disk | FTP | other *** search
- <?php
- /* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */
-
- /**
- * Image_Barcode_Code39 class
- *
- * Image_Barcode_Code39 creates Code 3 of 9 ( Code39 ) barcode images. It's
- * implementation borrows heavily for the perl module GD::Barcode::Code39
- *
- * 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 Ryan Briones <ryanbriones@webxdesign.org>
- * @copyright 2005 The PHP Group
- * @license http://www.php.net/license/3_0.txt PHP License 3.0
- * @version CVS: $Id: Code39.php,v 1.4 2006/12/13 19:29:30 cweiske Exp $
- * @link http://pear.php.net/package/Image_Barcode
- */
-
-
- require_once "Image/Barcode.php";
-
-
- if (!function_exists('str_split')) {
- require_once 'PHP/Compat.php';
- PHP_Compat::loadFunction('str_split');
- }
-
- /**
- * Image_Barcode_Code39 class
- *
- * Package which provides a method to create Code39 using GD library.
- *
- * @category Image
- * @package Image_Barcode
- * @author Ryan Briones <ryanbriones@webxdesign.org>
- * @copyright 2005 The PHP Group
- * @license http://www.php.net/license/3_0.txt PHP License 3.0
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Image_Barcode
- * @since Image_Barcode 0.5
- */
- class Image_Barcode_Code39 extends Image_Barcode
- {
- /**
- * Barcode type
- * @var string
- */
- var $_type = 'Code39';
-
- /**
- * Barcode height
- *
- * @var integer
- */
- var $_barcodeheight = 50;
-
- /**
- * Bar thin width
- *
- * @var integer
- */
- var $_barthinwidth = 1;
-
- /**
- * Bar thick width
- *
- * @var integer
- */
- var $_barthickwidth = 3;
-
- /**
- * Coding map
- * @var array
- */
- var $_coding_map = array(
- '0' => '000110100',
- '1' => '100100001',
- '2' => '001100001',
- '3' => '101100000',
- '4' => '000110001',
- '5' => '100110000',
- '6' => '001110000',
- '7' => '000100101',
- '8' => '100100100',
- '9' => '001100100',
- 'A' => '100001001',
- 'B' => '001001001',
- 'C' => '101001000',
- 'D' => '000011001',
- 'E' => '100011000',
- 'F' => '001011000',
- 'G' => '000001101',
- 'H' => '100001100',
- 'I' => '001001100',
- 'J' => '000011100',
- 'K' => '100000011',
- 'L' => '001000011',
- 'M' => '101000010',
- 'N' => '000010011',
- 'O' => '100010010',
- 'P' => '001010010',
- 'Q' => '000000111',
- 'R' => '100000110',
- 'S' => '001000110',
- 'T' => '000010110',
- 'U' => '110000001',
- 'V' => '011000001',
- 'W' => '111000000',
- 'X' => '010010001',
- 'Y' => '110010000',
- 'Z' => '011010000',
- '-' => '010000101',
- '*' => '010010100',
- '+' => '010001010',
- '$' => '010101000',
- '%' => '000101010',
- '/' => '010100010',
- '.' => '110000100',
- ' ' => '011000100'
- );
-
- /**
- * Constructor
- *
- * @param string $text A text that should be in the image barcode
- * @param int $wThin Width of the thin lines on the barcode
- * @param int $wThick Width of the thick lines on the barcode
- *
- * @author Ryan Briones <ryanbriones@webxdesign.org>
- *
- */
- function Image_Barcode_Code39( $text = '', $wThin = 0, $wThick = 0 )
- {
- // Check $text for invalid characters
- if ( $this->checkInvalid( $text ) ) {
- return false;
- }
-
- $this->text = $text;
- if ( $wThin > 0 ) $this->_barthinwidth = $wThin;
- if ( $wThick > 0 ) $this->_barthickwidth = $wThick;
-
- return true;
- }
-
- /**
- * Make an image resource using the GD image library
- *
- * @param bool $noText Set to true if you'd like your barcode to be sans text
- * @param int $bHeight height of the barcode image including text
- * @return resource The Barcode Image (TM)
- *
- * @author Ryan Briones <ryanbriones@webxdesign.org>
- *
- */
- function plot($noText = false, $bHeight = 0)
- {
- // add start and stop * characters
- $final_text = '*' . $this->text . '*';
-
- if ( $bHeight > 0 ) {
- $this->_barcodeheight = $bHeight;
- }
-
- $barcode = '';
- foreach ( str_split( $final_text ) as $character ) {
- $barcode .= $this->_dumpCode( $this->_coding_map[$character] . '0' );
- }
-
- $barcode_len = strlen( $barcode );
-
- // Create GD image object
- $img = imagecreate( $barcode_len, $this->_barcodeheight );
-
- // Allocate black and white colors to the image
- $black = imagecolorallocate( $img, 0, 0, 0 );
- $white = imagecolorallocate( $img, 255, 255, 255 );
- $font_height = ( $noText ? 0 : imagefontheight( "gdFontSmall" ) );
- $font_width = imagefontwidth( "gdFontSmall" );
-
- // fill background with white color
- imagefill( $img, 0, 0, $white );
-
- // Initialize X position
- $xpos = 0;
-
- // draw barcode bars to image
- if ( $noText ) {
- foreach (str_split($barcode) as $character_code ) {
- if ($character_code == 0 ) {
- imageline($img, $xpos, 0, $xpos, $this->_barcodeheight, $white);
- } else {
- imageline($img, $xpos, 0, $xpos, $this->_barcodeheight, $black);
- }
-
- $xpos++;
- }
- } else {
- foreach (str_split($barcode) as $character_code ) {
- if ($character_code == 0) {
- imageline($img, $xpos, 0, $xpos, $this->_barcodeheight - $font_height - 1, $white);
- } else {
- imageline($img, $xpos, 0, $xpos, $this->_barcodeheight - $font_height - 1, $black);
- }
-
- $xpos++;
- }
-
- // draw text under barcode
- imagestring(
- $img,
- 'gdFontSmall',
- ( $barcode_len - $font_width * strlen( $this->text ) )/2,
- $this->_barcodeheight - $font_height,
- $this->text,
- $black
- );
- }
-
- return $img;
- }
-
- /**
- * Send image to the browser; for Image_Barcode compaitbility
- *
- * @param string $text
- * @param string $imgtype Image type; accepts jpg, png, and gif, but gif only works if you've payed for licensing
- * @param bool $noText Set to true if you'd like your barcode to be sans text
- * @param int $bHeight height of the barcode image including text
- * @return gd_image GD image object
- *
- * @author Ryan Briones <ryanbriones@webxdesign.org>
- *
- */
- function &draw($text, $imgtype = 'png', $noText = false, $bHeight = 0)
- {
- // Check $text for invalid characters
- if ($this->checkInvalid($text)) {
- return PEAR::raiseError('Invalid text');
- }
-
- $this->text = $text;
- $img = &$this->plot($noText, $bHeight);
-
- return $img;
- }
-
- /**
- * _dumpCode is a PHP implementation of dumpCode from the Perl module
- * GD::Barcode::Code39. I royally screwed up when trying to do the thing
- * my own way the first time. This way works.
- *
- * @param string $code Code39 barcode code
- * @return string $result barcode line code
- *
- * @access private
- *
- * @author Ryan Briones <ryanbriones@webxdesign.org>
- *
- *
- */
- function _dumpCode($code)
- {
- $result = '';
- $color = 1; // 1: Black, 0: White
-
- // if $bit is 1, line is wide; if $bit is 0 line is thin
- foreach ( str_split( $code ) as $bit ) {
- $result .= ( ( $bit == 1 ) ? str_repeat( "$color", $this->_barthickwidth ) : str_repeat( "$color", $this->_barthinwidth ) );
- $color = ( ( $color == 0 ) ? 1 : 0 );
- }
-
- return $result;
- }
-
- /**
- * Check for invalid characters
- *
- * @param string $text text to be ckecked
- * @return bool returns true when invalid characters have been found
- *
- * @author Ryan Briones <ryanbriones@webxdesign.org>
- *
- */
- function checkInvalid($text)
- {
- return preg_match( "/[^0-9A-Z\-*+\$%\/. ]/", $text );
- }
- }
- ?>