martes, 20 de agosto de 2013

Generación de códigos de barras con CodeIgniter

Recientemente tuve la necesidad de generar códigos de barra, como el de la figura 1. En este artículo comentaré la solución que pude darle a este problema.

clip_image001

Fig. 1 Un código de barra alfanumérico de tipo code39.

Los códigos de barra son un tipo de tecnología para identificación automática y colección de datos (en inglés Automatic Identification and Data Collection, AIDC), estructurados para contener información específica de un producto en forma de barras y espacios. Permiten reducir la intervención humana en la entrada y colección de datos, reduciendo así los errores y el tiempo de trabajo.

Puedes encontrar un artículo muy completo al respecto en [1], donde por ejemplo explican que puede haber códigos de barra unidimensionales (1D) como en la figura 1 y bidimensionales (2D) como en la figura 2. En este artículo proponen además una biblioteca para la generación de códigos de barra.

clip_image002

Fig. 2 Código de barras bidimensional (2D).

En el sitio [2] puedes ver algunos tipos y estándares de códigos de barra, clasificados en sólo-numéricos, alfanuméricos (que contienen números y letras) y bidimensionales. Muchas bibliotecas libres en internet para la generación de códigos de barras, con PHP u otros lenguajes, dan soporte a varios de estos estándares. Es algo que debes tener en cuenta para seleccionar una para trabajar, considerando qué estándar usa tu cliente, después de todo el código que generes seguramente se va a imprimir y a pegar en algún objeto como su identificador o su precio, para luego ser leído con un escáner-pistola que trae implementado determinados estándares por hardware, así que debemos conocer para qué equipos se está trabajando.

Bueno, mi primera opción para implementar mi generador de códigos de barra, fue incluir en mi CodeIgniter (CI) la biblioteca Zend Framework (ZF), pero esto me trajo algunos inconvenientes que realmente no pude resolver en el poco tiempo que tenía para esta tarea. En muchos foros incluso no encontré soluciones claras a lo que me pasaba, probablemente se deba a una incompatibilidad de versiones ZF-CI.

Zend Framework trae consigo muchas funcionalidades, no solamente la de generar códigos de barra, aunque se puede utilizar (copiar hacia application/libraries) solamente las carpetas necesarias para lograr esto. En [3] puedes encontrar un tutorial muy completo de la creación de códigos de barra con ZF (independiente, sin CodeIgniter).

El ZF lo puedes descargar aquí [4], en algunos foros algunos recomiendan la versión 1 para el tema de los códigos de barra. Para acoplar el ZF al CI, básicamente copias la carpeta Zend dentro de application/libraries, y en esta misma carpeta libraries debes crear un fichero (zend.php) cuyo contenido varía según los tutoriales pero básicamente hace lo mismo. Puedes ver ejemplos de tutoriales en [5] , [6] y [7] y puedes descargar un fichero zend.php en [8], que es un link que brinda el tutorial [6].

Cuando haces esta instalación probablemente tengas errores como que no aparece la clase “Zend_Barcode” (Fatal error: Class 'Zend_Barcode' not found o Non-existent class: Barcode). En el fuente del ZF 2.2.2 que fue el que descargué, la clase se llama “Barcode”, al cambiar el nombre en la llamada a la clase también da error. Puedes ver foros relacionados en [9] y [10], en este último usan el Factory de ZF, ya que no se puede instanciar directamente la clase Barcode, pero esto me genera el error Fatal error: Class 'Zend\Barcode\ObjectPluginManager' not found (ver [11]). Muchos de estos errores no están respondidos y al resolver algunos se me generaban otros. Siendo nula mi experiencia con ZF decidí buscar variantes más sencillas.

Finalmente opté por la biblioteca brindada en PHPClasses [12], bajo licencia GPL. Esta clase permite generar códigos de barras en imágenes y ficheros PDF, usando las bibliotecas GD (toma un recurso de imagen de GD y renderea un código de barras en ella) y la FPDF. En la versión 2.0.1 de septiembre del 2010 que puedes descargar en [12], se da soporte a los formatos codabar, code 11, code 39, code 93, code 128, ean 8, ean 13, standard 2 of 5, interleaved 2 of 5, msi y datamatrix.

