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  

 

 

29 comentarios en “ASP.NET CODEBARS”

  1. 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 😉

  2. 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 😉

  3. 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.

  4. 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?

  5. 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

  6. 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

  7. 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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *