Impressao de Etiqueta com Papel A4

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Impressao de Etiqueta com Papel A4

Mensagem por frazato »

Bom dia, estou tentando fazer uma rotina para impressão de etiqueta com codigo de barras em papel A4 usando o xharbour, esta etiqueta esta em forma com 3 carreiras, gostaria se possivel alguem que vá fez isso para me dar uma luz porque nao consigo alinhar as etiquetas por nada, ate consegui imprimir as barras e logo mais quanto tenho que pular para outra a coisa nao vai.


Frazato
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Impressao de Etiqueta com Papel A4

Mensagem por Pablo César »

Olá colega, tudo vai depender de como quiser fazer a impressão: modo gráfico ou não. Eu não trabalho com xHarbour, mas seja como for, a minha dica é criar vetores com o a posição de cada etiqueta, sejam linhas e em colunas, seja em pixels ou não.
Outra ideia que se me ocorre é utilizar um aplicativo de terceiros, de preferência gratuito que através de arquivo intermediário como .CSV possa a vir a mesclar os dados com um formulário predefinido. Um que estou em vista é Presilo.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Impressao de Etiqueta com Papel A4

Mensagem por frazato »

Tem que ser grafico, pois o cliente quer com codigo de Barras e fonte maior no preco e colocar um logo, ate consegui fazer algo usando o WIN32PRN mais to levando um pau para ajustar a impressao, pois tenho que ficar imprimindo o tempo todo, haja folha.. e acerta uma coisa ele muda acerta outra coisa ele muda tudo..


Frazato
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Impressao de Etiqueta com Papel A4

Mensagem por Eolo »

Frazato, montei uma rotina, acho que servirá pra vc. Eu imprimo 2 colunas, 9 linhas, são 18 etiquetas por folha A4. Acho que fica fácil de vc colocar 3 colunas, mais linhas etc.

