26 de Febrero de 2017
Mar
3

Crear códigos de barras con iTextSharp desde .NET

Categorías: 

Debido al éxito de la anterior entrega (Crear y leer códigos QR desde VB.NET) he decidido publicar este tutorial antes de lo previsto.

Hoy os mostraré como generar los siguientes códigos de barras gracias a la librería iTextSharp y unas pequeñas modificaciones:

El código generado se guarda en un objeto de tipo Bitmap y podrás hacer con él lo que quieras: guardarlo, procesarlo, imprimirlo, usarlo en Crystal Reports,... lo que quieras.

iTextSharp es un port libre y gratuito al .NET Framework de la librería iText para Java.

Originalmente tanto iTextSharp como iText eran librerías para manejar documentos PDF. Sin embargo se han ido añadiendo funcionalidades, entre las cuales está la generación de un porrón de tipos de códigos de barras.

Nota: Hay otra caracteristica muy interesante que veremos en otros tutoriales y es la posibilidad de firmar digitalmente un documento PDF con un certificado emitido por una CA como puede ser VeriSign, la Fábrica Nacional de Moneda y Timbre o incluso mediante el e-DNI.
Cuando se firma digitalmente un documento se asegura que éste es original y que no ha sido modificado. La firma digital es "tremendamente fuerte" y no podrías romperla ni en un trillón de años. Por algo se usa en organismos oficiales tales como Hacienda, departamentos de justicia, militares, transferencias bancarias, etc.

Pero vamos, que me estoy enrollando y eso lo dejaremos para otro día :)

Bueno, al lío.

Como ya hemos dicho iTextSharp está pensada para trabjar con documentos PDF. Esto supone un "pequeño" inconveniente, ya que habrá caracterísiticas que tendremos que hacer a "mano" si lo que queremos es tener un objeto Bitmap (System.Drawing.Bitmap).
La principal es la de mostrar el propio código debajo del código de barras.
También necesitaremos modificar ligeramente el código de barras para los códigos tipo EAN13 como ya veréis más adelante.
Por último también se ha implementado la propiedad de "escalar" los códigos PDF417 y Data matrix para hacerlos más grandes.

Para ello hemos creado una clase llamada BarCode que realizará todas estas tareas de forma transparente

Nota: Los distintos tipos de códigos de barras tienen una serie de reglas y/o limitaciones. Así por ejemplo, los códigos de tipo codabar tienen que empezar por A,B,C o E, no contener letras y terminar por A,B,C o E.
Los códigos EAN13 tiene que tener 12 o 13 números y no pueden contener letras, los Code39 tampoco pueden tener letras, etc. 

A continuación mostraremos unos cuantos ejemplos del resultado de este tutorial.

Codabar 

La llamada es algo como esto:

Dim bm As Bitmap = BarCode.CodeCodABAR("A123456789012+B",True,50)

El primer parámertro es el código que queremos generar, el segundo parámetro indica que se va a visualizar el código debajo "de las barras" y el último indica la altura de las barras.
Podéis observar que en la representación del código no se incluye el primer carácter "A" ni el último "B" ya que estos son internos para construir el código.

EAN13

Para el código EAN13 (European Article Number 13) tenemos dos funciones:

  • BarCode.CodeEAN13("5901234123457", True, 60)
  • BarCode.CodeEAN13AutoGenerateChecksum("590123412345", True, 60)

Los códigos EAN13 tienen un total de 13 dígitos (y solo dígitos, no letras)

Para el código:

5901234123457

El 7 representa que el el checksum de los 12 primeros dígitos.
La función CodeEAN13 representará un código de 13 cifras, sin comprobar el checksum. Lo que se le envía es lo que se genera.
Sin embargo a la función CodeEAN13AutoGenerateChecksum se le pasarán 12 dígitos. La función calcula el checksum correcto y lo incluye en el código.

En los códigos EAN13 también podéis observar que el código tiene barras más largas que otras y que hay como dos zonas. De todo esto ya se encarga la clase BarCode.

