Página 2 de 3
Re: Código de Barras 2 de 5
Enviado: 03 Nov 2009 15:59
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().
Re: Código de Barras 2 de 5
Enviado: 03 Nov 2009 17:31
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
Re: Código de Barras 2 de 5
Enviado: 03 Nov 2009 18:15
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).
Re: Código de Barras 2 de 5
Enviado: 03 Nov 2009 18:28
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
Re: Código de Barras 2 de 5
Enviado: 04 Nov 2009 13:35
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.
Re: Código de Barras 2 de 5
Enviado: 05 Nov 2009 07:25
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.
Re: Código de Barras 2 de 5
Enviado: 19 Fev 2010 17:18
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.
Re: Código de Barras 2 de 5
Enviado: 19 Fev 2010 21:41
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.
Código de Barras 2 de 5
Enviado: 02 Set 2015 17:22
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.
Código de Barras 2 de 5
Enviado: 02 Set 2015 17:57
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.
Código de Barras 2 de 5
Enviado: 03 Set 2015 12:40
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.
Código de Barras 2 de 5
Enviado: 03 Set 2015 12:57
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 )
Código de Barras 2 de 5
Enviado: 03 Set 2015 13:53
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.
Código de Barras 2 de 5
Enviado: 03 Set 2015 14:33
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.
Código de Barras 2 de 5
Enviado: 03 Set 2015 15:18
por hs_paulo
Segue o arquivo com as variaveis impressas e o resultado e o fonte que estou testando.