Não sei como anexar as FONTES ao post... :-( Se algum moderador estiver no ar, por favor ajude...

Em tempo, peguei a minha rotina e tirei algumas coisas que só fazem sentido no meu sistema. Se alguma coisa estiver faltando ou não muito clara, "prende o grito!" (como diz o Leonardo Sygecom).

Código: Selecionar todos

do whil .t.
  oPrinter := Win32Prn():new(printer)
  oPrinter:setPrintQuality(-1)
  oPrinter:formtype(9) // A4
  eolo=oPrinter:create()
  if eolo=.f.
    exit
  endi
  eolo=oPrinter:startDoc()
  if eolo=.f.
    exit
  endi
  oprinter:setbkmode(1)
  oprinter:setpen(0,2,0)

  priv lar,alt,pix
  lar=oprinter:pagewidth  // captura a largura da página
  alt=oprinter:pageheight // ...altura
  pix("r") // função abaixo

  ********** CHECA FONTES
  * as fontes devem ser instaladas no Windows
  afontes:=oprinter:getfonts()
  if !(ascan(afontes,{|aa| upper(aa[1])=="BARRAS BIRO"})>0) .and. ;
    (ascan(afontes,{|bb| upper(bb[1])=="ARIAL ROUNDED MT BOLD"})>0)
    oPrinter:destroy()
    * mensagem = fonte ausente
    retu
  endi
  exit
endd
if eolo=.f.
  oPrinter:destroy()
  pfs()
  * mensagem = incapaz de imprimir
  retu
endi

sele nprod
set orde to "001" // campo contem branco ou X (marcado antes pelo usuário)

priv imprime,lado
priv nome00,nome01,nome02,Lnome01
imprime=0
lado=1 // imprime coluna 1 ou 2
do whil .t.
  seek "X"
  if !found()
    exit
  endi
  for x=1 to copias // usuário escolhe antes quantas cópias quer
    if imprime=18 // são 18 etiquetas em cada folha, 2 COLUNAS de 9
      oprinter:newpage()
      imprime=0
      lado=1
    endi
    imprime++
    oPrinter:SetFont('ARIAL ROUNDED MT BOLD', 23, {3,33}, 400 )
    oPrinter:setColor(preto00) // oPrinter:setColor(preto75)
 
   * nprod->nnome contem o nome do produto, com 60 caracteres
    * na etiqueta, vai sair em 1 ou 2 linhas, pra acomodar

    nome00=alltrim(nprod->nnome)+" "
    do whil .t.  // tira brancos duplicados
      if at("  ",nome00)=0
        exit
      endi
      nome00=strtran(nome00,"  "," ")
    endd
    nome01:=""
    nome02:=""
    Lnome01=.t.
    do whil .t.
      if len(nome00)=0
        exit
      endi
      if oprinter:gettextwidth(nome01+substr(nome00,1,at(" ",nome00)-1))<(1100*pix) .and. Lnome01=.t.
        if len(nome01)#0
          nome01=nome01+" "
        endi
        nome01=nome01+substr(nome00,1,at(" ",nome00)-1)
        nome00=substr(nome00,at(" ",nome00)+1,len(nome00))
      else
        Lnome01=.f.
        if len(nome02)#0
          nome02=nome02+" "
        endi
        if oprinter:gettextwidth(nome02+substr(nome00,1,at(" ",nome00)-1))<(1100*pix)
          nome02=nome02+substr(nome00,1,at(" ",nome00)-1)
          nome00=substr(nome00,at(" ",nome00)+1,len(nome00))
        else
          exit
        endi
      endi
    endd

    * imprime nome linha 1
    lar=iif(lado=1,1117*pix,2357*pix)
    alt=(119*pix)+((round(imprime/2,0)-1)*(354*pix))
    setpos(lar,alt)
    oPrinter:TextOutat(lar,alt,hb_oemtoansi(nome01),.f.,.f.,alinha(1)) // função abaixo

    * imprime nome linha 2
    lar=iif(lado=1,1117*pix,2357*pix)
    alt=(218*pix)+((round(imprime/2,0)-1)*(354*pix))
    setpos(lar,alt)
    oPrinter:TextOutat(lar,alt,hb_oemtoansi(nome02),.f.,.f.,alinha(1))

    * código de barras
    priv xxxxx:=alltrim(str(nprod->nbarr))
    if len(xxxxx)=13
      xxxxx:=barraean13(xxxxx)
    elseif len(xxxxx)=8
      xxxxx:=barraean8(xxxxx)
    else
      xxxxx=padl(xxxxx,13,"0")
      xxxxx:=barraean13(xxxxx)
    endi

    * número do código de barras
    oPrinter:SetFont('Barras Biro',20,{3,7}, 400 )
    oPrinter:setColor(preto00)
    lar=iif(lado=1,19*pix,1259*pix)
    alt=(310*pix)+((round(imprime/2,0)-1)*(354*pix))
    setpos(lar,alt)
    oPrinter:TextOutat(lar,alt,xxxxx,.f.,.f.,alinha(0))

    * imprime código de barras em número
    oprinter:SetFont('VERDANA', 5, {3,45}, 400 )
    oPrinter:setColor(preto00)
    lar=iif(lado=1,19*pix,1259*pix)
    alt=(334*pix)+((round(imprime/2,0)-1)*(354*pix))
    setpos(lar,alt)
    oPrinter:TextOutat(lar,alt,hb_oemtoansi(alltrim(str(nprod->nbarr))),.f.,.f.,alinha(0))

    * imprime valor
    oPrinter:SetFont('ARIAL ROUNDED MT BOLD', 27, {3,15}, 700 )
    oPrinter:setColor(preto00)
    lar=iif(lado=1,1129*pix,2369*pix)
    alt=(334*pix)+((round(imprime/2,0)-1)*(354*pix))
    setpos(lar,alt)

    * nprod->nprom = preço promoção
    * nprod->nprec = preço normal
    if strzero(nprod->nprom,7,2)=="0000.00"
      oPrinter:TextOutat(lar,alt,hb_oemtoansi("R$"+tran(nprod->nprec,"@E 9,999.99")),.f.,.f.,alinha(1))
    else
      oPrinter:TextOutat(lar,alt,hb_oemtoansi(".R$"+tran(nprod->nprom,"@E 9,999.99")),.f.,.f.,alinha(1))
    endi

    * imprime linha horizontal separadora
    lar=oprinter:pagewidth
    alt=(345*pix)+((round(imprime/2,0)-1)*(354*pix))
    setpos(lar,alt)
    oprinter:line(1,alt,lar,alt)

    if lado=1
      * imprime linha separadora vertical
      lar=1200*pix
      alt=(345*pix)+((round(imprime/2,0)-1)*(354*pix))
      oprinter:line(lar,1,lar,alt)
    endi
    lado=iif(lado=1,2,1)
  next

  * desmarca o X no produto 
  repl marca with " "

  dbcommit()
endd
oPrinter:endDoc()
oPrinter:destroy()


function pix(orienta)
* número de pixels disponíveis na folha depende da QUALIDADE de impressão
* as variáveis LAR e ALT contêm os pixels em cada caso
if orienta="r" // retrato
  if     (abs(int(lar/1)-2480)<20) .and. (abs(int(alt/1)-3507)<20)
    * rascunho
    pix=1
  elseif (abs(int(lar/2)-2480)<20) .and. (abs(int(alt/2)-3507)<20)
    * regular
    pix=2
  elseif (abs(int(lar/3)-2480)<20) .and. (abs(int(alt/3)-3507)<20)
    * bom
    pix=3
  elseif (abs(int(lar/4)-2480)<20) .and. (abs(int(alt/4)-3507)<20)
    * ótimo
    pix=4
  else
    pix=4
  endi
elseif orienta="p" // paisagem
  if     (abs(int(lar/1)-3507)<20) .and. (abs(int(alt/1)-2480)<20)
    pix=1
  elseif (abs(int(lar/2)-3507)<20) .and. (abs(int(alt/2)-2480)<20)
    pix=2
  elseif (abs(int(lar/3)-3507)<20) .and. (abs(int(alt/3)-2480)<20)
    pix=3
  elseif (abs(int(lar/4)-3507)<20) .and. (abs(int(alt/4)-2480)<20)
    pix=4
  else
    pix=4
  endi
endi

function alinha(x)
* alinhamento à direita, esquerda e centro
priv y
if alinha32==100 // xHarbour 100
  y=x
elseif alinha32==121 // xHarbour 121
  if x=0
    y=0
  elseif x=1
    y=2
  elseif x=2
    y=6
  endi
endi
retu y

* funções ean8, ean13 etc estão em anexo ao post

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
PRIV lnT, lcRetorno, lnTamanho
*LOCAL ARRAY laBarras(10)
priv 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)
priv 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)
priv 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)
priv 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)
priv 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)
priv 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