Code39  

La llamada es algo así:

Dim bm As Bitmap = BarCode.Code39("12345678901234567890", True)

Al Code 39 internamente ya se añaden los carácteres "*" (asterisco) tanto al principio como al final

Como podéis observar, el parámetro de la altura es opcional y en este caso no se ha usado

Code128   

El Code 128 admite tanto letras como números. En esta demo se han incluído 3 tipos de code 128.

La llamada es similar que en los casos anteriores:

bm = BarCode.Code128("hola", iType, True, 50)

Donde iType representa uno de los 3 tipos de code 128

PDF417    

En este caso nos encontramos con un código "2D" donde se puede almacenar gran cantidad de información (algo parecido a los QR Codes que vimos en la entrega anterior)

La llamada es así:

Dim bm As Bitmap = BarCode.PDF417("Hola mundo")

Si queremos "escalar" el tamaño cuatro veces del generado por la librería iTextSharp:

Dim bm As Bitmap = BarCode.PDF417("Hola mundo", 4

Data matrix

Aquí también nos encontramos con un código "2D".

La llamada es así:

Dim bm As Bitmap = BarCode.DataMatrix("Hola mundo")

Si usamos un escalado como por ejemplo:

Dim bm As Bitmap = BarCode.DataMatrix("Hola mundo", 4

Obtenemos lo siguiente:


Por  último algunos links interesantes:

Generador online de diversos códigos 1-D: http://www.bcgen.com/linear-barcode-creator.html

Generador online de PDF417: http://www.bcgen.com/pdf417-barcode-creator.html

Generador online de Data matrix: http://www.bcgen.com/datamatrix-barcode-creator.html

Decodificador online de Data matrix: http://www.2dtg.com/decode.html

Decodificador online de PDF417: http://www.turbulence.org/Works/swipe/barcode_app.html

 


 

 

Saludos.
mov eax,ollydbg; Int 13h 

 

Descargar código fuente del iTextSharpCodigosBarras
(25 KB. Visual Studio 2008)



Ollydbg ProSignature

0

17 Comentarios:

Estas lineas son para

Estas lineas son para agradecerte este estupendo articulo. Me ha servido de mucho. Saludos.

Hola muchas muchisimas

Hola muchas muchisimas gracias por el conocimiento que compartes con todos nosotros

Se agradece

Muy agradecido porque hayas compartido esto. ¿Sabes si se puede decodificar las barras con esta librería?

Hola Nahuel Hasta donde

Hola Nahuel

Hasta donde yo sé con la librería iTextSharp (con la original iText en java tampoco) no es posible descodificar los códigos de barras.

Lo único que se me ocurre es que debajo del código de barras imprimas el código numérico que corresponda con el código de barras y después uses la librería para encontrar dicho código numérico.

De todos modos, ¿Para que quieres descodificar por software un código de barras?.

Se supone que en tú software imprimes el código de barras, y luego usas "un lector de código de barras". El lector de código de barras estará conectado al PC mediante un cable USB/Serial/emul.Teclado/etc.

Será el propio lector el que te devuelva un "string" con el valor de código de barras. A priori no deberás preocuparte de "descodificar" el código, ya que esta "descodificación" ya la hace el lector de código de barras. 

 

Saludos.
mov eax,ollydbg; Int 13h  

Felicitaciones, este

Felicitaciones, este tutorial me ha encantado, una pregunta: ¿es posible guardar el resultado de la codificacion en una base de datos de sql[2008] para luego imprimirlo con crystal reports desde VB 2010, cual seria el metodo?

Crystal Reports y código de barras

Ante todo gracias por las felicitaciones ;)

Lo que comentas  es perfectamente posible hacerlo desde el Crystal Reports 13 incluido en el VS2010.

En versiones anteriores (por ejemplo el Crystal Reports 10.5 del Visual Studio 2008) no era posible, o por lo menos con la versión de Crystal Reports que estaba integrado con el Visual Studio 2008. Otro tema es el uso de versiones de pago de Crystal Reports, que no es el caso.

Pues bien, como te decía al principio, la versión de Crystal Reports 13 para VS2010 puedes hacer eso que quieres debido a que ahora sí es posible cargar un gráfico o bitmap en tiempo de ejecución.

La idea es la siguiente:

En tu tabla de la BDD tienes un campo por ejemplo de tipo VARCHAR(12), al que llamas "CODIGO_BARRAS"
En dicho campo tienes el valor del código de barras, por ejemplo, para un EAN13 tendrías 5901234123457

Pues bien, lo que tendrías que hacer a la hora de imprimir ese albarán, factura, ticket, ... es recuperar el valor de dicho campo y guardar en un archivo jpg por ejemplo  (que puede ser temporal o con un nombre fijo, como quieras) el código de barras que se genera en este tutorial (fíjate que hay un método "SAVE")

Imaginate que el resultado lo guardas en "C:\Temp\miCodigo5901234123457.jpg"

Bien, el paso uno está completado.

En tu "report" debes incluir una fórmula, por ejemplo:

Esta fórmula está completamente en blanco. Se usará desde el código C# / VB.NET posteriormente.

Bien, a continuación deberías insertar un Objeto OLE en tu report:

En concreto un objeto de tipo Imagen de Paintbrush:

No importa el tamaño que pongas, ya que la imagen se ajustará al tamaño del código de barrás que se le pasará en la fórmula que creamos anteriomente.

Bien, ahora seleccionamos el Objeto OLE y pulsamos en Dar formato al objeto:

En la siguiente pantalla pulsamos en este botón:

En el editor de fórmulas seleccionamos la fórmula que creamos antes (y que está totalmente en blanco, recuerdo):

Al Guardar y cerrar en la pantalla anterior se mostrará el típico icono de que hay una fórmula para aquel concepto:

Pues bien ahora desde nuestro código C# / VB.NET se le podrá pasar la ruta del fichero.

Sería algo como esto:

RD.DataDefinition.FormulaFields.Item("miCodigoBarras").Text = "'C:\Temp\miCodigo5901234123457.jpg'"

...y listo

Con esto has conseguido cargar dentro de la fórmula "miCodigoBarras" la ruta del fichero jpg

Y como nuestro Objeto OLE tiene una condición que es precisamente usar como gráfico el contenido de la fórmula "miCodigoBarras" habrás conseguido que en tiempo de ejecución se muestre el código de barras en tu report.

Fácil, rápido y sin complicaciones :)

