Marc Rubiño

ASP.NET, C#, AJAX.NET, JavaScript, etc.

ASP.NET CODEBARS

En el foro de MSDN han consultado como poder generar códigos de barra en una aplicación ASP.NET, yo hace bastante tiempo hice un ejemplo para una aplicación windows utilizando unas fuentes True Type para este menester y ahora haré lo mismo pero para una aplicación web.

 

El artículo original para Windows lo podéis encontrar en la web del guille en http://www.elguille.info/colabora/NET2006/Marckys_BarCode.htm .

 

Lo primero que voy a hacer es un proyecto web con una simple página donde podré introducir los datos para generar el código de barras y una combo para seleccionar las fuentes que me darán los diferentes formatos de código de barras.

     

La idea de esta utilidad es mostrar los datos en un formato de código de barras y la opción que he considerado más oportuna es generar una imagen con este texto y mostrarlo en la web como un simple control de servidor image de toda la vida.

 

Para poder realizar esto si tenernos que complicar muchísimo la vida. Lo mejor es crear un http handler que nos genere esta imagen y la muestre en el control.

 Que es un Http Handler ??  

Pues un manejador de las solicitudes http que  implementa la interface IHttpHandler y nos puede servir tanto para interceptar las llamadas de un fichero con una extensión en particular como para llamarlo directamente, como va a ser nuestro caso.

 

Nuestro Manejador:

 

Tan sencillo como una clase pública que implementa la interfaz IHttpHandler.

 public class MarckysCodeBar : IHttpHandler Implementa el método ProcessRequest y la propiedad IsReusable. 

El Método ProcessRequest recuperamos los parámetros que necesitamos para generar la imagen y enviamos la respuesta a la petición http.

public void ProcessRequest(HttpContext context) { var cd = context.Request.QueryString.Get("code"); var fm = context.Request.QueryString.Get("format"); var width = (!string.IsNullOrEmpty( context.Request.QueryString.Get("width"))) ? int.Parse(context.Request.QueryString.Get("width")) : 200; var height = (!string.IsNullOrEmpty( context.Request.QueryString.Get("height"))) ? int.Parse(context.Request.QueryString.Get("height")) : 60; var size = (!string.IsNullOrEmpty( context.Request.QueryString.Get("size"))) ? int.Parse(context.Request.QueryString.Get("size")) : 60; if (!string.IsNullOrEmpty(cd)) { using (new System.IO.MemoryStream()) { var bitmap = new Bitmap(width, height); var grafic = Graphics.FromImage(bitmap); var fuente = CargarFuente(fm, size); var point = new Point(); var brush = new SolidBrush(Color.Black); grafic.FillRectangle(new SolidBrush(Color.White) , 0, 0, width, (float)height); grafic.DrawString(FormatBarCode(cd), fuente, brush, point); context.Response.ContentType = "image/jpeg"; bitmap.Save(context.Response.OutputStream, Imaging.ImageFormat.Jpeg); } } else context.Response.Write(""); }



Este manejador simplemente recupera la fuente que utilizaremos de la lista disponible crea un bitmap y le inserta el texto con la fuente del código de barras para mostrar el resultado como una imagen jpeg.

Los otros dos métodos a destacar es el formateo de los datos para que se puedan leer desde un lector de códigos de barras añadiendo los caracteres de escape correspondientes.


private string FormatBarCode(string code)
    {
        string barcode = string.Empty;
        barcode = string.Format("*{0}*", code);
        return barcode;
    }

Y cuando generamos la nueva fuente para cargar en el bitmap.

private Font CargarFuente(string fuente, int size) { string f = "BARCOD39.TTF"; switch (fuente) { case "E39": f = "BARCOD39.TTF"; break; case "E13": f = "EAN-13.TTF"; break; case "E9": f = "FRE3OF9X.TTF"; break; } PrivateFontCollection pfc = new PrivateFontCollection(); pfc.AddFontFile(System.Configuration.ConfigurationManager.AppSettings.Get("PATH_FONTS") + @"\" + f); FontFamily fontFamily = pfc.Families[0]; Font _Font = new Font(fontFamily, (float)size); return _Font; }


Finalmente para que todo esto funcione simplemente tenemos que añadir una imagen en nuestro formulario web y al lanzar el evento del botón definir la Url de la imagen desde nuestro Handler con los parámetros que necesitamos para generar el código de barras correctamente.

protected void Button1_Click(object sender, EventArgs e) { Image2.ImageUrl = string.Format(@"MarckysCodeBar.ashx?code={0}&format={1}" &width=400&height=60&size=50", TextBox1.Text, " ddlFuents.SelectedItem.Value); Image2.Visible = true; }


Y como una imagen vale más que mil palabras este es el resultado final.

Podeis bajar el proyecto de Prueba desde Proyecto-CodeBar

 Cross-Posting http://mrubino.net  

 

 

Posted: 4/12/2008 14:35 por Marc Rubiño | con 28 comment(s)
Archivado en: ,
Comparte este post:

Comentarios

Marc Rubiño ha opinado:

Gracias Espinete, eres un incondicional de geeks.ms

;-)

# December 5, 2008 2:03 PM

Ig ha opinado:

Interesante.

Lastima que una vez impresa la imagen generada, no puede leerse con un lector de codigos. :(

# December 10, 2008 8:45 AM

Marc Rubiño ha opinado:

La verdad es que no lo he probado con el lector, pero la aplicación de windows si la probé y si se ponen los caracteres de escape correctos no hay problema para que un lector pueda leer el código de barras.

Pero lo probaré y comentaré que tal.

Saludos ;-)

# December 10, 2008 9:08 AM

Marc Rubiño ha opinado:

Bueno Ig ya he solucionado el problema del lector ;-)