El compactado descargado trae tres ficheros: la biblioteca en Barcode.php y dos ejemplos: sample-gd.php y sample-fpdf.php, para GD y PDF respectivamente. El fichero Barcode.php lo pones en application/libraries, y como siempre recomiendo, puedes hacer una clase que actúe como interfaz entre tu aplicación y esta biblioteca.

Usando el ejemplo sample-gd.php creé la clase Barcode_manager dentro de un fichero barcode_manager.php que puse también en application/libraries.

En el constructor de mi clase cargo la biblioteca load->library('barcode'), y adicioné una función create_barcode que recibe la cadena alfanumérica para codificar, la posición donde se ubicará el centro de la imagen, las dimensiones de la imagen y el alto y ancho de las barras. Internamente especifiqué el tipo 'code39' y el ángulo 0 para la imagen para que salga en posición horizontal:

function create_barcode($code, $center_x, $center_y, $width, $height, $bars_width, $bars_height);

El contenido de esta función es básicamente el mismo de sample-gd.php.

Finalmente, desde mis controladores ejecuto la siguiente secuencia de código:


$this->load->library('barcode_manager');

$code = $this->obtener_codigo_desde_bd(id_del_producto);

$center_x = 220;

$center_y = 50;

$height = 100;

$width = 440;

$bars_height = 50;

$bars_width = 2;

$this->barcode_manager->create_barcode($code, $center_x, $center_y, $width, $height, $bars_width, $bars_height);

El código de barras lo genero a partir de un código alfanumérico que mantengo en la base de datos para cada producto, que a su vez generé con uniqid() en el momento de la inserción. Así, genero la imagen del código de barras en cualquier momento a partir del código alfanumérico del producto y no necesito guardar las imágenes de las barras en el servidor.


Bueno, te he ejemplificado el uso de una de las tantas bibliotecas que existen para el propósito de generar códigos de barras con PHP. Cualquiera de ellas que uses recuerda tener en cuenta el estándar de bar_code que usa el cliente, y haz una clase interfaz que te permita adaptar la biblioteca que estés usando a las características de tu producto.


Referencias:

[1] Generating barcode using php:

http://bmpradeep.wordpress.com/2013/01/29/generating-barcode-using-php/

[2] Different Types of Barcodes:

http://www.mecsw.com/specs/speclist.html

[3] Barcode creation using Zend\Barcode\Barcode class

http://framework.zend.com/manual/2.0/en/modules/zend.barcode.creation.html

[4] Descarga del Zend Framework:

http://framework.zend.com/downloads/archives

http://framework.zend.com/downloads/latest#ZF1

[5] Coupling Zend Framework with CodeIgniter.htm

http://www.masnun.com/2010/06/16/coupling-zend-framework-with-codeigniter.html

[6] Zend Barcodes in CodeIgniter:

http://ghostbilt.com/blog/zend-barcodes-codeigniter/

[7] How to generate barcode image in Codeigniter

http://pastebin.com/jXD1hJN5

[8] Descarga del zend.php:

http://ghostbilt.com/wp-content/resources/Zend.phps

[9] Integrate Zend Framework Barcode Library2 in Codeigniter 2.1.3

http://ellislab.com/forums/viewthread/235473/

[10] Codeigniter + zend barcode class

http://stackoverflow.com/questions/13243656/codeigniter-zend-barcode-class

[11] Codeigniter 2.1.3 Zend Framework 2.2 barcode use

http://stackoverflow.com/questions/16863832/codeigniter-2-1-3-zend-framework-2-2-barcode-use

[12] DEMONTE, Jean-Baptist: Barcode PHP, Generate barcode in GD and PDF

http://www.phpclasses.org/browse/package/6520.html?download=zip

[13] How To Create Barcodes in PHP

http://davidscotttufts.com/2009/03/31/how-to-create-barcodes-in-php/


¿Te ha gustado este Post? Compártelo con tus amigos.

No hay comentarios:

Publicar un comentario

IconIconIcon