Primeiro, o crédito: o Robson SCOM me pediu, mas eu não tinha. Aí cutuquei o Leo Celista, que tinha a receita e me passou. E agora, 'autorizado' pelo Leo, eu distribuo pra todos. A propósito: o Alamino lembrou que tem um xHarbour Boleto ou coisa parecida, mas até onde eu soube ele imprime em HTML. Não que isto seja um impedimento, mas com o pacote que estou colocando no ar agora, dá pra imprimir via Win32prn().
Eu testei (só o "Barra 2 de 5 Intercalado", código do boleto) e funciona. O Robson também testou com sucesso. É só fazer, por exemplo (e resumidamente):
num:="12345678901234567890123456789012345678901234"
col=oprinter:mm_to_posX(100)
lin=oprinter:mm_to_posY(30)
setpos(col,lin)
oPrinter:SetFont('BARRAS BIRO',15,{3,25})
oPrinter:TextOutat(col,lin,Barra25i(num),.f.,.f.,1)
Precisa (obviamente) acertar a posição de impressão desejada através dos parâmetros das funções mm_to_posX e mm_to_posy, e também acertar a altura e comprimento da fonte (em oPrinter:SetFont('BARRAS BIRO',15,{3,25}))
No seguinte link, estão o arquivo da fonte TTF e também um arquivo PDF com as especificações técnicas de impressão do boleto (Banco do Brasil):
http://rapidshare.com/files/253360171/b ... o.zip.html
Bom proveito!
Eolo
Código: Selecionar todos
* Codigo de Barras Facil
*
* Estas funcoes para impressão de codigo de barras devem ser usadas com
* a fonte BARRAS2.TTF (Barras Biro).
*
* Esta fonte possui apenas as seguintes letras:
* f - espaco fino
* F - barra fina
* m - espaco medio
* M - barra media
* g - espaco grosso
* G - barra grossa
* s - espaco super grosso
* S - barra super grossa
* x - espaco extra grosso
* X - barra extra grossa
*
* As funcoes abaixo apenas geram sequencias de fFmMgGsSxX que vao
* formar as barras.
*
* Neste PRG seguem 5 exemplos de funcoes para geracao do codigo de
* barras 2 de 5 industrial, 2 de 5 intercalado, 3 de 9, EAN8, EAN13 e 128B.
*
* Para usar as funcoes abaixo basta chamar a funcao, passando o
* codigo desejado. Selecionar a fonte Barras Biro e o tamanho apropriado.
* Se a barra ficar muito estreita crie outra linha identica e cole
* embaixo.
*
* Exemplos:
*
* Barra25("1234567890") && Fonte Barras Biro, Tamanho 20
* Barra25i("1234567890") && Fonte Barras Biro, Tamanho 20
* Barra39("*1234567890*") && Fonte Barras Biro, Tamanho 20
*
*********************************************************************
* IMPORTANTE: *
* SEMPRE FACA MUITOS TESTES DE LEITURA COM VARIOS CODIGOS ANTES DE *
* LIBERAR A IMPRESSAO DE BARRAS PARA SEUS CLIENTES. *
*********************************************************************
*
* Esta fonte (BARRAS2.TTF Barras Biro) e as funcoes Barra25, Barra25i,
* Barra39, BarraEAN8, BarraEAN13 e Barra128B podem ser livremente usadas e
* alteradas.
*
* Claudio Gaspar Martins (cgmartins@biro.com.br)
* Biro Processamento de Dados Ltda
* Novo Hamburgo - RS - Brasil
* Dezembro, 1999
*
*
* Historico das revisoes (YYYY/MM/DD):
* 2001/02/28 - Corrigida tabela A nas funcoes EAN13 e EAN8
* 2003/08/21 - Adicionada função Barra128b para geração de barras padrão 128B
* Contribuição de Ezequiel Júnior Zemolin (ezequiel@slcagricola.com.br)
*
*
***
*
* Barra 2 de 5 Industrial
*
*
FUNCTION Barra25( tcNumero )
LOCAL lnT, lcRetorno, lnTamanho
LOCAL ARRAY laBarras(10)
lcRetorno = "GfGfFf" && Sequencia inicial
lnTamanho = LEN(tcNumero)
*-- Sequencias fixas
laBarras[1] = "FfFfGfGfFf"
laBarras[2] = "GfFfFfFfGf"
laBarras[3] = "FfGfFfFfGf"
laBarras[4] = "GfGfFfFfFf"
laBarras[5] = "FfFfGfFfGf"
laBarras[6] = "GfFfGfFfFf"
laBarras[7] = "FfGfGfFfFf"
laBarras[8] = "FfFfFfGfGf"
laBarras[9] = "GfFfFfGfFf"
laBarras[10] = "FfGfFfGfFf"
FOR lnT = 1 TO lnTamanho
lcRetorno = lcRetorno + laBarras[VAL(SUBSTR(tcNumero, lnT, 1)) + 1]
NEXT
*-- Acrescenta sequencia de finalizacao
lcRetorno = lcRetorno + "GfFfGf"
RETURN lcRetorno
***
*
* Barra 2 de 5 Intercalado
*
*
FUNCTION Barra25i( tcNumero )
*-- Variaveis
LOCAL lnT, lnU, lcBarras, lcEspacos, lcRetorno, lnTamanho
LOCAL ARRAY laBarras(10)
lcRetorno = "FfFf" && Sequencia inicial
lnTamanho = LEN(tcNumero)
*-- Sequencias
laBarras[1] = "00110"
laBarras[2] = "10001"
laBarras[3] = "01001"
laBarras[4] = "11000"
laBarras[5] = "00101"
laBarras[6] = "10100"
laBarras[7] = "01100"
laBarras[8] = "00011"
laBarras[9] = "10010"
laBarras[10] = "01010"
*-- Se quantidade de caracteres nao for par coloca 0 na frente
IF lnTamanho % 2 <> 0
tcNumero = "0" + tcNumero
ENDIF
FOR lnT = 1 TO lnTamanho STEP 2
*-- Pega os 0 e 1
lcBarras = laBarras[VAL(SUBSTR(tcNumero, lnT, 1)) + 1]
lcEspacos = laBarras[VAL(SUBSTR(tcNumero, lnT + 1, 1)) + 1]
*-- Combima as barras e os espacos
FOR lnU = 1 TO 5
lcRetorno = lcRetorno + IIF(SUBSTR(lcBarras, lnU, 1) == "0", "F", "G")
lcRetorno = lcRetorno + IIF(SUBSTR(lcEspacos, lnU, 1) == "0", "f", "g")
NEXT
NEXT
*-- Acrescenta sequencia de finalizacao
lcRetorno = lcRetorno + "GfFf"
RETURN lcRetorno
***
*
* Barra 3 de 9
*
* OBSERVACAO: Alguns leitores exigem o * como prefixo e sufixo do codigo
*
*
FUNCTION Barra39( tcNumero )
LOCAL lnT, lnPosicao, lcRetorno, lnTamanho, lcCaracteres
LOCAL ARRAY laBarras(44)
lcRetorno = ""
lnTamanho = LEN(tcNumero)
lcCaracteres = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-.#*$/+%"
*-- Sequencias
laBarras[1] = "GfFgFfFfGf"
laBarras[2] = "FfGgFfFfGf"
laBarras[3] = "GfGgFfFfFf"
laBarras[4] = "FfFgGfFfGf"
laBarras[5] = "GfFgGfFfFf"
laBarras[6] = "FfGgGfFfFf"
laBarras[7] = "FfFgFfGfGf"
laBarras[8] = "GfFgFfGfFf"
laBarras[9] = "FfGgFfGfFf"
laBarras[10] = "FfFgGfGfFf"
laBarras[11] = "GfFfFgFfGf"
laBarras[12] = "FfGfFgFfGf"
laBarras[13] = "GfGfFgFfFf"
laBarras[14] = "FfFfGgFfGf"
laBarras[15] = "GfFfGgFfFf"
laBarras[16] = "FfGfGgFfFf"
laBarras[17] = "FfFfFgGfGf"
laBarras[18] = "GfFfFgGfFf"
laBarras[19] = "FfGfFgGfFf"
laBarras[20] = "FfFfGgGfFf"
laBarras[21] = "GfFfFfFgGf"
laBarras[22] = "FfGfFfFgGf"
laBarras[23] = "GfGfFfFgFf"
laBarras[24] = "FfFfGfFgGf"
laBarras[25] = "GfFfGfFgFf"
laBarras[26] = "FfGfGfFgFf"
laBarras[27] = "FfFfFfGgGf"
laBarras[28] = "GfFfFfGgFf"
laBarras[29] = "FfGfFfGgFf"
laBarras[30] = "FfFfGfGgFf"
laBarras[31] = "GgFfFfFfGf"
laBarras[32] = "FgGfFfFfGf"
laBarras[33] = "GgGfFfFfFf"
laBarras[34] = "FgFfGfFfGf"
laBarras[35] = "GgFfGfFfFf"
laBarras[36] = "FgGfGfFfFf"
laBarras[37] = "FgFfFfGfGf"
laBarras[38] = "GgFfFfGfFf"
laBarras[39] = "FgGfFfGfFf"
laBarras[40] = "FgFfGfGfFf"
laBarras[41] = "FgFgFgFfFf"
laBarras[42] = "FgFgFfFgFf"
laBarras[43] = "FgFfFgFgFf"
laBarras[44] = "FfFgFgFgFf"
FOR lnT = 1 TO lnTamanho
lnPosicao = AT(SUBSTR(tcNumero, lnT, 1), lcCaracteres)
IF lnPosicao > 0
lcRetorno = lcRetorno + laBarras[lnPosicao]
ENDIF
NEXT
RETURN lcRetorno
***
*
* Barras EAN13
*
*
FUNCTION BarraEAN13( tcNumero )
LOCAL lnT, lcRetorno, lcSequencia
LOCAL ARRAY laBarras(4, 10)
lcRetorno = "FfF"
*-- Deve sempre ter 13 caracteres
IF LEN(tcNumero) <> 13
RETURN ""
ENDIF
*-- Tabela A
laBarras[1, 1] = "fffFFfF"
laBarras[1, 2] = "ffFFffF"
laBarras[1, 3] = "ffFffFF" && Corrigido em 20010228
laBarras[1, 4] = "fFFFFfF"
laBarras[1, 5] = "fFfffFF"
laBarras[1, 6] = "fFFfffF"
laBarras[1, 7] = "fFfFFFF"
laBarras[1, 8] = "fFFFfFF"
laBarras[1, 9] = "fFFfFFF"
laBarras[1, 10] = "fffFfFF"
*-- Tabela B
laBarras[2, 1] = "fFffFFF"
laBarras[2, 2] = "fFFffFF"
laBarras[2, 3] = "ffFFfFF"
laBarras[2, 4] = "fFffffF"
laBarras[2, 5] = "ffFFFfF"
laBarras[2, 6] = "fFFFffF"
laBarras[2, 7] = "ffffFfF"
laBarras[2, 8] = "ffFfffF"
laBarras[2, 9] = "fffFffF"
laBarras[2, 10] = "ffFfFFF"
*-- Tabela C
laBarras[3, 1] = "FFFffFf"
laBarras[3, 2] = "FFffFFf"
laBarras[3, 3] = "FFfFFff"
laBarras[3, 4] = "FffffFf"
laBarras[3, 5] = "FfFFFff"
laBarras[3, 6] = "FffFFFf"
laBarras[3, 7] = "FfFffff"
laBarras[3, 8] = "FfffFff"
laBarras[3, 9] = "FffFfff"
laBarras[3, 10] = "FFFfFff"
*-- Tabela para definir primeiro caracter
laBarras[4, 1] = "111111"
laBarras[4, 2] = "112122"
laBarras[4, 3] = "112212"
laBarras[4, 4] = "112221"
laBarras[4, 5] = "121122"
laBarras[4, 6] = "122112"
laBarras[4, 7] = "122211"
laBarras[4, 8] = "121212"
laBarras[4, 9] = "121221"
laBarras[4, 10] = "122121"
*-- Pega a sequencia de tabela a usar
lcSequencia = laBarras[4, VAL(SUBSTR(tcNumero, 1, 1)) + 1]
*-- Apura do 2' ao 7' caracter
FOR lnT = 2 TO 7
lcRetorno = lcRetorno +;
laBarras[VAL(SUBSTR(lcSequencia, lnT - 1, 1)),;
VAL(SUBSTR(tcNumero, lnT, 1)) + 1]
NEXT
*-- Coloca o meio
lcRetorno = lcRetorno + "fFfFf"
*-- Apura do 8' ao 13'
FOR lnT = 8 TO 13
lcRetorno = lcRetorno +;
laBarras[3, VAL(SUBSTR(tcNumero, lnT, 1)) + 1]
NEXT
*-- Acrescenta sequencia de finalizacao
lcRetorno = lcRetorno + "FfF"
RETURN lcRetorno
***
*
* Barras EAN8
*
*
FUNCTION BarraEAN8( tcNumero )
LOCAL lnT, lcRetorno
LOCAL ARRAY laBarras(2, 10)
lcRetorno = "FfF"
*-- Deve sempre ter 8 caracteres
IF LEN(tcNumero) <> 8
RETURN ""
ENDIF
*-- Tabela A
laBarras[1, 1] = "fffFFfF"
laBarras[1, 2] = "ffFFffF"
laBarras[1, 3] = "ffFffFF" && Corrigido em 20010228
laBarras[1, 4] = "fFFFFfF"
laBarras[1, 5] = "fFfffFF"
laBarras[1, 6] = "fFFfffF"
laBarras[1, 7] = "fFfFFFF"
laBarras[1, 8] = "fFFFfFF"
laBarras[1, 9] = "fFFfFFF"
laBarras[1, 10] = "fffFfFF"
*-- Tabela C
laBarras[2, 1] = "FFFffFf"
laBarras[2, 2] = "FFffFFf"
laBarras[2, 3] = "FFfFFff"
laBarras[2, 4] = "FffffFf"
laBarras[2, 5] = "FfFFFff"
laBarras[2, 6] = "FffFFFf"
laBarras[2, 7] = "FfFffff"
laBarras[2, 8] = "FfffFff"
laBarras[2, 9] = "FffFfff"
laBarras[2, 10] = "FFFfFff"
*-- Apura do 1' ao 4' caracter
FOR lnT = 1 TO 4
lcRetorno = lcRetorno +;
laBarras[1, VAL(SUBSTR(tcNumero, lnT, 1)) + 1]
NEXT
*-- Coloca o meio
lcRetorno = lcRetorno + "fFfFf"
*-- Apura do 5' ao 8'
FOR lnT = 5 TO 8
lcRetorno = lcRetorno +;
laBarras[2, VAL(SUBSTR(tcNumero, lnT, 1)) + 1]
NEXT
*-- Acrescenta sequencia de finalizacao
lcRetorno = lcRetorno + "FfF"
RETURN lcRetorno
***
*
* Barras Padrão 128-B
* Contribuição de Ezequiel Júnior Zemolin (ezequiel@slcagricola.com.br)
*
*
FUNCTION Barra128B( tcNumero )
LOCAL lnT, lnPosicao, lcRetorno, lnTamanho, lcCaracteres, lnCheck
LOCAL ARRAY laBarras(106)
lcRetorno = "MfFmFs"
lnTamanho = LEN(tcNumero)
lnCheck = 104
lcCaracteres = " !^#$%&~()*+,-.;0123456789Çç<=>:@ABCDEFGHIJKLMNOPQRSTUVWXYZ']["+;
["_~abcdefghijklmnopqrstuvwxyz]
*-- Sequencias
laBarras[1] = "MfMmMm"
laBarras[2] = "MmMfMm"
laBarras[3] = "MmMmMf"
laBarras[4] = "FmFmMg"
laBarras[5] = "FmFgMm"
laBarras[6] = "FgFmMm"
laBarras[7] = "FmMmFg"
laBarras[8] = "FmMgFm"
laBarras[9] = "FgMmFm"
laBarras[10] = "MmFmFg"
laBarras[11] = "MmFgFm"
laBarras[12] = "MgFmFm"
laBarras[13] = "FfMmGm"
laBarras[14] = "FmMfGm"
laBarras[15] = "FmMmGf"
laBarras[16] = "FfGmMm"
laBarras[17] = "FmGfMm"
laBarras[18] = "FmGmMf"
laBarras[19] = "MmGmFf"
laBarras[20] = "MmFfGm"
laBarras[21] = "MmFmGf"
laBarras[22] = "MfGmFm"
laBarras[23] = "MmGfFm"
laBarras[24] = "GfMfGf"
laBarras[25] = "GfFmMm"
laBarras[26] = "GmFfMm"
laBarras[27] = "GmFmMf"
laBarras[28] = "GfMmFm"
laBarras[29] = "GmMfFm"
laBarras[30] = "GmMmFf"
laBarras[31] = "MfMfMg"
laBarras[32] = "MfMgMf"
laBarras[33] = "MgMfMf"
laBarras[34] = "FfFgMg"
laBarras[35] = "FgFfMg"
laBarras[36] = "FgFgMf"
laBarras[37] = "FfMgFg"
laBarras[38] = "FgMfFg"
laBarras[39] = "FgMgFf"
laBarras[40] = "MfFgFg"
laBarras[41] = "MgFfFg"
laBarras[42] = "MgFgFf"
laBarras[43] = "FfMfGg"
laBarras[44] = "FfMgGf"
laBarras[45] = "FgMfGf"
laBarras[46] = "FfGfMg"
laBarras[47] = "FfGgMf"
laBarras[48] = "FgGfMf"
laBarras[49] = "GfGfMf"
laBarras[50] = "MfFgGf"
laBarras[51] = "MgFfGf"
laBarras[52] = "MfGfFg"
laBarras[53] = "MfGgFf"
laBarras[54] = "MfGfGf"
laBarras[55] = "GfFfMg"
laBarras[56] = "GfFgMf"
laBarras[57] = "GgFfMf"
laBarras[58] = "GfMfFg"
laBarras[59] = "GfMgFf"
laBarras[60] = "GgMfFf"
laBarras[61] = "GfSfFf"
laBarras[62] = "MmFsFf"
laBarras[63] = "SgFfFf"
laBarras[64] = "FfFmMs"
laBarras[65] = "FfFsMm"
laBarras[66] = "FmFfMs"
laBarras[67] = "FmFsMf"
laBarras[68] = "FsFfMm"
laBarras[69] = "FsFmMf"
laBarras[70] = "FfMmFs"
laBarras[71] = "FfMsFm"
laBarras[72] = "FmMfFs"
laBarras[73] = "FmMsFf"
laBarras[74] = "FsMfFm"
laBarras[75] = "FsMmFf"
laBarras[76] = "MsFmFf"
laBarras[77] = "MmFfFs"
laBarras[78] = "SfGfFf"
laBarras[79] = "MsFfFm"
laBarras[80] = "FgSfFf"
laBarras[81] = "FfFmSm"
laBarras[82] = "FmFfSm"
laBarras[83] = "FmFmSf"
laBarras[84] = "FfSmFm"
laBarras[85] = "FmSfFm"
laBarras[86] = "FmSmFf"
laBarras[87] = "SfFmFm"
laBarras[88] = "SmFfFm"
laBarras[89] = "SmFmFf"
laBarras[90] = "MfMfSf"
laBarras[91] = "MfSfMf"
laBarras[92] = "SfMfMf"
laBarras[93] = "FfFfSg"
laBarras[94] = "FfFgSf"
laBarras[95] = "FmMgFm"
laBarras[96] = "FfSfFg"
laBarras[97] = "FfSgFf"
laBarras[98] = "SfFfFg"
laBarras[99] = "SfFgFf"
laBarras[100]= "FfGfSf"
laBarras[101]= "FfSfGf"
laBarras[102]= "GfFfSf"
laBarras[103]= "SfFfGf"
laBarras[104]= "MfFfSm"
laBarras[105]= "MfFmFs"
laBarras[106]= "MfFmGm"
FOR lnT = 1 TO lnTamanho
lnPosicao = AT(SUBSTR(tcNumero, lnT, 1), lcCaracteres)
IF lnPosicao > 0
lcRetorno = lcRetorno + laBarras[lnPosicao]
ENDIF
lnCheck = lnCheck + ((lnPosicao - 1) * lnT)
NEXT
lcRetorno = lcRetorno + laBarras[lnCheck % 103 + 1]
lcRetorno = lcRetorno + "MgGfFfM"
RETURN lcRetorno
*-- Fim