Las fuentes True Type además de encargarse de pintar correctamente el código de barras, se tiene que encargar de pintar los códigos de escape que necesita el lector para interpretar el los datos a leer.

Las fuentes que estaba utilizando parece ser que el “*” como escape no le gustaba y por eso e utilizado otra fuente gratuita 3OF9.TIF con la que si he podido leer perfectamente el código de barras desde un lector láser con los códigos de escape "*".

Si te vuelves a descargar el proyecto tendrás la nueva fuente instalada para probar con tu lector.

Saludos ;-)

# December 10, 2008 3:16 PM

Ricardo ha opinado:

Copie el proyecto en uno nuevo al cual quiero aplicarlo y no me funciona, el no lee el archivo de extension .ashx

# December 15, 2008 6:23 PM

Marc Rubiño ha opinado:

IHttpHandler es compatible con las versiones .net framework 1.0, 1.1, 2.0, 3.0 no tendrías que tener problemas para utilizar este controlador.

Si explicas el error que te da podría intentar ayudarte un poco mejor.

Saludos.

# December 17, 2008 10:49 PM

Ig ha opinado:

Pues si, ahora si.

¡GENIAL! ¡Eres un verdadero crack!

# January 14, 2009 11:20 AM

Juan ha opinado:

Muy buen articulo, me sirvió bastante.

Saludos,

# January 19, 2009 6:34 PM

Ruben ha opinado:

tu codigo esta bastante bien pero yo tengo el framework 3.0 y me da error en el web.config, justo en la seccion de compiler y en el subnodo providerOption , no se permiten nodos duplicados, esto es asi porque usastes el frame 3.5?

# May 22, 2009 6:09 PM

Victor ha opinado:

Hola: En verdad es bueno el código, y me paracería genial pusieran el complemento para imprimirlo en una impresora térmica.

De antemano gracias

# July 13, 2009 9:30 PM

Juanfer ha opinado:

No puedo hacer correr visual Studio 2008, (ASP.NET), tal vez cambiaron las instrucciones, ayuda porfa.

# September 11, 2009 5:19 PM

conmade ha opinado:

todo perfecto, pero me podrias decir como aumentar la resolucion de la imagen porque la genera de 96 ppp y la necesito con resolucion de 300 ppp

# February 25, 2010 7:09 PM

luciano ha opinado:

hola estoy tratando de lograr hacer el codigo de barra que publicaste pero me da error. el problema que tengo es el link del boton

protected void Button1_Click(object sender, EventArgs e)

   {

       Image2.ImageUrl = string.Format(@"MarckysCodeBar.ashx?code={0}&format={1}"

           &width=400&height=60&size=50", TextBox1.Text, "

       ddlFuents.SelectedItem.Value);

       Image2.Visible = true;

   }

no lo puedo compilar de forma correcta

# May 21, 2010 10:46 PM

Marc Rubiño ha opinado:

Pero que error te da al compilar ???

# May 23, 2010 11:29 AM

Ana ha opinado:

Hola! Podrías actualizar el enlace del proyecto? Porque no está disponible...

Desde ya muchas gracias!

Saludos ;)

# August 11, 2010 4:14 PM

edu7ar ha opinado:

muchachon el enlace ya murio  te agradecemos lo actualizes pliss....

# November 3, 2010 7:00 AM

Marc Rubiño ha opinado:

Si tenéis razón, he tenido problemas con el servidor donde están las demos. Próximamente estarán disponibles.

# November 3, 2010 9:03 AM

edu7ar ha opinado:

hola disculpa por insistir, pero estoy algo  entusiasmado con tu ayuda y necesito esa explicacion.

podrias ayudarme pliss es la clave para seguir y en ningun otro sitio he encontrado material tan bueno como el tullo.

# November 10, 2010 5:47 AM

Marc Rubiño ha opinado:

Hola Edu7ar, te prometo mirar si encuentro el ejemplo en el baúl de los recuerdos y si no realizare otro ejemplo nuevo.

Saludos.

# November 10, 2010 8:32 AM

edu7ar ha opinado:

si quieres te dejo mi correo y asi si puedes mandarmelo... te lo agradeceria con toda el alma

# November 11, 2010 1:03 AM

Marc Rubiño ha opinado:

Tranquilo, este fin de semana intentaré localizar el ejemplo y te comento que tal ;-)

# November 11, 2010 8:42 AM

joaquin ha opinado:

puedes mandarme el demo al correo joaquinmrs@gmail.com

# December 18, 2010 7:26 PM

LEONARDO HERRERA ha opinado:

Hola, el archivo aun no aparece disponible, me puedes decir por favor de dónde lo puedo bajar?

# April 29, 2011 11:33 AM

taty ha opinado:

Hola no Funciona el link de descarga por fa publicalo. Gracias

# May 10, 2011 3:04 AM

Marc Rubiño ha opinado:

Hace tiempo que quiero pasar todos los artículos que tengo en geeks.ms a esta página, pero

# June 22, 2011 10:53 PM

croft ha opinado:

PATH_FONTS

Me dice que no encuentra la ruta. Donde esta dicha carpeta o ruta???

# August 2, 2011 4:15 PM

croft ha opinado:

PATH_FONTS

Me da un error de que no escuentra la ruta. No existe

# August 2, 2011 4:16 PM

Marc Rubiño ha opinado:

En la carpeta Fuentes estan las fuentes que necesitas.

# August 2, 2011 5:33 PM