Código de Barras 2 de 5

Aqui é o lugar para bater papo e trocar idéias sobre os mais variados assuntos

Moderador: Moderadores

Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Re: Código de Barras 2 de 5

Mensagem por Hasse »

É um prazer conhecer pessoas que sabem apreciar com humor um caso, às vezes, no mínimo desajeitado...

Quanto ao Boleto, por enquanto, não está no meu foco. Amanhã nunca se sabe...

Esta atual necessidade é para o desenvolvimento de uma planilha de dados, exatamente como aquela que anexei à mensagem anterior.

Contudo, me lembro muito bem que em testes que fiz, eu importava uma imagem JPG, e em seguida escrevia um texto em cima dela, o que é mais ou menos a tua necessidade, segundo entendi. Haveria uma imagem, e em espaço vazios, haveria sobre-escrito um texto ou Código de Barras. Não me lembro mais quais as funções que usei para o sobre-escrito, acredito que tenha sido o oPrinter:TextAtFont() ou oPrinter:TextOutAt().
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Código de Barras 2 de 5

Mensagem por gvc »

Eu teria que procurar o manual, mas ao que me lembro o int2de5 é só para números. Não terá representação para letras.
Sua planilha identifica os exames que o paciênte/cliente fez no laboratório.
É esse o caminho ou estou errado?
Como esse é o CB utilizado no boleto bancário, imagine (erroneamente) que era isso que vc estava fazendo/desenvolvendo.

Isto é parte da BARLIB que gera o int25. Veja se te ajuda. Lembrando que ela foi desenvolvida para rodar no FW.
Lembrando que o CB int25 inicia com '(' e fecha com ')'. Os números são agrupados em duplas.

Código: Selecionar todos

// interleave 2 of 5
// matrix 2 of 5

#include "common.ch"

static aBar:={"00110","10001",'01001','11000','00101','10100','01100',;
              '00011','10010','01010'}
static cStart:='0000'
static cStop:='100'
static cMtSt:='10000' // matrix start/stop
static cInStart := '110' // industrial 2 of 5 start
static cInStop := '101' // industrial 2 of 5 stop

function _int25(cCode,lMode)
    local n,cBar:='', cIz:='',cDer:='',nLen:=0,nCheck:=0,cBarra:=''
    local m

    default lMode to .f.
    cCode:=trans(cCode,'@9') // elimina caracteres

    if (nLen%2=1.and.!lMode)
        nLen++
        cCode+='0'
    end
    if lMode
        for n:=1 to len(cCode) step 2
            nCheck+=val(substr(cCode,n,1))*3+val(substr(cCode,n+1,1))
        next
        cCode += right(str(nCheck,10,0),1)
    end

    nLen:=len(cCode)
    cBarra:= cStart
    // preencoding .. interlaving

    for n:=1 to nLen step 2
        cIz:=aBar[val(substr(cCode,n,1))+1]
        cDer:=aBar[val(substr(cCode,n+1,1))+1]
        for m:=1 to 5
            cBarra+=substr(cIz,m,1)+substr(cDer,m,1)
        next
    next
    cBarra+=cStop
    for n:=1 to len(cBarra) step 2
        if substr(cBarra,n,1)='1'
            cBar+='111'
        else
            cBar+='1'
        end
        if substr(cBarra,n+1,1)='1'
            cBar+='000'
        else
            cBar+='0'
        end
    next
return cBar

function _MAT25(cCode,lCheck)
    local cBar:='',cBarra:='', nCheck,n
    default lCheck to .f.
    cCode:=trans(cCode,'@9') // only digits
    if lCheck
        for n:=1 to len(cCode) step 2
            nCheck+=val(substr(cCode,n,1))*3+val(substr(cCode,n+1,1))
        next
        cCode += right(str(nCheck,10,0),1)
    end
    cBar:=cMtSt
    for n:=1 to len(cCode)
        cBar+=aBar[val(substr(cCode,n,1))+1]+'0'
    next
    cBar+=cMtSt
    for n:=1 to len(cBar) step 2
        if substr(cBar,n,1)='1'
            cBarra+='111'
        else
            cBarra+='1'
        end
        if substr(cBar,n+1,1)='1'
            cBarra+='000'
        else
            cBarra+='0'
        end
    next
return cBarra

function _Ind25(cCode,lCheck)
    local cBar:='',cBarra:='', nCheck,n
    default lCheck to .f.
    cCode:=trans(cCode,'@9') // only digits
    if lCheck
        for n:=1 to len(cCode) step 2
            nCheck+=val(substr(cCode,n,1))*3+val(substr(cCode,n+1,1))
        next
        cCode += right(str(nCheck,10,0),1)
    end
    cBar:=cInStart
    for n:=1 to len(cCode)
        cBar+=aBar[val(substr(cCode,n,1))+1]+'0'
    next
    cBar+=cInStop
    for n:=1 to len(cBar)
        if substr(cBar,n,1)='1'
            cBarra+='1110'
        else
            cBarra+='10'
        end
    next