O resultado disso é o seguinte:
Imagem
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Impressao de Etiqueta com Papel A4

Mensagem por Eolo »

Pablo, recebi sua msg e é o seguinte: queria anexar os arquivos das FONTES (BARRAS2.TTF e ARLRDBD0.TTF), que uso no formulário que mostrei. Não sei se o Frazato tem essas fontes...

Frazato, complementando: com a Win32prn, dá pra imprimir também a logomarca do seu cliente nas etiquetas. É só algumas linhas na rotina.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Impressao de Etiqueta com Papel A4

Mensagem por Pablo César »

Ahhh sim entendi agora. Compacte ou zip os arquivos e na hora de postar a mensagem veja em "Anexar arquivo", depois é só escolher o arquivo zip ou rar e adicionar arquivo e depois "Enviar" a mensagem normalmente.

Como anexar arquivos compactados nas mensagens
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Impressao de Etiqueta com Papel A4

Mensagem por frazato »

Eolo! show de bola vou dar uma olhada qq coisa eu grito, muito obrigado a vc e ao Pablo.

Frazato
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Impressao de Etiqueta com Papel A4

Mensagem por Eolo »

As fontes em anexo.
Obrigado, Pablo.
Anexos
Fontes.zip
(27.51 KiB) Baixado 315 vezes
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Impressao de Etiqueta com Papel A4

Mensagem por Eolo »