Ventajas de este método: puedes imprimir realmente lo que te de la gana en tu report, sin necesidad de fuentes especiales u otros componentes de pago

Desventajas de este método: cada vez que quieras repetir el albarán, factura, ticket o lo que sea, deberás "reconstruir" el código de barras: generarlo y guardarlo en un fichero.

Yo utilizo esta técnica a menudo y la verdad es que los resultados son estupendos y no he tenido ningún problema.

Si tienes alguna duda, ya sabes donde estamos :)

Saludos.
mov eax,ollydbg; Int 13h  

Gracias!!

Nuevamente gracias y felicitaciones, probare el ejemplo; la sencillez de tu explicacion es muy grata para alguien que esta aprendiendo VB2010, gracias!!!!!

Dos preguntas

Hola, me encanta tu blog; tengo dos preguntas espero me puedan ayudar de antemano agradezco su respuesta: La primera pregunta consiste en un detalle relacionado con el ejemplo de inserción de una imagen en un reporte en este caso un codigo de barras, la pregunta concreta seria como sigue: estoy haciendo un programa de inventario y necesito imprimir el codigo de barras de cada articulo junto con la información de este proveniente de una consulta en sql. La segunda pregunta seria si me puedes ayudar a diseñar una rutina con un ejemplo para calcular un dígito de control para los codigos de los artículos y como posteriormente verificar si el codigo con el dígito tecleado es correcto o no; un ejemplo del tipo de codigo que estoy utilizando para los artículos es 1165W5788 al cual quisiera agregarle el dígito verificador y posteriormente comprobar su integridad Por su respuesta y atenciones muchas gracias!

