Página 1 de 1
Impressão de código de barras Interleaved 2of5
Enviado: 17 Jun 2009 11:20
por billy1943
Venho pedir a ajuda para o problema que estou enfrentando:
- gero no meu sistema em Clipper um arquivo em .RTF para posteriormente imprimir via Word, os boletos bancários e o fonte utilizado é o INTERLEAVED 2 OF 5;
- tudo funcionou até agora bem, quando 1 (um) boleto saiu com o código de barra "comendo" dois caracteres e tornando o código ilegível na leitura ótica, apesar de que o código digitável saiu perfeito;
- a sequencia de caracteres que tem de ser gerada em código de barras é a seguinte:
00 19 44 47 80 00 00 76 50.......
- o código alfanumérico que acessará os fontes do Interleaved no mapa de caracteres citado tem a seguintes formação, após à conversão:
(0C\_Ì00++0001
-O código de barras trunca quando vai representar a barra invertida (\) que é o quarto caractere a converter e também omite o quinto caractere (_), respectivamente CHR(092) e CHR(095);
-quem conhece o .RTF sabe que a barra invertida (\) precede todo comando ou diretiva dentro do código texto do mesmo;
- assim, fica a pergunta: o que pode estar acontecendo ?
- será que a barra invertida é que está causando isso ?
- qual seria a solução ?
Se alguém já vivenciou esse problema agradeceria toda ajuda, pois esse boleto tem um vencimento para o ano de 2010 com fator de vencimento 4478 e como foi antecedido pelo 4 (DV do código de barras) formou o par 44 que gera o CHR(92) = barra inclinada
O problema é grande pois já tentei de tudo, e o par de caracteres em outra posição não causa problema.
Impressão de código de barras Interleaved 2of5
Enviado: 18 Jun 2009 09:19
por Pablo César
Interessante sua idéia, poderia postar seu código para nós ?. Dessa forma poderíamos testar juntos e fazer uso da rotina.
Cómo é feito a conversão ? Você fez o algorítimo ou tem uma lib externa ? Seria bom postar um exemplo. Sem ver seu código, até estou chutando a dizer que talvez o código que você está passando ou até o obtido após conversão deveria ser transformado para o tipo caracter. Veja se não é isso e aprezaria você postar exemplo do seu código.
Re: Impressão de código de barras Interleaved 2of5
Enviado: 18 Jun 2009 11:28
por billy1943
Ao Pablo César e outros colegas que possam ajudar neste problema, coloco aqui as explicações para entendimento:
//
// geração do código de barras no Recibo de Entrega e Ficha de Compensação
// bbarra = 44 caracteres que irao compor o código de barras já com o DV
// incluido na quinta posição
// Exemplo: 00 19 44 47 80 00 00 76 50 00 00 00 01 55 24 07 00 00 00 12 19 18
// boleto do Banco do Brasil, no valor de R$765,00 fator de vencimento 4478, DV 4
// no exemplo acima os espaços foram colocados somente para destaque
// notar que o problema está no terceiro conjunto = 44 que gerará o valor 92
// e que no Mapa de Caracteres do Interleaved 2of5 corresponde a barra inver-
// tida
// o exemplo acima gera o seguinte codigo quando usada a funcao NUMTO2OF5I
//
// (0C\_Ì00++0001+H7000<CB)
// coloco abaixo os valores do CHR porque cada editor apresenta as vezes de forma diferente
// CHR(028) CHR(048) CHR(067) CHR(092) CHR(095) CHR(222) CHR(048) CHR(048) CHR(218) CHR(192)
// CHR(048) CHR(048) CHR(048) CHR(049) CHR(197) CHR(072) CHR(055) CHR(048) CHR(048) CHR(048)
// CHR(060) CHR(067) CHR(066) CHR(028)
// trecho do programa fonte onde é gerado o código de barras do recibo entrega
// observação: \f30 = seta para o fonte Interleaved
// \fs36 = seta para o tamanho do fonte
// saida = valor do Handle de gravação para um arquivo .RTF
...
cbbarra := numto2of5i(bbarra)
fwrite(saida,"{\fs20 Assinatura/RG }")
fwrite(saida,"{\f30\fs36 " + cbbarra + "\par" + cbbarra + "}")
...
// trecho do programa fonte onde é gerado o codigo de barra da ficha de compen-
// sação
// observação: \f30 = seta o fonte Interleaved
// \fs36 = seta o tamanho do fonte
cbbarra := numto2of5i(bbarra)
fwrite(saida,"{\f30\fs36 " + cbbarra + "\par" + cbbarra + "\par"+ cbbarra +;
"\par}")
// aqui está a função onde são separados os algarismos 2 a 2
//
FUNCTION numto2of5i(numero)
local montagem := "("
local posicao := 1
local car2
do while posicao < len(numero)
car2 := substr(numero,posicao,2)
if val(car2) < 50
montagem += chr(val(car2) + 48 )
else
montagem += chr(val(car2) + 142 )
endif
posicao += 2
enddo
montagem := montagem + ")"
return (montagem)
Impressão de código de barras Interleaved 2of5
Enviado: 18 Jun 2009 14:12
por Pablo César
quem conhece o .RTF sabe que a barra invertida (\) precede todo comando ou diretiva dentro do código texto do mesmo
Acho que o problema possa estar mesmo aqui (na barra invertida). Tente transformar esse caracter decimal em caracter do tipo hexadecimal. Creio que para interpretar isso dentro do RTF tem qu abrir uma função +/- assim:
{\sp{\sn gtextUNICODE}{\sv \'53\'61\'6d\'70\'6c\'65\'20\'63\'6f\'6e\'76\'65\'72\'73\'69\'6f\'6e}} que é o equipávante a string: "Sample conversion"
Só não sei como é possivel concatenar isso. Mas por outro lado seria bom que postasse o arquivo RTF que você gerou e de preferência um correto para fazer comparações.
Re: Impressão de código de barras Interleaved 2of5
Enviado: 18 Jun 2009 14:48
por billy1943
ao Pablo César ou quem se interessou pelo meu problema, informo que após 2 (dois) dias "queimando neurônios" acho ter encontrado a solução, como diria Arquimedes, "Eureka":
como o problema se resumia na codificação de uma barra invertida "\" ou seja CHR(92), que para o .RTF tem especial significado, como diz o manual do mesmo:
As previously mentioned, the backslash (\) and braces ({ }) have special meaning in RTF. To use these characters as text, precede them with a backslash, as in \\, \{, and \}.
O que diz aí acima ?
"Como previamente mencionado, a barra invertida e os caracteres { e } tem especial significado no RTF. Para usar estes caracteres, preceda-os com uma barra invertida, como em \\, \{, e \}.
Assim corrigi a minha função para incluir uma barra invertida antes do caractere necessário ao código de barras.
Espero ter chegado a uma solução satisfatoria.
Fica aqui um alerta para nossos amigos Clippeiros, que coisas estranhas estão dentro de nossos códigos, porque em outras posições a barra invertida não causa problema...
FUNCTION numto2of5i(numero)
local monta := "("
local posicao := 1
local car2
do while posi < len(numero)
car2 := substr(numero,posicao,2)
if val(car2) < 50
if posi == 5
if val(car2) == 44 // CHR 92 ou \
monta += chr(val(car2) + 48 )
endif
endif
monta += chr(val(car2) + 48 )
else
monta += chr(val(car2) + 142 )
endif
posicao += 2
enddo
monta := monta + ")"
return (monta)
Impressão de código de barras Interleaved 2of5
Enviado: 18 Jun 2009 15:18
por Pablo César
Beleza então, achado o problema ! Eu pressumia que era isso (na minha mensagem anterior alertava o uso do "\") só que não sabia essa de usar "\" a mais para fechar. Valeu billy como aprendizado !
Impressão de código de barras Interleaved 2of5
Enviado: 18 Jun 2009 17:08
por billy1943
Alô, Pablo César;
Realmente valeu como aprendizado, a gente tem que ler tudo dos Manuais (mesmo que em puro inglês), e faço somente uma pequena correção ao material que já enviei ;
- o erro estava em
todo conjunto de caracteres "44" e não somente naquele enviado como exemplo;
- como o RTF vai percorrendo a string toda vez que encontrar a barra invertida ele assume o próximo caracter
Ufa !
- assim "data venia", permita-me colocar agora como deve ser a função que separa os caracteres a converter, dois a dois, corrigindo de vez a situação:
Código: Selecionar todos
******************************************
FUNCTION numto2of5i(numero)
*******************************************
local monta := "("
local posicao := 1
local car2
do while posi < len(numero)
car2 := substr(numero,posicao,2)
if val(car2) < 50
if val(car2) == 44 // -> CHR 92 ou \
monta += chr(val(car2) + 48 )
endif
monta += chr(val(car2) + 48 )
else
monta += chr(val(car2) + 142 )
endif
posicao += 2
enddo
monta := monta + ")"
return (monta)
E viva o Clipper !