Conforme prometido ao Itamar, segue o trecho desenvolvido no meu aplicativo para gerar o código de barras:
Código: Selecionar todos
FOR n_conta = 1 TO n_linlin
IF #CB# $ a_lin[1] .AND. n_conta == 1
a_lin[1] := SUBS( a_lin[1], 01, LEN( a_lin[1] ) - 04 )
c_numero := STRTRAN( SUBS( a_lin[1], 04, 07 ), ".", "" )
n_posY := oPrinter:posY
c_num25 := ""
FOR nn = 1 TO LEN(c_numero) step 2
nn1 := VAL(SUBS( c_numero, nn, 02 ))
c_num25 := c_num25 + CHR( nn1 + IF(nn1<=49,48,0) + IF(nn1>=50,142,0) )
NEXT nn
oPrinter:TextAtFont( 20, n_posY+20 , "("+c_num25+")", 'I2OF5TXT', 20, 06.5 )
oPrinter:TextOut( " "+a_lin[n_conta],.T.)
ELSE
oPrinter:TextOut(a_lin[n_conta],.T.)
ENDIF
NEXT n_conta
Veja o resultado deste código no Anexo no arquivo: "Planilha.pdf"
A minha aplicação ficou tão simples que decidi pesquisar um pouco mais e fornecer mais detalhes e opções para os interessados.
Seguem as instruções para gerar vários tipos de Código de Barras:
Para testar basta instalar as fontes que acompanham no Anexo, copiando elas para a pasta \Windows\Fontes.
Código: Selecionar todos
1-FREE3OF9.TTF
2-FRE3OF9X.TTF
3-I2OF5TXT.TTF
4-BARCODE FONT.TTF
5-BARCODING.TTF
6-CODE 128.TTF
7-C39HrP48DhTt.TTF
Compilar o TesteBarra.prg. O código é totalmente independente e funcional, e não necessita de qualquer LIB.
Código: Selecionar todos
******************************************************************************
*** SISTEMA.........: TESTEBARRA ***
*** MÓDULO..........: TESTEBARRA.PRG ***
*** PROGRAMADOR.....: IVO FRITZ HASSE ***
*** DATA:...........: 30/10/2009 V 0.0 ***
*** COMENTÁRIO:.....: Exemplo de impressão de Código de Barras. ***
******************************************************************************
*
#define FORM_A4 9
*
FUNCTION MAIN()
*
Clear
n_quality := -1 && Qualidade Draft
c_data := DTOC( Date() )
c_nomeDoc := "Teste-"+SUBS(c_data,07,02)+SUBS(c_data,04,02)+LEFT(c_data,02)+"="+Time()
*
*START_BAR( "PDFCreator" ,c_nomeDoc ) && Cria documento PDF e abre no Acrobat.
START_BAR( "PDF4U Adobe PDF Creator" ,c_nomeDoc ) && Cria documento PDF.
*START_BAR( , c_nomeDoc ) && Envia para a impressora padrão.
*
RETURN( .T. )
*
*
*----------------------------------------------------------------------------------------
FUNCTION IMPRIME()
*
n_tamHorz := 06 && Tamanho horizontal da barra.
n_tamVert := 30 && Tamanho vertical da barra.
n_posHorz := 50 && Coluna de início da barra.
*
*=== PRIMEIRA BARRA =====================================================================
*----- Veja instruções em "FREE3OF9.TXT" - funciona com letras e números ----------------
* É necessário colocar o caracter ´*´ antes e depois dos dados.
*
c_dados := "Luiz Antonio 33445566778899"
n_posY := oPrinter:posY + 200
oPrinter:TextAtFont( n_posHorz, n_posY+10 , "*"+c_dados+"*", 'Free 3 of 9 Extended', n_tamVert, n_tamHorz,,.T. )
oPrinter:TextOutAt( 1360, n_posY, "Formato 3 de 9 Extendido")
oPrinter:TextOutAt( 1360, n_posY+50, "N£meros e letras" )
oPrinter:TextOutAt( n_posHorz, n_posY+70, c_dados )
*
* ver abaixo a sintaxe da função TextAtFont() e TextOutAt() usadas acima.
*
*=== SEGUNDA BARRA ======================================================================
*----- Veja instruções em "FREE3OF9.TXT" - funciona somente com números -----------------
* É necessário colocar o caracter ´*´ antes e depois dos dados.
*
c_numer := "00324090004321"
n_posY := oPrinter:posY + 200
oPrinter:TextAtFont( n_posHorz, n_posY+10 , "*"+c_numer+"*", 'Free 3 of 9 Regular', n_tamVert, n_tamHorz,,.T. )
oPrinter:TextOutAt( 950, n_posY, "Formato ´3 de 9 Regular´ ")
oPrinter:TextOutAt( 950, n_posY+50, "S¢ n£meros" )
oPrinter:TextOutAt( n_posHorz, n_posY+70, c_numer )
*
*=== TERCEIRA BARRA =====================================================================
*----------------- Veja instruções em "I2OF5.txt" - funciona somente com números --------
* É necessário o cálculo dos valores, em pares, e adicionar o caracter ´(´ antes do valor,
* e o caracter ´)´ ao final da string antes da impressão.
*
c_numer := "00324090004321"
n_posY := oPrinter:posY + 200
c_num25 := ""
FOR nn = 1 TO LEN(c_numer) step 2
nn1 := VAL(SUBS( c_numer, nn, 02 ))
c_num25 := c_num25 + CHR( nn1 + IF(nn1<=49,48,0) + IF(nn1>=50,142,0) )
NEXT nn
oPrinter:TextAtFont( n_posHorz, n_posY+20 , "("+c_num25+")", 'I2OF5TXT', n_tamVert, n_tamHorz )
oPrinter:TextOutAt( 900, n_posY, "Formato ´2 de 5 Intercalado´")
oPrinter:TextOutAt( 900, n_posY+50, "S¢ n£meros" )
oPrinter:TextOutAt( n_posHorz+60, n_posY+80, c_numer )
*
*=== QUARTA BARRA =======================================================================
*---------------- Funciona com letras e números -----------------------------------------
*
c_numer := "Luiz Antonio 33445566778899"
n_posY := oPrinter:posY + 200
oPrinter:TextAtFont( n_posHorz, n_posY+10 , c_numer, 'Barcode font', n_tamVert, n_tamHorz,,.T. )
oPrinter:TextOutAt( 1560, n_posY, "Formato ´Barcode´")
oPrinter:TextOutAt( 1560, n_posY+50, "N£meros e letras" )
oPrinter:TextOutAt( n_posHorz, n_posY+80, c_numer )
*
*=== QUINTA BARRA =======================================================================
*---------------- Funciona com letras e números -----------------------------------------
*
c_numer := "Luiz Antonio 33445566778899"
n_posY := oPrinter:posY + 200
oPrinter:TextAtFont( n_posHorz, n_posY+10 , c_numer, 'Barcoding', n_tamVert, n_tamHorz,,.T. )
oPrinter:TextOutAt( 1500, n_posY, "Formato Barcoding" )
oPrinter:TextOutAt( 1500, n_posY+50, "N£meros e letras" )
oPrinter:TextOutAt( n_posHorz, n_posY+80, c_numer )
*
*=== SEXTA BARRA ========================================================================
*---------------- Funciona com letras e números -----------------------------------------
*
c_numer := "Luiz Antonio 33445566778899"
n_posY := oPrinter:posY + 200
oPrinter:TextAtFont( n_posHorz, n_posY+10 , c_numer, 'Code 128', n_tamVert, n_tamHorz,,.T. )
oPrinter:TextOutAt( 1560, n_posY, "Formato ´Code 128´")
oPrinter:TextOutAt( 1560, n_posY+50, "N£meros e letras" )
oPrinter:TextOutAt( n_posHorz, n_posY+80, c_numer )
*
*=== SÉTIMA, OITAVA E NONA BARRAS =======================================================
*---------------- Funciona com letras e números -----------------------------------------
*
c_numer := "Luiz Antonio 33445566778899"
n_posY := oPrinter:posY + 200
oPrinter:TextAtFont( n_posHorz, n_posY+10 , c_numer, 'C39HrP48DhTt', 30, 10,,.T. )
oPrinter:TextOutAt( 1000, n_posY, "Formato ´C39HrP48DhTt´")
oPrinter:TextOutAt( 1000, n_posY+50, "N£meros e letras" )
oPrinter:TextOutAt( n_posHorz, n_posY+80, c_numer )
*
n_posY := oPrinter:posY + 200
oPrinter:TextAtFont( n_posHorz, n_posY+10 , c_numer, 'C39HrP48DhTt', 30, 5,,.T. )
oPrinter:TextOutAt( 1800, n_posY, "Formato ´C39HrP48DhTt´")
oPrinter:TextOutAt( 1800, n_posY+50, "N£meros e letras" )
oPrinter:TextOutAt( n_posHorz, n_posY+80, c_numer )
*
n_posY := oPrinter:posY + 200
oPrinter:TextAtFont( n_posHorz, n_posY+10 , c_numer, 'C39HrP48DhTt', 20, 15,,.T. )
oPrinter:TextOutAt( 1000, n_posY, "Formato ´C39HrP48DhTt´")
oPrinter:TextOutAt( 1000, n_posY+50, "N£meros e letras" )
oPrinter:TextOutAt( n_posHorz, n_posY+80, c_numer )
*----------------------------------------------------------------------------------------
*
RETURN( .T. )
*
*
*----------------------------------------------------------------------------------------
FUNCTION START_BAR(cPrinter,cDoc)
PUBLIC oPrinter:= WIN32PRN():New(cPrinter), aFonts, x, nColFixed, nColTTF, nColCharSet, aForms
IF VALTYPE( n_quality ) == "N"
IF n_quality <> 0
oPrinter:SetPrintQuality( n_quality ) && qualidade da impressão.
ENDIF
ENDIF
oPrinter:Landscape := .F.
oPrinter:FormType := FORM_A4
oPrinter:Copies := 1
IF !oPrinter:Create()
Alert("NÆo foi poss¡vel criar o Documento de ImpressÆo ;; O PDFCreator foi instalado ?")
ELSE
IF !oPrinter:startDoc(cDoc)
Alert("In¡cio StartDoc() falhou" )
ELSE
*
oPrinter:SetFont('Courier New')
oPrinter:CharSet(255) && Charset para imprimir barra colorida.
*
IMPRIME() && Rotina de impressão dos
*
oPrinter:EndDoc()
*
ENDIF
*
oPrinter:Destroy()
*
ENDIF
*
RETURN
*
*
/*
oPrinter:textAtFont([<nPosX>] , ;
[<nPosY>] , ;
<cString> , ;
[<cFontName>] , ;
[<nPointSize>] , ;
[<nFontWidth>] , ;
[<nFontWeight>], ;
[<lUnderLine>] , ;
[<lItalic>] , ;
[<lNewLine>] , ;
[<lUpdatePosX>], ;
[<nTextColor>] , ;
[<nTextAlign>] ) --> lSuccess
oPrinter:textOutAt([<nPosX>] , ;
[<nPosY>] , ;
<cString> , ;
[<lNewLine>] , ;
[<lUpdatePosX>], ;
[<nTextAlign>] ) --> lSuccess
*/
Para criar PDF: (abrir no Acrobat) é necessária a instalação do PDFCreator, PDF4free, ou outro semelhante.
Conforme a necessidade, basta comentar e descomentar as linhas abaixo que se encontam bem no início do prg. Somente uma das 3 opções deve permanecer ativa:
"START_BAR( , c_string )"
"START_BAR( "PDFCreator" ,c_string )"
"START_BAR( "PDF4U Adobe PDF Creator" ,c_nomeDoc )"
O prg está bem documentado nos seus diversos trechos, e assim, mesmo para os iniciantes, será bem fácil eliminar as barras não desejadas.
De qualquer forma, podemos observar que é muito fácil utilizar os recursos da Classe Win32prn() para criar vários tipos de Códigos de Barras desde que tenhamos as fontes TTF delas.
Ao colega Itamar: As fontes que você me enviou não funcionaram, certamente porque está faltando alguma instrução, pois algumas são cheias de truques, como aquela 2OF5TXT.TTF. De qualquer forma, receba os meus agradecimentos.
1-Observar que o valor ´nPointSize´ é diretamente proporcional ao tamanho da barra.
2-O valor ´nFontWidth´ é inversamente proporcional ao tamanho da barra, e valores decimais não são interpretados.
3-Cada tipo de Código de Barras tem a sua própria proporção ideal entre os valores de ´nPointSize´ e ´nFontWidth´. Veja exemplo do 'C39HrP48DhTt' nas três últimas barras.
4-Mesmo os tipos que funcionam com letra e números, eles não aceitam caracteres acentuados e caracteres especiais. Li, em alguns sites, que há tipos de Código de Barras que aceitam alguns caracteres especiais e acentuados.
Vejam mais detalhes interessantes:
http://www.scb.com.br/secundarias/tiposdecodigos.htm
http://pt.wikipedia.org/wiki/C%C3%B3digo_de_barras