Frazato, adiantando algumas respostas:
- a impressão é em pixels, então se vc precisar 3 colunas (ao invés de 2), vc precisa diminuir o tamanho, espaçamento e altura das fontes e reposicionar a impressão pros novos endereços ("linha/coluna") em pixels.
- imprimi uma folha com 18 etiquetas, mas se vc imprimir por exemplo só 5 etiquetas, é o que vai sair no papel
- vc pode, se quiser, incluir CORES nas fontes (tipo o preço em vermelho etc).
- eu uso o modo rascunho no cliente (porque essas são etiquetas que vão nas gôndolas, portanto não são usadas com leitor). Se o seu cliente for usar leitor, talvez o leitor "não goste" muito do modo rascunho. Aí vc muda pro modo regular ou bom. Mas avisa o cliente que vai gastar tinta.. hehehe
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Impressao de Etiqueta com Papel A4

Mensagem por Pablo César »

De nada rapazes, disponham !

Puxa muito legal seu exemplo, Eolo !

Vou compilar e testa-lo... valeu !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Impressao de Etiqueta com Papel A4

Mensagem por Eolo »

Frazato, uma montagem com dois outros exemplos:
- a mesma etiqueta do exemplo anterior, mas em tamanho maior (uma por linha) e em cores
- um crachá (onde sai impresso a logomarca do cliente).

Pra imprimir a logomarca é só incluir as seguintes linhas, apontando sempre um arquivo BMP:

Código: Selecionar todos

priv arq:=_pat+"\0703\cheque\imagem\logo.bmp"
if file(arq)
  oWin32Bmp := Win32Bmp():new()
  oWin32Bmp:loadFile(arq)
  x1=85*pix
  y1=85*pix
  x2=295*pix
  y2=85*pix
  oWin32Bmp:draw( oprinter,  { x1, y1, x2, y2 } )
endi
Dica: não se preocupe com o tamanho da imagem. O xHarbour ajusta a imagem dentro das coordenadas x1, y1, x2, y2 que vc definir.

Só tome cuidado com o seguinte: se vc colocar 395 ao invés do 295 (no exemplo acima), a imagem vai ficar "esticada". Então, mantenha a PROPORÇÃO altura/largura do BMP original. Por exemplo, se a imagem tem 1063 x 650 pixels e você quer diminuir a largura para 200, use uma regra de 3 pra achar a nova altura proporcional:

1063 = 200
650 = ?
? = (200*650)/1063 -> 122

Imagem
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Impressao de Etiqueta com Papel A4

Mensagem por frazato »

Bem lega mesmo, a unica coisa que seria legal se possivel é visualizar antes de imprimir ou comecar a imprimir apartir de uma etiqueta, olha que estou na brica mais ta dificil, mais muito obrigado pelas dicas e o codigo fonte.


Olhando em uma pasta do Five achei um codigo e adaptei ele para a minha nescessidade, fazendo um programa aparte apenas para impressao de etiquetas usando o meu sistema para criar um arquivo e apartir dele gerar as etiquetas.


Segue pacote q estou testando.( nao consigo anexar o pacote com o executavel )


Obs( entendo quase que nada de Five)

Frazato

Código: Selecionar todos

// FiveWin labels!!! done with FiveWin !!!

#include "FiveWin.ch"

#define HORZ_LABELS   3
#define VERT_LABELS   10//  10 // 6

Static wTags := {}, cMsgLinha := 'Troca somente com a etiqueta'

//----------------------------------------------------------------------------//

function Main()

   local oWnd,oBrush

   SET _3DLOOK ON

   If !File('ServEtq.dbf')
       Alert('Falta arquivo contendo lista [ServEtq.dbf]')
   Endif
   Close all
      Sele 1
        Use ServEtq Alias TAG
        CarregaDBF()


   cBitmap := 'fundo.bmp'

  *DEFINE BRUSH oBrush STYLE TILED       // FiveWin new predefined Brushes

   DEFINE BRUSH oBrush FILE cBitmap

   DEFINE WINDOW oWnd TITLE "...### JAF Desenv. Emissao de Etiquetas ###...";
          BRUSH oBrush
   

   @ 2, 2 BUTTON "&Imprimir Etiquetas" SIZE 120, 35 OF oWnd ;
      ACTION GenerateLabels()

   @ 6, 2 BUTTON "&Posicionar Etiquetas" SIZE 120, 35 OF oWnd ;
      ACTION PosicionarETQ()

   @ 10, 2 BUTTON "&Ver Etiquetas" SIZE 120, 35 OF oWnd ;
      ACTION SelecionarEtiquetas()

   @ 02, 32 BUTTON "&Limpa Selecao" SIZE 120, 35 OF oWnd ;
      ACTION ZAPEA()


   ACTIVATE WINDOW oWnd MAXIMIZED
   Close All

