Browse files

Adding UPC-E image

  • Loading branch information...
1 parent 3b61423 commit 863c68acbe4493988c3894b8f260ea4a9d844765 @justechn justechn committed Apr 24, 2012
Showing with 331 additions and 12 deletions.
  1. +2 −0 Image/Barcode2.php
  2. +322 −0 Image/Barcode2/Driver/Upce.php
  3. +7 −12 docs/examples/test-image-barcode.php
View
2 Image/Barcode2.php
@@ -55,6 +55,7 @@ class Image_Barcode2
const BARCODE_INT25 = 'int25';
const BARCODE_EAN13 = 'ean13';
const BARCODE_UPCA = 'upca';
+ const BARCODE_UPCE = 'upce';
const BARCODE_CODE128 = 'code128';
const BARCODE_EAN8 = 'ean8';
const BARCODE_POSTNET = 'postnet';
@@ -69,6 +70,7 @@ class Image_Barcode2
* int25 - 2 Interleaved 5
* ean13 - EAN 13
* upca - UPC-A
+ * upce - UPC-E
* code128
* ean8
* postnet
View
322 Image/Barcode2/Driver/Upce.php
@@ -0,0 +1,322 @@
+<?php
+/* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */
+
+/**
+ * Image_Barcode2_Driver_Upce class
+ *
+ * Renders UPC-E barcodes
+ *
+ * PHP versions 5
+ *
+ * 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_Barcode2
+ * @author Ryan McLaughlin <ryanmclaughlin@gmail.com>
+ * @copyright 2012 The PHP Group
+ * @license http://www.php.net/license/3_0.txt PHP License 3.0
+ * @link http://pear.php.net/package/Image_Barcode2
+ */
+
+require_once 'Image/Barcode2/Driver.php';
+require_once 'Image/Barcode2/Common.php';
+require_once 'Image/Barcode2/Exception.php';
+
+/**
+ * UPC-E
+ *
+ * Package which provides a method to create UPC-A barcode using GD library.
+ *
+ * Slightly Modified Upca.php to get Upce.php I needed a way to print
+ * UPC-E bar codes on a PHP page. The Image_Barcode2 class seemed like
+ * the best way to do it, so I modified UPC-A to print in the UPC-E format.
+ * Checked the bar code tables against some documentation below (no errors)
+ * and validated the changes with my phone app "Barcode Scanner"
+ *
+ * @category Image
+ * @package Image_Barcode2
+ * @author Ryan McLaughlin <ryanmclaughlin@gmail.com>
+ * @copyright 2012 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_Barcode2
+ */
+class Image_Barcode2_Driver_Upce extends Image_Barcode2_Common implements Image_Barcode2_Driver
+{
+ /**
+ * Coding map
+ * @var array
+ */
+ var $_paritypattern = array(
+ '0' => array(1,1,1,0,0,0),
+ '1' => array(1,1,0,1,0,0),
+ '2' => array(1,1,0,0,1,0),
+ '3' => array(1,1,0,0,0,1),
+ '4' => array(1,0,1,1,0,0),
+ '5' => array(1,0,0,1,1,0),
+ '6' => array(1,0,0,0,1,1),
+ '7' => array(1,0,1,0,1,0),
+ '8' => array(1,0,1,0,0,1),
+ '9' => array(1,0,0,1,0,1)
+ );
+
+ var $_codingmap = array(
+ '0' => array(
+ 'O' => array(0,0,0,1,1,0,1),
+ 'E' => array(0,1,0,0,1,1,1)
+ ),
+ '1' => array(
+ 'O' => array(0,0,1,1,0,0,1),
+ 'E' => array(0,1,1,0,0,1,1)
+ ),
+ '2' => array(
+ 'O' => array(0,0,1,0,0,1,1),
+ 'E' => array(0,0,1,1,0,1,1)
+ ),
+ '3' => array(
+ 'O' => array(0,1,1,1,1,0,1),
+ 'E' => array(0,1,0,0,0,0,1)
+ ),
+ '4' => array(
+ 'O' => array(0,1,0,0,0,1,1),
+ 'E' => array(0,0,1,1,1,0,1)
+ ),
+ '5' => array(
+ 'O' => array(0,1,1,0,0,0,1),
+ 'E' => array(0,1,1,1,0,0,1)
+ ),
+ '6' => array(
+ 'O' => array(0,1,0,1,1,1,1),
+ 'E' => array(0,0,0,0,1,0,1)
+ ),
+ '7' => array(
+ 'O' => array(0,1,1,1,0,1,1),
+ 'E' => array(0,0,1,0,0,0,1)
+ ),
+ '8' => array(
+ 'O' => array(0,1,1,0,1,1,1),
+ 'E' => array(0,0,0,1,0,0,1)
+ ),
+ '9' => array(
+ 'O' => array(0,0,0,1,0,1,1),
+ 'E' => array(0,0,1,0,1,1,1)
+ )
+ );
+
+ /**
+ * Class constructor
+ *
+ * @param Image_Barcode2_Writer $writer Library to use.
+ */
+ public function __construct(Image_Barcode2_Writer $writer)
+ {
+ parent::__construct($writer);
+ $this->setBarcodeHeight(50);
+ $this->setBarcodeWidth(1);
+ }
+
+
+ /**
+ * Validate barcode
+ *
+ * @return void
+ * @throws Image_Barcode2_Exception
+ */
+ public function validate()
+ {
+ // Check barcode for invalid characters
+ if (!preg_match('/^[0-9]{8}$/', $this->getBarcode())) {
+ throw new Image_Barcode2_Exception('Invalid barcode');
+ }
+ }
+
+
+ /**
+ * Draws a UPC-E image barcode
+ *
+ * @return resource The corresponding UPC-E image barcode
+ *
+ * @author Ryan McLaughlin <ryanmclaughlin@gmail.com>
+ */
+ public function draw()
+ {
+ $text = $this->getBarcode();
+ $writer = $this->getWriter();
+ $fontsize = $this->getFontSize();
+
+ // Calculate the barcode width
+ $barcodewidth = (strlen($text)) * (7 * $this->getBarcodeWidth())
+ + $writer->imagefontwidth($fontsize)
+ + $writer->imagefontwidth($fontsize) // check digit padding
+ ;
+
+
+ $barcodelongheight = (int)($writer->imagefontheight($fontsize) / 2)
+ + $this->getBarcodeHeight();
+
+ // Create the image
+ $img = $writer->imagecreate(
+ $barcodewidth,
+ $barcodelongheight + $writer->imagefontheight($fontsize) + 1
+ );
+
+ // Alocate the black and white colors
+ $black = $writer->imagecolorallocate($img, 0, 0, 0);
+ $white = $writer->imagecolorallocate($img, 255, 255, 255);
+
+ // Fill image with white color
+ $writer->imagefill($img, 0, 0, $white);
+
+ // get the first digit which is the key for creating the first 6 bars
+ $key = substr($text, 0, 1);
+
+ // Initiate x position
+ $xpos = 0;
+
+ // print first digit
+ $writer->imagestring(
+ $img,
+ $fontsize,
+ $xpos,
+ $this->getBarcodeHeight(),
+ $key,
+ $black
+ );
+ $xpos = $writer->imagefontwidth($fontsize) + 1;
+
+
+ // Draws the left guard pattern (bar-space-bar)
+ // bar
+ $writer->imagefilledrectangle(
+ $img,
+ $xpos,
+ 0,
+ $xpos + $this->getBarcodeWidth() - 1,
+ $barcodelongheight,
+ $black
+ );
+
+ $xpos += $this->getBarcodeWidth();
+ // space
+ $xpos += $this->getBarcodeWidth();
+ // bar
+ $writer->imagefilledrectangle(
+ $img,
+ $xpos,
+ 0,
+ $xpos + $this->getBarcodeWidth() - 1,
+ $barcodelongheight,
+ $black
+ );
+
+ $xpos += $this->getBarcodeWidth();
+
+
+ // Draw middle $text contents
+ $checkdigit = substr($text, 7, 1);
+ for ($idx = 1; $idx < 7; $idx ++) {
+ $value = substr($text, $idx, 1);
+ $writer->imagestring(
+ $img,
+ $fontsize,
+ $xpos + 1,
+ $this->getBarcodeHeight(),
+ $value,
+ $black
+ );
+
+ if ($this->_paritypattern[$checkdigit][$idx-1] == 1) {
+ foreach ($this->_codingmap[$value]['E'] as $bar) {
+ if ($bar) {
+ $writer->imagefilledrectangle(
+ $img,
+ $xpos,
+ 0,
+ $xpos + $this->getBarcodeWidth() - 1,
+ $this->getBarcodeHeight(),
+ $black
+ );
+ }
+ $xpos += $this->getBarcodeWidth();
+ }
+ }
+ else {
+ foreach ($this->_codingmap[$value]['O'] as $bar) {
+ if ($bar) {
+ $writer->imagefilledrectangle(
+ $img,
+ $xpos,
+ 0,
+ $xpos + $this->getBarcodeWidth() - 1,
+ $this->getBarcodeHeight(),
+ $black
+ );
+ }
+ $xpos += $this->getBarcodeWidth();
+ }
+ }
+ }
+
+ // space
+ $xpos += $this->getBarcodeWidth();
+
+ // Draws the right guard pattern (bar-space-bar-space-bar)
+ // bar
+ $writer->imagefilledrectangle(
+ $img,
+ $xpos,
+ 0,
+ $xpos + $this->getBarcodeWidth() - 1,
+ $barcodelongheight,
+ $black
+ );
+
+ $xpos += $this->getBarcodeWidth();
+ // space
+ $xpos += $this->getBarcodeWidth();
+ // bar
+ $writer->imagefilledrectangle(
+ $img,
+ $xpos,
+ 0,
+ $xpos + $this->getBarcodeWidth() - 1,
+ $barcodelongheight,
+ $black
+ );
+
+ $xpos += $this->getBarcodeWidth();
+ // space
+ $xpos += $this->getBarcodeWidth();
+ // bar
+ $writer->imagefilledrectangle(
+ $img,
+ $xpos,
+ 0,
+ $xpos + $this->getBarcodeWidth() - 1,
+ $barcodelongheight,
+ $black
+ );
+
+ $xpos += $this->getBarcodeWidth();
+
+
+ // Print Check Digit
+ $writer->imagestring(
+ $img,
+ $fontsize,
+ $xpos + 1,
+ $this->getBarcodeHeight(),
+ $checkdigit,
+ $black
+ );
+
+ return $img;
+ }
+
+} // class
+
+?>
View
19 docs/examples/test-image-barcode.php
@@ -69,23 +69,18 @@
<div class="test">
<h2>UPC-A (png):</h2>
<img
- src="barcode_img.php?num=123456789123&type=upca&imgtype=png"
- alt="PNG: 123456789123" title="PNG: 123456789123"/>
+ src="barcode_img.php?num=123456789128&type=upca&imgtype=png"
+ alt="PNG: 123456789128" title="PNG: 123456789128"/>
</div>
<div class="test">
-<h2>Code128 (png):</h2>
+<h2>UPC-E (png):</h2>
<img
- src="barcode_img.php?num=barcode&type=code128&imgtype=png"
- alt="PNG: barcode" title="PNG: barcode"/>
+ src="barcode_img.php?num=01507113&type=upce&imgtype=png"
+ alt="PNG: 12345678" title="PNG: 12345678"/>
</div>
<div class="test">
-<h2>PostNet (png):</h2>
+<h2>Code128 (png):</h2>
<img
- src="barcode_img.php?num=202609900&type=postnet&imgtype=png"
- alt="PNG: 202609900" title="PNG: 202609900"/>
-</div>
-
-</body>
-</html>
+ src="bar

0 comments on commit 863c68a

Please sign in to comment.