return cBarra
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Re: Código de Barras 2 de 5

Mensagem por Hasse »

A tua afirmação está totalmente correta.

O 2 de 5 Intercalado é somente para números, já que eu identifico o paciente pelo número de cadastro da requisição de exame.

O código que eu usei é bem menor pois eu parto da presuposição (no meu caso, certeza absoluta) de que só números estão presentes e em número par de caracteres, já o Número da Requisição é composto por 6 dígitos. Desta forma, o teu código é bem mais seguro pois faz várias verificações que o meu não faz.

Nunca analisei o Boleto Bancário, mas o Código de Barras deles não somente composto por números ? Não estou bem certo mas acho que num dos sites li que os Bancos usam o 2 de 5. Neste caso, você precisa adotar a norma do Banco (todos os bancos ???). Neste instante estou com um Boleto do Bradesco em mãos e parace-me que realmente é um 2 de 5.

Se você precisa de alfa-numérico há outras opções, como o "3 de 9" e o "Code 128".

Pelo que li nos sites visitados, o "Code 128" é o de menor tamanho e o mais confiável pois é bem mais moderno (de desenvolvimento mais recente).
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Código de Barras 2 de 5

Mensagem por Maligno »

Minha contribuição ao tópico: um PDF que esclarece os tipos de códigos de barras, com suas características principais. É bem sucinto, mas já é uma ajuda.

http://educacaotecnologica.2000pt.net/c ... barras.pdf
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Re: Código de Barras 2 de 5

Mensagem por Hasse »

Boa tarde colegas.

Eu tenho uma Apostila com mais de 120 páginas, escrito por José Alberto Rosa Andrade (Joinville-SC), que trata de muitos tipos de Código de Barras, com todos os detalhes técnicos da formação e composição das barras.

O 2 de 5 Intercalado está acompanhado por m exemplo de programa, em Clipper, desenvolvido peolo autor em 1993.

Tem inclusive o UPC-A (de origem Americana e Canadense) (aquelas usada nos produtos de super-mercados) e também nos produtos importados. Composto por 12 dígitos, sendo um verificador, e também o UPC-E, para pequenas embalagens.

Também tem o EAN-13, o EAN-12 e o EAN-8, de origem européia.

Se alguém tiver interesse em algum específico, basta solicitar, que passo no scaner, e anexo em PDF.

Curiosidades:
1-No caso do Códigos de Barras em 2D só menciona alguns dados, como o PDF-417, que em 2,5cm x 2,5 cm de área pode armazenar até 1000 caracteres.
2-O Vericode pode armazenar de 3 a 100 caracteres em uma área a partir 4 micros quadrados.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Re: Código de Barras 2 de 5

Mensagem por Hasse »

Bom dia amigos.

Fui alertado que a Planilha.pdf que anexei estava SEM o Código de Barras, e sustituí o citado anexo por outro, COM o Código de Barras.

Por favor, me retornem se eventualmente ele não aparecer em virtude da falta da fonte no computador de destino. Neste caso eu anexo ela em formato JPG zipado.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Código de Barras 2 de 5

Mensagem por rochinha »

Amiguinho,

Seu post é antigo mas vai a pergunta.

Voce implementou? de uma dica de como fez, pois se não fez eu implementei uma impressão de conteúdo de nota fiscal em arquivo .CDR(Coreldraw) que provavelmente esta perdido no oceano de informações aqui do forum.

Implementei usando um antigo exemplo em Fivewin para isto.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Re: Código de Barras 2 de 5

Mensagem por Hasse »

Boa noite Rochinha.

Acredito que você esteja dirigindo o pedido para mim.

Neste caso, segue a minha solução, em xHarbour puro.

1-Verifico se o número de algarismos é par. Se não, acrescento "0" à esquerda:

Código: Selecionar todos

c_numero := IIF( LEN( c_numero ) / 2 <> INT( LEN( c_numero ) ), "0" + c_numero, c_numero )
2-Separo os caracteres em pares, já que eles devem, ser intercalados aos pares. Efetou o cálculo para cada par. O resultado é adicionado à variável "c_num25":

Código: Selecionar todos

c_num25 := ""
FOR nn = 1 TO LEN( c_numero ) step 2
   nn1     := VAL( SUBS( c_numero, nn, 02 ) )
   c_num25 += CHR( nn1 + IF( nn1<=49, 48, 0 ) + IF( nn1>=50, 142, 0 ) )
NEXT nn
3-A string "c_num25" é impressa:

Código: Selecionar todos