return nil

//----------------------------------------------------------------------------//

function GenerateLabels()

   local oPrinter, oFont
   local nWidth, nHeight, nMargin, nLblWidth, nLblHeight
   local n, m, nRow := 5 , nCol := 5



   PRINTER oPrinter FROM USER ;
      NAME "Fivewin Labels" PREVIEW

   DEFINE FONT oFont NAME "Times New Roman" SIZE 0, -10 ;
      OF oPrinter

   DEFINE FONT oFont2 NAME "Times New Roman" SIZE 0, -24 ;
      OF oPrinter


   DEFINE FONT oFontBarras NAME "Barcode Font" SIZE -64, -16 ; //84,24
      OF oPrinter


   nLblWidth  = oPrinter:nHorzRes() / HORZ_LABELS
   nLblHeight = oPrinter:nVertRes() / VERT_LABELS
   nMargin    = Int( oPrinter:nLogPixelX() * 0.2 )
   nEtqInicio := 2


   CursorWait()

   oPrinter:StartPage()

   nEtqImpressa:= 0
   nPosTag     := 1

   For x:= 1 to Len(wTags)
        nLinha:= 0
        for m := 1 to HORZ_LABELS
          If nPosTag+m > Len(wTags)
             Exit // Acabou as Etiquetas 
          Endif
          cBarras := wTags[nPosTag,1]
          cPlu    := wTags[nPosTag,2]
          cDesc   := wTags[nPosTag,3]
          cExtras := wTags[nPosTag,4]

          nEtqImpressa++
          nPosTag ++ 


         oPrinter:Box( nRow, nCol, nRow + nLblHeight - 20, nCol + nLblWidth - 50 )

         oPrinter:Say( nRow,nCol, cPlu+' '+Trim(cDesc), oFont )
         nLinha := nRow + oFont:nHeight
         oPrinter:Say( nLinha,nCol, Trim(cExtras), oFont2 )

         nLinha := nRow + oFont:nHeight
         oPrinter:Say( nLinha+300,nCol, Trim( cBarras), oFontBarras )

         If !Empty(cDesc)
             nLinha := nRow + oFont:nHeight
             oPrinter:Say( nLinha+450,nCol, Trim(cMsgLinha), oFont )
         Endif

         If !Empty(cDesc)
                 oPrinter:SayBitmap( nRow + (nLblHeight/5) +100,;
                                     nCol + ( nLblWidth/2 )+210,;
                                     "Logotipo.bmp", (nLblWidth-100) / 3,;
                                     nLblHeight / 1.8 )
         Endif
         nCol += nLblWidth
      next
      nRow += nLblHeight
      nCol  = 5

      If nEtqImpressa>=30
               oPrinter:EndPage()
               oPrinter:StartPage()
               nLblWidth  = oPrinter:nHorzRes() / HORZ_LABELS
               nLblHeight = oPrinter:nVertRes() / VERT_LABELS
               nMargin    = Int( oPrinter:nLogPixelX() * 0.2 )
               nRow := 5
               nCol := 5
               SysRefresh()
               nEtqImpressa := 0
      Endif
   Next // wTags

   oPrinter:EndPage()

   CursorArrow()

   oPrinter:Preview()
   oFont:End()
   oFont2:End()
   oFontBarras:End()
   

return nil

//----------------------------------------------------------------------------//
Function PosicionarETQ()
Local GetList := {}
Local oGet, oGet1
public nQtdEmBrancos := 0

DEFINE DIALOG oDlg TITLE "A simple GET" ;
       FROM 2, 2 TO 13, 40

@ 1,  3 say 'Iniciar na Posicao :' OF oDlg
@ 1,  10 GET oGet VAR nQtdEmBrancos OF oDlg SIZE 60, 10 PICTURE "9999999"