Decodificar

Muy Util el material, ya he probado el codigo y funciona perfectamente. Megustaría saber com se descodifica usando el iTextSharp, en lo ejemplos que puso no se descodifica y megustaria saber como hacerlo en el caso de los DataMatrix.

Respuesta

Por supuesto que si es posible.. .y es bien facil ;) saludos

Y Como?

Me podria explicar como decodificar la imagen generada?, estoy trabajando con datamatrix, un ejemplo seria muy util o un enlace. Gracias

Que tal Guille. Tal y

Que tal Guille.

Tal y como he comentado en mi primer comentario hasta donde yo conozco (que viendo la respuesta del invitado anterior parece que si es posible) nunca he tenido necesidad de "descodificar" por software un código de barras usando iTextSharp.

Cuando necesito descodificar un código de barras siempre es el "hardware" el que me proporciona alguna dll para manejar el lector y dicha librería ya se encarga de devolverme el código correspondiente.

De todos modos, si lo que quieres es descodificarlos por "software" puedes usar librerías como DatamatrixNET (vía sourceforge) o bien que invitado nos indique como hacerlo con iTextSharp ;)

Saludos.
mov eax,ollydbg; Int 13h 

Ollydbg, saludos desde

Ollydbg, saludos desde Medellín - Colombia. Muchas gracias por la ayuda, la libreria que mensionas ya la había "probado" creí que se podia hacer todo con la iTextSharp, lo de decodificar por software es para las pruebas ya que hasta hace 2 horas no habia conseguido un lector de estos. Despues de hacer las pruebas todo salió bien, hasta que codifique "algo" con muchos caracteres y no se generó ninguna imagen, me gustaria saber el limite de caracteres para controlar por codigo y advertirlo al cliente final. Me llamó la atención que no me reconozca los caracteres ":" ni el "/", los reconocía com una "Ñ" mayuscula, no se con que otros caracteres halla problema. la "," la reconoce entonces no se por que los otro no. Nueva mente gracias por la ayuda

Gracias por explorar el

Gracias por explorar el mundo de los códigos de barras en tu blog. Que la gente sepa acerca de ellos que había el primer eslabón de ponerlos a la corriente principal.

Mil y mil gracias

Muchas gracias por compartir esto. Llevaba varios días intentando lograr esto, descargando los tipos de fuente Code128.ttf pero el resultado era un código diferente. Esta solución de verdad que me ha ayudado mucho y muchas gracias por compartirlo. Saludos desde Colombia!

una pregunta o dos

Hola, felicidades por el blog; tengo un par de preguntas espero me puedan ayudar de antemano agradezco su respuesta: La primera pregunta consiste en un detalle relacionado con el ejemplo de inserción de una imagen en un reporte en este caso un codigo de barras, la pregunta concreta seria como sigue: estoy haciendo un programa de inventario y necesito imprimir el codigo de barras de cada articulo junto con la información de este, esta informacion proveniente de una consulta en sql. La segunda pregunta seria si me puedes ayudar a diseñar una rutina con un ejemplo para calcular un dígito de control para los codigos de los artículos y como posteriormente verificar si el codigo con el dígito tecleado es correcto o no; un ejemplo del tipo de codigo que estoy utilizando para los artículos es 1165W5788 al cual quisiera agregarle el dígito verificador y posteriormente comprobar su integridad; gracias!!!

Felicitaciones y mil gracias

En primer lugar quiero felicitarte por tan impresionante trabajo. Quisiera saber que tengo que agregar a este código para utilizar la variante C del code128 o incluso usar interleaved 2 of 5 necesito hacer esto para que un tercero pueda realizar una cobranza haciendo uso de cualquiera de estos codigos de barras. Nuevamente felicitaciones y muchas gracias