oPrinter:TextAtFont( 20, n_posY+20 , "("+c_num25+")", 'I2OF5TXT', 24, 05 )
OBSERVAÇÕES
1-A fonte "I2OF5TXT.TTF" deve estar instalada regularmente como fonte do Windows, em "C:Windows\fonts".
2-A sequência da variável "c_num25" deve estar precedida pelo caracter "(" e seguida pelo caracter ")". Estes 2 caracteres são responsáveis pela identificação de início e fim do código de barras.

Acredito que a exposição ficou bem clara e didática.

De qualquer forma estarei à tua disposição e de todos os colegas que necessitarem.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
hs_paulo
Usuário Nível 1
Usuário Nível 1
Mensagens: 25
Registrado em: 02 Set 2015 17:11
Localização: Bauru

Código de Barras 2 de 5

Mensagem por hs_paulo »

Estou tentando usar o I2OF5TXT, mas quando mando imprimir par números acima de 50, imprime símbolos que não são códigos de barra. Só sai corrento quando imprime pares menores que 50.

estou usando o exemplo postado pelo Hasse.
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Código de Barras 2 de 5

Mensagem por Hasse »

Verifique se realmente a variável c_num25 está saindo com os valores corretos.

Para facilitar esta verificação grave em arquivo TXT a sequência dos valores contidos nesta variável.

Eu acredito que o teu problema esteja nela, mas também pode estar em outro detalhe qualquer.

Outro detalhe muito importante: O número de caracteres numéricos PRECISA sem em pares, como no exemplo abaixo:

6577913645 -> 10 caracteres.

657791364 -> 9 caracteres, NÃO FUNCIONA.

Neste caso você completar com um ZERO na frente.

Isto porque o 2 OF 5 Interleaved, quer dizer que os números são intercalados de dois em dois, e por este motivo há necessidade ABSOLUTA que este número de caracteres numéricos seja PAR.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
hs_paulo
Usuário Nível 1
Usuário Nível 1
Mensagens: 25
Registrado em: 02 Set 2015 17:11
Localização: Bauru

Código de Barras 2 de 5

Mensagem por hs_paulo »

Hasse,

O numero que usei como exemplo é 149121.

Eu coloquei exatamente como esta seu exemplo, a unica linha que eu modifiquei foi :

c_numero := IIF( LEN( c_numero ) / 2 <> INT( LEN( c_numero ) / 2 ), "0" + c_numero, c_numero )

porque estava dando erro.

quando separa em pares, eu dei um display dos valores e aparecerem exatamente os pares que devem ser (14 91 21).

a impressão esta no arquivo em anexo.
Anexos
Teste.pdf
impressão
(49.6 KiB) Baixado 92 vezes
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Código de Barras 2 de 5

Mensagem por Hasse »

Nós precisamos ver o valor da variável C-Num25, antes de ser impressa.
Veja que os valores 14 e 91 estão sendo impressos corretamente.

Verifique e grave num arquivo TXT.

Podes até gravar no PDF, antes de imprimir o Código de Barras.

oPrinter:TextOut( c_num25, .T.)
oPrinter:NewLine() && possivelmente terás que cuidar para que as duas impressões não sejam sobrepostas.
oPrinter:TextAtFont( 20, n_posY+20 , "("+c_num25+")", 'I2OF5TXT', 24, 05 )
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
hs_paulo
Usuário Nível 1
Usuário Nível 1
Mensagens: 25
Registrado em: 02 Set 2015 17:11
Localização: Bauru

Código de Barras 2 de 5

Mensagem por hs_paulo »

Veja,

Voce se enganou, os numeros que imprimem corretos são o "14" e o "21", que são o primeiro e o ultimo par. O par do meio "91" que imprime errado, alias, qualquer numero maior que 50, imprime errado.

A variavel "c_num25" esta impressa na frente da barra, no pdf que esta no post anterior.

Obrigado pela paciencia.
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Código de Barras 2 de 5

Mensagem por Hasse »

OK. Você está correto. Eu só digitei errado.

Os número que são impressos corretamente são os 14 e 21. No PDF não vejo o 91.

É justamente por isso é que eu quero ver o conteúdo da variável c_num25, antes de ser enviado para a impressão do Código de Barras.
Estou desconfiado que não é 91 que é enviado para a impressão.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
hs_paulo
Usuário Nível 1
Usuário Nível 1
Mensagens: 25
Registrado em: 02 Set 2015 17:11
Localização: Bauru

Código de Barras 2 de 5

Mensagem por hs_paulo »

Segue o arquivo com as variaveis impressas e o resultado e o fonte que estou testando.
Anexos
teste.prg
Programa de teste
(1.14 KiB) Baixado 98 vezes
teste.pdf
(55.15 KiB) Baixado 72 vezes
Responder