@ 2, 3 say 'Mensagem RODAP‚ ' Of oDlg
@ 2,  10 GET oGet VAR cMsgLinha OF oDlg SIZE 60, 10 PICTURE "@!"

@ 5, 4 BUTTON oBtn PROMPT "&Ok" SIZE 45, 12 OF oDlg ;
        ACTION (GeraEmBrancos(nQtdEmBrancos) ,oDlg:End()) 
ACTIVATE DIALOG oDlg CENTERED
Return Nil

//------------------------------------------------
Static Function GeraEmBrancos()
   wTags := {}
   For i:= 1 to nQtdEmBrancos
           cBarras:= ''
           cCodigo:= ''
           cNome  := ''
           cExtra := ''
           Aadd(wTags,{cBarras,cCodigo,cNome,cExtra})
   Next
   CarregaDBF()
   SysRefresh()
Return 

//----------------------------
Function SelecionarEtiquetas()
Browse()
Return Nil

//------------------------------------
Static Function CarregaDBF()
       Go top
     //wTags := {} 
       Do While ! EOF()
             For i:= 1 to TAG->Quantid
                     cBarras:= TAG->Barras
                     cCodigo:= TAG->Codigo
                     cNome  := TAG->Descricao
                     cExtra := 'R$  '+Transf(TAG->Preco,'@EZ 9999.99')
                     Aadd(wTags,{cBarras,cCodigo,cNome,cExtra})
             Next
             Skip+1
       Enddo
Return Nil

//------------------------------------
Static Function ZAPEA()
Sele TAG
      ZAP
Return nil
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Impressao de Etiqueta com Papel A4

Mensagem por Eolo »

Frazato, quanto a começar a impressão em uma determinada etiqueta (por ex, a número 6 - 3a. linha, 2a. coluna), crie uma variável qualquer, tipo COMECAR:=6, e enquanto a outra variável (ETIQUETA, que vai de 1 a 18) for menor que COMECAR, vc só aumenta as coordenadas em pixels mas não imprime nada. Quando ETIQUETA for igual a 6, começa a imprimir (vai começar na 3a. linha, 2a. coluna).

Ponha um GET da COMECAR na tela, pro usuário escolher em qual posição é pra começar a imprimir.

Eu faço isso na rotina de impressão de etiquetas de cartões de PONTO, que usa etiquetas autoadesivas (dessas tipo PIMACO), aí dá pra aproveitar todas as etiquetas de cada folha, em várias impressões. No arquivo em anexo, uma imagem dessa tela. Nesse exemplo, o usuário escolheu 11, então vão ficar 10 etiquetas vazias, a impressão começando na 4a. linha, 2a. coluna.

Quanto a mostrar uma prévia em tela, nunca tentei, até porque acho que não tem utilidade real. Não imagino o usuário checando na tela o que vai ser impresso, etiqueta por etiqueta...
Anexos
COMECAR.zip
(58.81 KiB) Baixado 304 vezes
Avatar do usuário
rosalvo rosa
Usuário Nível 3
Usuário Nível 3
Mensagens: 156
Registrado em: 10 Jan 2006 19:21
Localização: Curitiba - PR

Impressao de Etiqueta com Papel A4

Mensagem por rosalvo rosa »

Boa noite !

Estou tentando usar o exemplo do nosso amigo Eolo, e estou aqui "PRENDENDO O GRITO" para continuar...

O código pede para que estejam instaladas no Windows as fontes "BARRAS BIRO" e "ARIAL ROUNDED MT BOLD".

Eu baixei os arquivos "*.ttf" com as mesmas, mas como que eu instalo estas fontes no Windows ?

Agradeço a ajuda...

Att

Rosalvo
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Impressao de Etiqueta com Papel A4

Mensagem por Eolo »

No Win7, botão direito no arquivo da fonte, vai em INSTALAR. Feito.
No WinXP, Painel de Controle, Fontes. Vai em Arquivo, Instalar Nova Fonte. Aponta para a pasta onde estão as fontes, marca as que quiser, instalar. Feito.

Talvez o xHarbour tenha alguma rotina pronta pra instalar fontes direto do programa. Se a fonte X não estiver instalada, instala! A conferir.
Responder