Generar codigo de barras EAN 13 y EAN 8

A todos nos toca en algún momento trabajar con los comunes pero místicos códigos de barra antes de irnos al código veamos de donde salen porque no es solo poner números en un TextBox y que la fuente determinada los “dibuje”.

El código de barra es una representación de un número en barras de distinto grosor, ese conjunto de cifras tiene una estructura predeterminada, y su objetivo es lograr la identificación de un producto. El sistema EAN (European Article Numbering) 13 es el más difundido en el mundo y se apoya en la versión corta EAN 8 cuando la superficie a colocarlo es pequeña.

Caracteristicas EAN 13
Consta de un código de 13 cifras
Las tres primeras posiciones que forman el prefijo EAN, identifican el país.
Las cuatro posiciones siguientes corresponden al código de la empresa.
Los cinco dígitos restantes pueden ser administrados por el fabricante e identifican al producto.
La decimotercera posición es una cifra de control que permite verificar si las cifras precedentes han sido correctamente leídas.

EAN 8
Los primeros tres dígitos identifican a la organización/pais de codificación , igual que en el EAN-13.
Las siguientes cuatro posiciones identifican al artículo.
La restante corresponde a la cifra de control.

Aquí un link del capítulo Venezuela del GS1 de la codificación, te ayudara entrar en contexto. http://www.gs1ve.org/aso-preguntas.htm

Tomado del sitio: “GS1 Venezuela es una organización líder dedicada al desarrollo e mplementación de estándares globales y soluciones, para mejorar la eficiencia y la visibilidad en la cadena de demanda y suministros en todos los sectores del país.”

Los pasos para calcular el digito de control son:

Para 123456789041 el dígito de control será:
Numeramos de derecha a izquierda: 140987654321
Suma de los números en los lugares impares: 1+0+8+6+4+2 = 21
Multiplicado (por 3): 21 × 3 = 63
Suma de los números en los lugares pares: 4+9+7+5+3+1 = 29
Suma total: 63 + 29 = 92
Decena inmediatamente superior = 100
Dígito de control: 100 – 92 = 8

El código quedará así: 1234567890418.

