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 ??
Nuestro Manejador:
El Método ProcessRequest
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]
[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]
[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]
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
Asegurate que la ruta de la fuente en el config sea realmente la que tienes en el servidor.
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
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 😉
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,
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