You are on page 1of 3

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) {

string cd = context.Request.QueryString.Get("code");
string fm = context.Request.QueryString.Get("format");
int width =
(!string.IsNullOrEmpty(context.Request.QueryString.Get("width"))) ?
int.Parse(context.Request.QueryString.Get("width")) : 200;
int height =
(!string.IsNullOrEmpty(context.Request.QueryString.Get("height"))) ?
int.Parse(context.Request.QueryString.Get("height")) : 60;
int size =
(!string.IsNullOrEmpty(context.Request.QueryString.Get("size"))) ?
int.Parse(context.Request.QueryString.Get("size")) : 60;
if (!string.IsNullOrEmpty(cd))
{
System.IO.MemoryStream memStream = new System.IO.MemoryStream();

Bitmap bitmap = new Bitmap(width, height);


Graphics grafic = Graphics.FromImage(bitmap);
grafic.FillRectangle(new SolidBrush(Color.White), 0, 0,
(float)width, (float)height);
Font fuente = CargarFuente(fm, size);
Point point = new Point();
SolidBrush brush = new SolidBrush(Color.Black);
grafic.DrawString(FormatBarCode(cd), fuente, brush, point);

context.Response.ContentType = "image/jpeg";
bitmap.Save(context.Response.OutputStream,
System.Drawing.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.AppS
ettings.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://lonetcamp.com