(Tomado de http://es.wikipedia.org/wiki/EAN)

 

Ya que sabemos un poquito de en que estamos y podemos hablar de tu a tu con nuestro cliente con respecto a la creacion de codigos pasemos a al codigo.

Antes que todo debes tener en el equipos la fuente ean13.ttf aqui te la dejo LINK http://dl.dropbox.com/u/26490398/c/ean13.zip. Solo debes copiarla en la carpeta C:\Windows\Fonts\  .

Dibujemos un formulario como este Smile

image

Estas son las propiedades del TextBox donde colocaremos el codigo (txtEnBarra) :

image

Cómo pudiste ver solo debes cambiar las propiedades BackColor y Font>>Name que es la realmente importante.

Luego asocia el siguiente código a los eventos correspondientes:

 

 private int m_longitud;

        public void ConvertEAN()
        {
            string CodigoBarra;
            CodigoBarra = "";
            if (txtCodigo.Text.Trim().Length > 0)
            {
                int strL = m_longitud - txtCodigo.Text.Trim().Length;
                string str = "";
                for (int i = 1; i <= strL; i++)
                {
                    str = str + "0";
                }
                CodigoBarra = txtCodigo.Text + str;
            }

            string m_final = "";
            if (rbOcho.Checked == true)
                m_final = EANOcho(CodigoBarra) + AddOn(txtAddon.Text.Trim());
            else
                m_final = EANTrece(CodigoBarra) + AddOn(txtAddon.Text.Trim());

            txtEnBarra.Text = m_final;
        }

        public string EANOcho(string valor)
        {
            int i;
            double m_validador;
            string CodigoBarra = "";
            m_validador = 0;
            if (valor.Length == 7)
            {
                for (i = 1; i <= 7; i++)
                {
                    int L1 = Convert.ToChar(valor.Substring(i - 1, 1));
                    if ((L1 < 48) || (L1 > 57))
                    {
                        i = 0;
                        break;
                    }
                }
                if (i == 8)
                {
                    for (i = 7; i > 0; i = i - 2)
                    {
                        m_validador = m_validador + Convert.ToInt32(valor.Substring(i - 1, 1));
                    }
                    m_validador = m_validador * 3;

                    for (i = 6; i > 0; i = i - 2)
                    {
                        m_validador = m_validador + Convert.ToInt32(valor.Substring(i - 1, 1));
                    }
                    valor = valor + (10 - m_validador % 10) % 10;

                    CodigoBarra = ":";

                    for (i = 1; i <= 4; i++)
                    {
                        CodigoBarra = CodigoBarra + Convert.ToChar(65 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                    }
                    CodigoBarra = CodigoBarra + "*";
                    for (i = 5; i <= 8; i++)
                    {
                        CodigoBarra = CodigoBarra + Convert.ToChar(97 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                    }
                    CodigoBarra = CodigoBarra + "+";
                }
            }
            return CodigoBarra;
        }

        public object EANTrece(string valor)
        {
            object functionReturnValue = null;
            int i;
            int m_validador = 0;
            int m_primero;
            string CodigoBarra;
            bool tableA;
            functionReturnValue = "";
            if (valor.Length == 12)
            {
                for (i = 1; i <= 12; i++)
                {
                    int L1 = Convert.ToChar(valor.Substring(i - 1, 1));
                    if (L1 < 48 || L1 > 57)
                    {
                        i = 0;
                        break;
                    }
                }
                if (i == 13)
                {
                    for (i = 12; i >= 1; i += -2)
                    {
                        m_validador = m_validador + Convert.ToInt32(valor.Substring(i - 1, 1));
                    }
                    m_validador = m_validador * 3;
                    for (i = 11; i >= 1; i += -2)
                    {
                        m_validador = m_validador + Convert.ToInt32(valor.Substring(i - 1, 1));
                    }
                    valor = valor + (10 - m_validador % 10) % 10;
                    CodigoBarra = valor.Substring(0, 1) + Convert.ToChar(65 + Convert.ToInt32((valor.Substring(1, 1))));
                    m_primero = Convert.ToInt32(valor.Substring(0, 1));

                    for (i = 3; i <= 7; i++)
                    {
                        tableA = false;
                        switch (i)
                        {
                            case 3:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 1:
                                    case 2:
                                    case 3:
                                        tableA = true;
                                        break;
                                }
                                break;
                            case 4:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 4:
                                    case 7:
                                    case 8:
                                        tableA = true;
                                        break;
                                }
                                break;
                            case 5:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 1:
                                    case 4:
                                    case 5:
                                    case 9:
                                        tableA = true;
                                        break;
                                }
                                break;
                            case 6:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 2:
                                    case 5:
                                    case 6:
                                    case 7:
                                        tableA = true;
                                        break;
                                }
                                break;
                            case 7:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 3:
                                    case 6:
                                    case 8:
                                    case 9:
                                        tableA = true;
                                        break;
                                }
                                break;
                        }
                        if (tableA)
                        {
                            CodigoBarra = CodigoBarra + Convert.ToChar(65 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                        }
                        else
                        {
                            CodigoBarra = CodigoBarra + Convert.ToChar(75 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                        }
                    }
                    CodigoBarra = CodigoBarra + "*";
                    for (i = 8; i <= 13; i++)
                    {
                        CodigoBarra = CodigoBarra + Convert.ToChar(97 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                    }
                    CodigoBarra = CodigoBarra + "+";
                    functionReturnValue = CodigoBarra;
                }
            }
            return functionReturnValue;
        }

        public string AddOn(string valor)
        {
            int i;
            int checksum = 0;
            string AddOnn = "";

            bool tableA;

            if (valor.Length == 2 || valor.Length == 5)
            {
                for (i = 1; i < valor.Length; i++)
                {
                    int L1 = Convert.ToChar(valor.Substring(i - 1, 1));

                    if (L1 < 48 || L1 > 57)
                    {
                        break;
                    }
                    if (valor.Length == 2)
                    {
                        checksum = 10 + Convert.ToInt32(valor) % 4;
                    }
                    else if (valor.Length == 5)
                    {
                        for (i = 1; i == 5; i = i - 2)
                        {
                            checksum = checksum + Convert.ToInt32(valor.Substring(i - 1, 1));
                        }
                        checksum = (checksum * 3 + Convert.ToInt32(valor.Substring(2, 1)) * 9 + Convert.ToInt32(valor.Substring(4, 1)) * 9) % 10;
                    }
                    AddOnn = "[";
                    for (i = 1; i <= valor.Length; i++)
                    {
                        tableA = false;

                        switch (i)
                        {
                            case 1:
                                int[] str = { 4, 9, 10, 11 };
                                for (int j = 0; j < str.Length; j++)
                                {
                                    if (str[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;

                            case 2:
                                int[] str1 = { 1, 2, 3, 5, 6, 7, 10, 12 };
                                for (int j = 0; j < str1.Length; j++)
                                {
                                    if (str1[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;
                            case 3:
                                int[] str2 = { 0, 2, 3, 6, 7 };
                                for (int j = 0; j < str2.Length; j++)
                                {
                                    if (str2[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;
                            case 4:
                                int[] str3 = { 1, 3, 4, 8, 9 };
                                for (int j = 0; j < str3.Length; j++)
                                {
                                    if (str3[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;
                            case 5:
                                int[] str4 = { 0, 1, 2, 4, 5, 7 };
                                for (int j = 0; j < str4.Length; j++)
                                {
                                    if (str4[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;
                        }

                        if (tableA)
                            AddOnn = AddOnn + Convert.ToChar(65 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                        else
                            AddOnn = AddOnn + Convert.ToChar(75 + Convert.ToInt32(valor.Substring(i - 1, 1)));

                        if ((valor.Length == 2 && i == 1) || (valor.Length == 5 && i < 5))
                            AddOnn = AddOnn + Convert.ToChar(92);

                    }


                }
            }
            return AddOnn;
        }

        private void rbTrece_CheckedChanged(object sender, EventArgs e)
        {            
            m_longitud = 12;
            txtCodigo.MaxLength = 12;
            lblCodigoIndicar.Text = "12 digitos";
        }

        private void rbOcho_CheckedChanged(object sender, EventArgs e)
        {
            m_longitud = 7;
            txtCodigo.MaxLength = 7;
            lblCodigoIndicar.Text = "7 digitos";
        }

        private void btnGenerar_Click(object sender, EventArgs e)
        {
            ConvertEAN();
        }

Tu resultado debe ser:

imageSurprised smile facil!

 

Aqui tienes el link con el proyecto completo: http://dl.dropbox.com/u/26490398/c/nplanchart.wordpress.com_CodigoBarra.zip

32 Responses to Generar codigo de barras EAN 13 y EAN 8

  1. Pepe dice:

    Buen codigo Pana! Gracias

  2. Edwin Franco dice:

    Orale bien (y), cuando coloqué la fuente en «Fonts», automaticamente leyó el tipo de fuete EAN13, pero luego se desconfiguró, trato de cambiarla en la propiedad font dl txtEnBarra y dice que no es una fuente .ttf, al menos si pude ver que funcionaba, ya lo checaré,..
    Te agradesco este enorme aporte.
    Saludos!

  3. juan arlos dice:

    y como puedo hacer para guardarlo como imagen

  4. Alexander Garrido dice:

    Estimado.
    Esta super bueno el post.
    me preguntaba si habria alguna forma de intergrar esto en un excell.
    la verdad es que no se mucho de programacion… mediante una serie de formulas he podido generar una serie de codigos ean13 distintos… tengo la fuente pero no puedo transformar el string.
    si me pudieras ayudar seria super.
    saludos

  5. Alexander Garrido dice:

    En un excel tengo en la hoja 1 una lista de codigos de barras internos de un minimarket… son codigos de identificacion de personal de caja, productos propios, etc. anterior a esto los productos propios debian digitarse manualmente, lo mismo con el cambio de cajeros por turno, lo cual es engorroso. para automatizar el tema se necesitan imprimir varios de estos codigos constantemente. Lo que necesito es que en la en la misma hoja al lado del codigo numerico que ya genere me aparezca el string para utilizar la fuente. con esto podria filtrar los que necesito imprimir y los imprimo.

  6. diego dice:

    esta muy buena la apli pero estaria bueno tener como imprimir, ya que yo tambien consigo generear codigo de barra pero no puedo imprimirlo como codigo de barra.
    si alguien sabes ayuddaaaaa

    • Diego, Nolberto.
      encontre lo siguiente en la web buscando… es de una pagina francesa.. pon esto en un excel y crea un funcion nueva y listo.
      para ean 13 copia lo de abajo…

      Public Function ean13$(chaine$)
      ‘Cette fonction est regie par la Licence Generale Publique Amoindrie GNU (GNU LGPL)
      ‘This function is governed by the GNU Lesser General Public License (GNU LGPL)
      ‘V 1.1.1
      ‘Parametres : une chaine de 12 chiffres
      ‘Parameters : a 12 digits length string
      ‘Retour : * une chaine qui, affichee avec la police EAN13.TTF, donne le code barre
      ‘ * une chaine vide si parametre fourni incorrect
      ‘Return : * a string which give the bar code when it is dispayed with EAN13.TTF font
      ‘ * an empty string if the supplied parameter is no good
      Dim i%, checksum%, first%, CodeBarre$, tableA As Boolean
      ean13$ = «»
      ‘Verifier qu’il y a 12 caracteres
      ‘Check for 12 characters
      If Len(chaine$) = 12 Then
      ‘Et que ce sont bien des chiffres
      ‘And they are really digits
      For i% = 1 To 12
      If Asc(Mid$(chaine$, i%, 1)) 57 Then
      i% = 0
      Exit For
      End If
      Next
      If i% = 13 Then
      ‘Calcul de la cle de controle
      ‘Calculation of the checksum
      For i% = 12 To 1 Step -2
      checksum% = checksum% + Val(Mid$(chaine$, i%, 1))
      Next
      checksum% = checksum% * 3
      For i% = 11 To 1 Step -2
      checksum% = checksum% + Val(Mid$(chaine$, i%, 1))
      Next
      chaine$ = chaine$ & (10 – checksum% Mod 10) Mod 10
      ‘Le premier chiffre est pris tel quel, le deuxieme vient de la table A
      ‘The first digit is taken just as it is, the second one come from table A
      CodeBarre$ = Left$(chaine$, 1) & Chr$(65 + Val(Mid$(chaine$, 2, 1)))
      first% = Val(Left$(chaine$, 1))
      For i% = 3 To 7
      tableA = False
      Select Case i%
      Case 3
      Select Case first%
      Case 0 To 3
      tableA = True
      End Select
      Case 4
      Select Case first%
      Case 0, 4, 7, 8
      tableA = True
      End Select
      Case 5
      Select Case first%
      Case 0, 1, 4, 5, 9
      tableA = True
      End Select
      Case 6
      Select Case first%
      Case 0, 2, 5, 6, 7
      tableA = True
      End Select
      Case 7
      Select Case first%
      Case 0, 3, 6, 8, 9
      tableA = True
      End Select
      End Select
      If tableA Then
      CodeBarre$ = CodeBarre$ & Chr$(65 + Val(Mid$(chaine$, i%, 1)))
      Else
      CodeBarre$ = CodeBarre$ & Chr$(75 + Val(Mid$(chaine$, i%, 1)))
      End If
      Next
      CodeBarre$ = CodeBarre$ & «*» ‘Ajout separateur central / Add middle separator
      For i% = 8 To 13
      CodeBarre$ = CodeBarre$ & Chr$(97 + Val(Mid$(chaine$, i%, 1)))
      Next
      CodeBarre$ = CodeBarre$ & «+» ‘Ajout de la marque de fin / Add end mark
      ean13$ = CodeBarre$
      End If
      End If
      End Function

      para Ean 8 copia lo siguiente:
      Public Function EAN8$(chaine$)
      ‘V 1.0.0
      ‘Parametres : une chaine de 7 chiffres
      ‘Parameters : a 7 digits length string
      ‘Retour : * une chaine qui, affichee avec la police EAN13.TTF, donne le code barre
      ‘ * une chaine vide si parametre fourni incorrect
      ‘Return : * a string which give the bar code when it is dispayed with EAN13.TTF font
      ‘ * an empty string if the supplied parameter is no good
      Dim i%, checksum%, first%, CodeBarre$, tableA As Boolean
      EAN8$ = «»
      ‘Verifier qu’il y a 7 caracteres
      ‘Check for 7 characters
      If Len(chaine$) = 7 Then
      ‘Et que ce sont bien des chiffres
      ‘And they are really digits
      For i% = 1 To 7
      If Asc(Mid$(chaine$, i%, 1)) 57 Then
      i% = 0
      Exit For
      End If
      Next
      If i% = 8 Then
      ‘Calcul de la cle de controle
      ‘Calculation of the checksum
      For i% = 7 To 1 Step -2
      checksum% = checksum% + Val(Mid$(chaine$, i%, 1))
      Next
      checksum% = checksum% * 3
      For i% = 6 To 1 Step -2
      checksum% = checksum% + Val(Mid$(chaine$, i%, 1))
      Next
      chaine$ = chaine$ & (10 – checksum% Mod 10) Mod 10
      ‘Les 4 premier chiffre viennent de la table A
      ‘The first 4 digits come from table A
      CodeBarre$ = «:» ‘Ajout marque de debut / Add start mark
      For i% = 1 To 4
      CodeBarre$ = CodeBarre$ & Chr$(65 + Val(Mid$(chaine$, i%, 1)))
      Next
      CodeBarre$ = CodeBarre$ & «*» ‘Ajout separateur central / Add middle separator
      For i% = 5 To 8
      CodeBarre$ = CodeBarre$ & Chr$(97 + Val(Mid$(chaine$, i%, 1)))
      Next
      CodeBarre$ = CodeBarre$ & «+» ‘Ajout de la marque de fin / Add end mark
      EAN8$ = CodeBarre$
      End If
      End If
      End Function

      cualquier duda a rm.alexg@gmail.com
      si quieres te mando el excel que hice con estas funciones.
      Saludos

      Nolberto… Sorry por lo Largo.
      Si quieres lo borras.

  7. Leonel dice:

    Como estas Norberto, muy buen aporte te felicito, tienes conocimiento sobre las firmas electronicas con .net?… me encuentro desarrollando algo sobre esto pero se me presento un problema en las referencias del keyinfo y signatureProperties.
    de antemano muchas gracias…

  8. Derlis dice:

    Hola Norberto..
    Dispones de algún ejemplo como para imprimir en matrices este código EAN generado ??

  9. julio claderonne dice:

    hola buen dia pero si quyiero mandar imprimir el codigo como lo hago para poner un boton imprimir en en una etiqueta

  10. Rolando dice:

    Hola Norberto,

    Gracias por esta info. Yo compré los codigos UPC para algunos productos. Con estos códigos necesito generar el códigos de barras EAN13, poniendo un 0 (cero) al principio.

    Una vez que genero el código tengo una imagen del código de barras.

    Mi pregunta es. ¿Yo tengo que dar / introducir la información correspondiente a este código para mi producto? o ¿Es directamente el vendedor el que ingresa la información para cada producto?

    Gracias y saludos!

    Rolando

  11. Rogerts dice:

    Muchas gracias por el código, da pie a automatizar muchas cosas y no tener que ir en busca de páginas web cada vez que tengo que hacer pruebas con códigos de barras. Esto es productividad.

  12. Alejandro dice:

    Pero ese proyecto es para generar código en Visual C# quisiera que me hicieras el favor de ayudarme porque lo quiero para Visual Basic normal porfavor ayúdame enserio necesito eso

  13. Caro Gonzalez dice:

    Hola Norberto,

    Después de investigar varias paginas tu solución me ayudo, como no soy experta en programación lo que hice fue bajar la fuente y generar una formula en excel, de esta manera pude crear los codigos, lo que no sé es que si los pueda leer un scanner, tu sabras sobre esto??

  14. Alejandro dice:

    Simplemente gracias,estoy trabajando con lo que es la plataforma de Visual Basic.net pero es el Visual Basic 2012 en un control de inventario de supermercado y quería implementar lo que es el código de barra,gracias por tú ayuda

  15. Julio César Matamoros M. dice:

    Hola Norberto,
    Antes que todo, te felicito por ese gusto y talento que se ve por el desarrolo de algoritmos, sabrás de alguna solucion para codificarlo en ABAP(SAP) para generar el código ean13 e imprimirlo en una impresora laser, que no sea zebra, ya que me marca un problema con tecnologica de codigo de barras nueva.

    Muchas gracias de antemano y que tengas un excelente día!

  16. german dice:

    hola se que el pos es viejo, pero no puedo hacer funcionar y lo necesito, baje la fuente y genere la formula con lo que dejo Alexander pero tira un error en la linea 19 del visual. Alguien me podría ayudar.

  17. Anónimo dice:

    EXCELENTE!

  18. Marcos Tec dice:

    Excelente aporte, gracias por compartir tus conocimientos. Funciona correctamente.

    Saludos!.

  19. Anónimo dice:

    Hola, por casualidad existirá un cod que me tire un 9no cod verificador automaticamente?

  20. Julio perez dice:

    Quiero el código fuente

  21. Julio perez dice:

    O .mejor dicho el projecto

  22. jmrt dice:

    buenas noches podría por favor volver a subir sus fuentes y el proyecto gracias de ante mano

  23. Ivan Salazar dice:

    Hola amigos, yo estoy buscando el script para generar el codigo de barras para UPC-A pero para usarlo en PL/Sql, alguien tendra un script???

    saludos desde Guatemala

Replica a Enrique Cancelar la respuesta