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 HttpHandler ??

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.
[sourcecode language=»csharp»]
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("");
}
[/sourcecode]

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.

[sourcecode language=»csharp»]
private string FormatBarCode(string code)
{
return string.Format("*{0}*", code);
}
[/sourcecode]

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

[sourcecode language=»csharp»]
private Font CargarFuente(string fuente, int size)
{
var pfc = new PrivateFontCollection();
var f = "BARCOD39.TTF";

switch (fuente)
{
case "E39":
f = "BARCOD39.TTF";
break;
case "E13":
f = "EAN-13.TTF";
break;
case "E9":
f = "FRE3OF9X.TTF";
break;
}

pfc.AddFontFile(ConfigurationManager.AppSettings.Get("PATH_FONTS")
+ @"" + f);
return new Font(pfc.Families[0], (float)size);
}
[/sourcecode]

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.

[sourcecode language=»csharp»]
protected void btnCargar_Click(object sender, EventArgs e)
{
Image2.ImageUrl = string.Format(@"MarckysCodeBar.ashx?code={0}&format={1}"
+ "&width=400&height=60&size=50",
TextBox1.Text, ddlFuentes.SelectedItem.Value);
Image2.Visible = true;
}
[/sourcecode]

Y como una imagen vale más que mil palabras este es el resultado final.
Os lo podéis descargar desde :    streaming

6 comentarios en “ASP.NET CODEBARS”

  1. Hola, probando tu ejemplo en forma local funciona perfecto, pero cuando lo subo al server la imagen no me la muestra… me icono con una imagen rota… Que puedo estar haciendo mal? Saludos y gracias

  2. hola, estuve probando tu ejemplo.
    1. me manda error con el Error 1 No se puede crear el tipo ‘CodeBars.MarckysCodeBar’.
    2. no carga la imagen supongo que es producto del primer error.
    3. esa clase la puedo utilizar en una version vb.2005 paa proyectos web
    saludos

  3. En este ejemplo de lo único que te tienes que asegurar es que en el web.config tengas configurada correctamente la ruta física donde están las fuentes.

    Por lo demás no hay problema con utilizar vs 2005 ya que este ejemplo ya tiene unos cuantos años 😉

  4. Hola Marc, muy buen aporte, quería preguntarte algo:
    Baje tu proyecto y funciona bien sin embargo cuando imprimes con ean13 el código que aparece no tiene la apariencia de un código generado con este estandar.

    Normalmente el ean13 trae unas rayitas mas altas que las otras… inicialmente pensé que no importaría pero resulta que al pasarlo por la lectora no lo lee.

    Tendrá esto algo que ver…he usado unos generadores online y noto que la imagen no es igual que la que genera la fuente que usas..

    estará correcta la fuente ean13, no tendrá nada que ver lo de las rayitas que son mas largas..

    Saludos,

  5. Para que el lector lea correctamente el código de barras tienes que tener en cuenta un par de cosas, primero que el código de escape de la fuente sea el correcto y que el lector esté bien configurado. Piensa que esta fuente ya tiene unos cuantos años, seguro que puedes encontrar alguna otra fuente que te sirva mejor.

    Saludos

Responder a jp Cancelar respuesta

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

Scroll al inicio