Barcode Converter - Convert Barcode to Digitized Line

Asked

Viewed 29,267 times

16

I’m reading the bank note barcode, but found that the barcode does not exactly match (numerically) the digitable line (also called line code, numeric code or IPTE).

According to a document from Banco do Brasil:

4. Digitable Line - Numerical Representation of Barcode:
__ 4.1. The digitable line data is not presented in the same sequence as the barcode data.

Therefore I need a documentation or implementation to be able to convert the Digitable Line Barcode.

This page converts to Javascript:
http://evandro.net/codigo_barras.html (if you do not find an official conversion, I will convert from this javascript)

  • 4

    What programming language you need?

  • I’m doing it in Java. (found this reference: http://www.ttrix.com/apple/iphone/boletoscan/boletoanatomia.html)

  • Take a look at this project here: https://github.com/caelum/caelum-stella

3 answers

14

A complete description of the relationship between the two formats can be found here:

What is the difference of the FEBRABAN barcode read for typed? for Leonardo Calandriello. I copy relevant content here to avoid future invalid links:

[...] the data (numbers) contained in the digitable line represent the content of the barcode, but arranged in a different order and plus the checker digit in the first 3 fields. See table down below:

inserir a descrição da imagem aqui

In each of the first three fields, after the 5th position, it shall be inserted a point"." in order to facilitate the visualization for the typing when necessary;

Fifth field: to be filled in with zeros between the maturity factor and the value until 14 positions; if there are 4 zeros in sequence "0000" in the "factor of digitable line maturity", the barcode does not contain factor of maturity.

The check digits for the 1st, 2nd and 3rd fields are not in the barcode. The total of digits in the line then it will be 47, different from the code that contains only 44 digits. Some readers show on the screen the content of the code, it happens because they have the ability to convert the code read.

[Edit-Disclaimer] This answer considers the first version of this question, where the target language was not specified.

  • 1

    First, thank you! I was looking for direct conversion of barcode numeric code to the digitable line. This link was one of the ones that had clarified the difference, but it is useful to extract the information from the barcode. Thanks!

7


Using the Javascript conversion of this page (http://evandro.net/codigo_barras.html) got to the code:

public static void main(String[] args) {
    System.out.println(calculaLinha("39993000000000014993739040736027668911000002"));
}

public static String calculaLinha(String barra) {
    // Remover caracteres não numéricos.
    String linha = barra.replaceAll("[^0-9]", "");

    if (linha.length() != 44) {
        return null; // 'A linha do Código de Barras está incompleta!'
    }

    String campo1 = linha.substring(0,4)+linha.substring(19,20)+'.'+linha.substring(20,24);
    String campo2 = linha.substring(24,29)+'.'+linha.substring(29,34);
    String campo3 = linha.substring(34,39)+'.'+linha.substring(39,44);
    String campo4 = linha.substring(4,5); // Digito verificador
    String campo5 = linha.substring(5,19); // Vencimento + Valor

    if (  modulo11Banco(  linha.substring(0,4)+linha.substring(5,44)  ) != Integer.valueOf(campo4) ) {
        return null; //'Digito verificador '+campo4+', o correto é '+modulo11_banco(  linha.substr(0,4)+linha.substr(5,99)  )+'\nO sistema não altera automaticamente o dígito correto na quinta casa!'
    }
    return   campo1 + modulo10(campo1)
            +' '
            +campo2 + modulo10(campo2)
            +' '
            +campo3 + modulo10(campo3)
            +' '
            +campo4
            +' '
            +campo5
            ;
}

public static int modulo10(String numero) {
    numero = numero.replaceAll("[^0-9]","");
    int soma  = 0;
    int peso  = 2;
    int contador = numero.length()-1;
    while (contador >= 0) {
        int multiplicacao = Integer.valueOf( numero.substring(contador,contador+1) ) * peso;
        if (multiplicacao >= 10) {multiplicacao = 1 + (multiplicacao-10);}
        soma = soma + multiplicacao;
        if (peso == 2) {
            peso = 1;
        } else {
            peso = 2;
        }
        contador = contador - 1;
    }
    int digito = 10 - (soma % 10);
    if (digito == 10) digito = 0;

    return digito;
}

public static int modulo11Banco(String numero) {
    numero = numero.replaceAll("[^0-9]","");

    int soma  = 0;
    int peso  = 2;
    int base  = 9;
    int contador = numero.length() - 1;
    for (int i=contador; i >= 0; i--) {
        soma = soma + ( Integer.valueOf(numero.substring(i,i+1)) * peso);
        if (peso < base) {
            peso++;
        } else {
            peso = 2;
        }
    }
    int digito = 11 - (soma % 11);
    if (digito >  9) digito = 0;
    /* Utilizar o dígito 1(um) sempre que o resultado do cálculo padrão for igual a 0(zero), 1(um) ou 10(dez). */
    if (digito == 0) digito = 1;
    return digito;
}

I did not perform any code optimization for Java, I just validated the algorithm of this link.

  • 1

    The answer is already there. I just made the conversion now to php and I put the solution in javascript, because the site of Evandro is off the air (I found it in webarchives by chance) http://aia.la/blog/converter_linha_digitavel_codigo_barra Direct download of the file: http://samuca.com/l/lCq4

  • @Samuelaialaferreira, still have the original javascript code of Evandro? If so, could you leave the link to download? thanks.

  • I’m also looking for the original Javascript code

0

I found on this site https://boletobancario-codigodebarras.blogspot.com/ the code in Javascript which converts the barcode to the digitable line and vice versa:

function f_barra() {
    var antes  = form.barra.value;
    var depois = calcula_barra(form.linha.value);
    form.barra.value=depois;
    antes = antes.replace(/[^0-9]/g,'')
    if ((antes != depois) && antes != '') alert('O código de barras digitado não confere:\n'+antes+'\n'+depois);
    f_venc();
    return(false);
}

function f_linha() {
    var antes  = form.linha.value.replace(/[^0-9]/g,'');
    var depois = calcula_linha(form.barra.value);
    form.linha.value=depois;
    depois = depois.replace(/[^0-9]/g,'')
    if ((antes != depois) && antes != '') alert('O código de barras digitado não confere:\n'+antes+'\n'+depois);
    f_venc();
    return(false);
}

function f_venc() {
    if ( form.barra.value.substr(5,4) == 0 )
        form.venc.value='O boleto pode ser pago em qualquer data';
    else
        form.venc.value=fator_vencimento(form.barra.value.substr(5,4));
    form.valor.value=(form.barra.value.substr(9,8)*1)+','+form.barra.value.substr(17,2);
    return(false);
}

function calcula_barra(linha)
{
    //var linha = form.linha.value; // Linha Digitável
    barra  = linha.replace(/[^0-9]/g,'');
    //
    // CÁLCULO DO DÍGITO DE AUTO CONFERÊNCIA (DAC)   -   5ª POSIÇÃO
    if (modulo11_banco('34191000000000000001753980229122525005423000') != 1) alert('Função "modulo11_banco" está com erro!');
    //
    //if (barra.length == 36) barra = barra + '00000000000';
    if (barra.length < 47 ) barra = barra + '00000000000'.substr(0,47-barra.length);
    if (barra.length != 47) alert ('A linha do código de barras está incompleta!'+barra.length);
    //
    barra  = barra.substr(0,4)
            +barra.substr(32,15)
            +barra.substr(4,5)
            +barra.substr(10,10)
            +barra.substr(21,10)
            ;
    //form.barra.value = barra;
    if (modulo11_banco(barra.substr(0,4)+barra.substr(5,39)) != barra.substr(4,1))
        alert('Digito verificador '+barra.substr(4,1)+', o correto é '+modulo11_banco(barra.substr(0,4)+barra.substr(5,39))+'\nO sistema não altera automaticamente o dígito correto na quinta casa!');
    //if (form.barra.value != form.barra2.value) alert('Barras diferentes');
    return(barra);
}

function calcula_linha(barra)
{
    //var barra = form.barra.value; // Codigo da Barra
    linha = barra.replace(/[^0-9]/g,'');
    //
    if (modulo10('399903512') != 8) alert('Função "modulo10" está com erro!');
    if (linha.length != 44) alert ('A linha do código de barras está incompleta!');
    //
    var campo1 = linha.substr(0,4)+linha.substr(19,1)+'.'+linha.substr(20,4);
    var campo2 = linha.substr(24,5)+'.'+linha.substr(24+5,5);
    var campo3 = linha.substr(34,5)+'.'+linha.substr(34+5,5);
    var campo4 = linha.substr(4,1);     // Digito verificador
    var campo5 = linha.substr(5,14);    // Vencimento + Valor
    //
    if (  modulo11_banco(  linha.substr(0,4)+linha.substr(5,99)  ) != campo4 )
        alert('Digito verificador '+campo4+', o correto é '+modulo11_banco(  linha.substr(0,4)+linha.substr(5,99)  )+'\nO sistema não altera automaticamente o dígito correto na quinta casa!');
    //
    if (campo5 == 0) campo5 = '000';
    //
    linha =  campo1 + modulo10(campo1)
            +' '
            +campo2 + modulo10(campo2)
            +' '
            +campo3 + modulo10(campo3)
            +' '
            +campo4
            +' '
            +campo5
            ;
    //if (form.linha.value != form.linha2.value) alert('Linhas diferentes');
    return(linha);
}

function fator_vencimento (dias) {
    //Fator contado a partir da data base 07/10/1997
    //*** Ex: 31/12/2011 fator igual a = 5198
    //alert(dias);
    var currentDate, t, d, mes;
    t = new Date();
    currentDate = new Date();
    currentDate.setFullYear(1997,9,7);//alert(currentDate.toLocaleString());
    t.setTime(currentDate.getTime() + (1000 * 60 * 60 * 24 * dias));//alert(t.toLocaleString());
    mes = (currentDate.getMonth()+1); if (mes < 10) mes = "0" + mes;
    dia = (currentDate.getDate()+1); if (dia < 10) dia = "0" + dia;
    //campo.value = dia +"."+mes+"."+currentDate.getFullYear();campo.select();campo.focus();
    return(t.toLocaleString());
}

function modulo10(numero)
{

    numero = numero.replace(/[^0-9]/g,'');
    var soma  = 0;
    var peso  = 2;
    var contador = numero.length-1;
    //alert(contador);
    //numero = '00183222173';
    //for (var i=0; i <= contador - 1; i++) {
    //alert(10);
    //for (contador=10; contador >= 10 - 1; contador--) {
    while (contador >= 0) {
        //alert(contador);
        //alert(numero.substr(contador,1));
        multiplicacao = ( numero.substr(contador,1) * peso );
        if (multiplicacao >= 10) {multiplicacao = 1 + (multiplicacao-10);}
        soma = soma + multiplicacao;
        //alert(numero.substr(contador,1)+' * '+peso+' = '+multiplicacao + ' =>' + soma) ;
        //alert(soma);
        if (peso == 2) {
            peso = 1;
        } else {
            peso = 2;
        }
        contador = contador - 1;
    }
    var digito = 10 - (soma % 10);
    //alert(numero + '\n10 - (' + soma + ' % 10) = ' + digito);
    if (digito == 10) digito = 0;
    return digito;
}


function modulo11_banco(numero)
{

    numero = numero.replace(/[^0-9]/g,'');
    //debug('Barra: '+numero);
    var soma  = 0;
    var peso  = 2;
    var base  = 9;
    var resto = 0;
    var contador = numero.length - 1;
    //debug('tamanho:'+contador);
    // var numero = "12345678909";
    for (var i=contador; i >= 0; i--) {
        //alert( peso );
        soma = soma + ( numero.substring(i,i+1) * peso);
        //debug( i+': '+numero.substring(i,i+1) + ' * ' + peso + ' = ' +( numero.substring(i,i+1) * peso)+' soma='+ soma);
        if (peso < base) {
            peso++;
        } else {
            peso = 2;
        }
    }
    var digito = 11 - (soma % 11);
    //debug( '11 - ('+soma +'%11='+(soma % 11)+') = '+digito);
    if (digito >  9) digito = 0;

    if (digito == 0) digito = 1;
     return digito;
    }
  • Can inform because if the line size is less than 47 it autocompletes up to 11 zeros?

Browser other questions tagged

You are not signed in. Login or sign up in order to post.