Impressao de Etiqueta com Papel A4
Moderador: Moderadores
Impressao de Etiqueta com Papel A4
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
Frazato
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Impressao de Etiqueta com Papel A4
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.
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.
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.
Impressao de Etiqueta com Papel A4
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
Frazato
Impressao de Etiqueta com Papel A4
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).
O resultado disso é o seguinte:

Não sei como anexar as FONTES ao post...
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 postCó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
*-- FimO resultado disso é o seguinte:

Impressao de Etiqueta com Papel A4
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.
Frazato, complementando: com a Win32prn, dá pra imprimir também a logomarca do seu cliente nas etiquetas. É só algumas linhas na rotina.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Impressao de Etiqueta com Papel A4
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
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.
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.
Impressao de Etiqueta com Papel A4
Eolo! show de bola vou dar uma olhada qq coisa eu grito, muito obrigado a vc e ao Pablo.
Frazato
Frazato
Impressao de Etiqueta com Papel A4
As fontes em anexo.
Obrigado, Pablo.
Obrigado, Pablo.
- Anexos
-
Fontes.zip- (27.51 KiB) Baixado 316 vezes
Impressao de Etiqueta com Papel A4
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
- 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
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Impressao de Etiqueta com Papel A4
De nada rapazes, disponham !
Puxa muito legal seu exemplo, Eolo !
Vou compilar e testa-lo... valeu !
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.
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.
Impressao de Etiqueta com Papel A4
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:
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

- 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 } )
endiSó 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

Impressao de Etiqueta com Papel A4
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
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
Impressao de Etiqueta com Papel A4
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...
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
- rosalvo rosa
- Usuário Nível 3

- Mensagens: 156
- Registrado em: 10 Jan 2006 19:21
- Localização: Curitiba - PR
Impressao de Etiqueta com Papel A4
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
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
Impressao de Etiqueta com Papel A4
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.
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.
