Página 1 de 7
Imprimir condensado usando WIN_PRN
Enviado: 20 Mar 2012 11:30
por Jairo Maia
Olá Pessoal,
Estou tentando implementar a impressão em um sistema que em Clipper usa o PRWIN, e funciona corretamente. Em harbour, compilei e rodei o exemplo da pasta contrib\hbwin\tests chamado TESTPRN, e naquele exemplo tem exatamente a fonte que eu gostaria de usar, a saber: Draft 17cpi.
O problema é que quanto mais tento entender aquele exemplo, mais leigo me sinto. No exemplo abaixo, a função PrintWinPrn() imprime, mas não há meio de eu fazê-la imprimir no modo condensado, em qualidade draft.
Se alguém puder me ajudar, agradeço muito.
Código: Selecionar todos
/*
Libs: -lxhb -lhbwin
*/
Function Main()
Local eol := Chr(13) + Chr(10), cCupom, nPrn, aPrn := Win_PrinterList()
Clear Screen
cCupom := " NOME E SLOGAN DA LOJA " + eol
cCupom += "Boleto: 00000001 - 20/03/2012 - 08:33:31" + eol
cCupom += "========================================" + eol
cCupom += " VENDA AVULSA DE PRODUTOS " + eol
cCupom += "========================================" + eol
cCupom += "Codigo Descricao do produto " + eol
cCupom += " Qtde Unitario Valor Item" + eol
cCupom += "----------------------------------------" + eol
cCupom += "0000000000001 => COCA - 600 ML " + eol
cCupom += " 1 Un x 1,00 = 1,00" + eol
cCupom += "----------------------------------------" + eol
cCupom += " " + eol
cCupom += "VALOR TOTAL DA COMPRA .....=> 1,00" + eol
cCupom += " " + eol
cCupom += " Atendido Por: ATENDENTE 1 " + eol
cCupom += "========================================" + eol
cCupom += " " + eol
MemoWrit( "vendas.tmp", cCupom )
While nPrn != 0
@ 1, 0 SAY "Selecione a impressora:"
@ 2, 0 TO MaxRow(), MaxCol()
nPrn := AChoice( 3, 1, MaxRow() - 1, MaxCol() - 1, aPrn, .T.,, nPrn )
IF nPrn != 0
PrintWinPrn( "vendas.tmp", aPrn[ nPrn ] )
Endi
EndDo
Clear Screen
Return Nil
Function PrintWinPrn( cArq, cPrint )
Local oPrn, aPrn := GetPrinters(), n := 0
oPrn := Win_Prn():New(cPrint)
oPrn :Copies := 1
oPrn :CharSet(255)
oPrn :SetFont( "Lucida Console", 8, { 3, -50 } )
If !oPrn:Create()
Alert("Nao foi criado o documento de Impressao")
Return nil
EndIf
If !oPrn:StartDoc("Imprimindo Documento")
Alert("Erro na Impressora")
Return nil
EndIf
HB_CDPSelect("PT850")
SetPrc(0,0)
cText := MemoRead( cArq )
nLinh := MlCount( cText )
For n := 1 to nLinh
oPrn:TextOut(HB_AnsiToOem(MemoLine(cText,,n)),.t.)
Next
oPrn:EndDoc()
HB_CDPSelect( "PTISO")
Return .t.
Imprimir condensado usando WIN_PRN
Enviado: 20 Mar 2012 11:40
por Pablo César
Tente trocar alinha 49 por:
oPrn:SetFont('courier new',17,{1,17}, 0,.F.,.F.)
Imprimir condensado usando WIN_PRN
Enviado: 20 Mar 2012 14:19
por Jairo Maia
Olá Pablo,
Muito Obrigado. Funcionou a impressão condensada em 17cpi. Entendi também como controlar a compressão. Valeu Mesmo!!!
Fiz também algumas modificações, e está imprimindo em qualidade rascunho, era também o que eu precisava.
Porém, continuo com um problema que não tenho idéia de como resolver, a saber: NÃO PODE DAR O EJECT. Tentei encontrar no arquivo hbwin.ch que elemento poderia neutralizar isso. mas não achei. Já abusando de sua paciência, Tens idéia de como posso fazer isso?
Ocorre que este tipo de impressão é feita em bobina, e não pode ter o eject após imprimir. Tentei com FormType e BinNumber, mas não dá resultado, acho que nada a ver para isso:
Código: Selecionar todos
FUNC PrintWinPrn( cArq, cPrint )
Local oPrn, aPrn := GetPrinters(), n := 0
oPrn := Win_Prn():New(cPrint)
oPrn :FormType := WIN_DMPAPER_USER // (??)
oPrn :BinNumber := WIN_DMBIN_TRACTOR // (??)
oPrn :SetPrintQuality( WIN_DMRES_DRAFT ) // modo draft OK
If !oPrn:Create()
Alert("Nao foi criado o documento de Impressao")
Return nil
EndIf
If !oPrn:StartDoc("Imprimindo Documento")
Alert("Erro na Impressora")
Return nil
EndIf
SetPrc(0,0)
cText := MemoRead( cArq )
nLinh := MlCount( cText )
oPrn :SetFont( "Courier New", 12, { 1, 17 }, 0, .F., .F. )
oPrn:CharSet( 0 ) // Reset default charset
For n := 1 to nLinh
oPrn:TextOut( MemoLine(cText,,n), .T. )
Next
oPrn:EndDoc()
Return .t.
Imprimir condensado usando WIN_PRN
Enviado: 20 Mar 2012 17:07
por Pablo César
Olá Jairo, já experimentou remover as linhas 6 e 7 do seu código exemplo este ultimo ? Não tenho certeza, mas acho que senão definir o tamanho e não utilizar oPrn:NewPage() não irá dar esse salto de página por conta do tamanho, experimente.
E creio que deveria inserir uma linha com oPrn:Destroy() após oPrn:EndDoc() para eliminar qualquer vestígio de impressão no spool do SO.
Imprimir condensado usando WIN_PRN
Enviado: 21 Mar 2012 15:15
por Jairo Maia
Olá Pablo,
Obrigado por advertir sobre o Destroy(), precisa ter sim. Também fiz os testes com sua sugestão, não tive resultado. Mesmo assim, obrigado pela sua sempre prestativa atenção.
Li e reli todas as classes do Win32Prn do xharbour (que podem ser aplicadas com Win_Prn), nada há lá que evite este eject. Setei a classe :FormType := WIN_DMPAPER_USER, acredito que esta opção seria permitir que se usasse formulário definido pelo usuário.
Se assim fosse, como imprimo primeiro em arquivo, depois carrego o arquivo e envio a impressora, e se tenho as classes LineHeight() e PageHeight(), sei o tamnho do papel que preciso, e defino com PageHeight(NovoTamanho).
Se envio à tela, o harbour acusa que assumiu o novo tamanho, e teoricamente, defino o tamanho da impressão + 2 linhas por exemplo, este eject deveria parar duas linhas depois, pois é o fim da página, mas não acontece assim.
O PRWIN é construído em xHarbour, e não dá eject após a impressão. Como o Vagner fez isso não sei.
Pesquisando, ancontrei este tópico, que contém 118 tipos de papel que podem ser definidas no xHarbour, e obviamente também em harbour, mas curiosamente, nada sobre bobina por exemplo. Será que um recurso tão simples do Clipper não tem no Harbour? Acredito que sim, a questão é descobrir.
Tipos de formulário:
https://pctoledo.org/forum/viewtopic.php?t=7400
Imprimir condensado usando WIN_PRN
Enviado: 21 Mar 2012 16:58
por Pablo César
É parece que o salto de página no final, não tem como evitar. Então por quê não utilizas o PRINTFILERAW() ao invés do Win32Prn ? No PRINTFILERAW você faria igualzinho como no Clipper.
O PRWIN é construído em xHarbour, e não dá eject após a impressão. Como o Vagner fez isso não sei.
Ele deve ter usado o PRINTFILERAW() pois o utilitário lê linha a linha de um arquivo texto, não é ?
Imprimir condensado usando WIN_PRN
Enviado: 22 Mar 2012 08:16
por Jairo Maia
Caro Pablo,
Eu gostaria de ter evitado usar o PrintFileRaw(), porque esta função imprime somente em impressoras com suporte RAW. Ocorre que você tem razão, cupons são impressos em impressoras matriciais e térmicas, e todas têm suporte RAW.
Assim, para impressão de cupons uso a função com PrintFileRaw(), e os relatórios que são impressos nos variados tipos de impressoras, principalmente multifuncionais, uso a função Win_Prn(), pois para relatórios já enfrentei problemas de não poder imprimir.
pois o utilitário lê linha a linha de um arquivo texto, não é ?
A questão de ler linha a linha foi uma adaptação para minha situação, mas ao usar PrintFileRaw(), não é necessario, ficando assim:
Código: Selecionar todos
PrintFileRaw( cImpressora, cArquivo, [cTituloImpressora] )
Mais uma vez, Muito Obrigado por sua atenção.
PROBLEMA RESOLVIDO
Imprimir condensado usando WIN_PRN
Enviado: 04 Jun 2015 00:54
por microvolution
GENTE 3 anos se passaram desde a última postagem...
e vem cá eu traveis...
acabei de aprender a imprimir em portas USB.
Usando a linha:
Onde:
cPrint -> contém a impressora padrão
cArq -> o conteúdo do arquivo gerado
cTit -> um título qualquer.
Acontece, que quando imprimia nas impressoras matriciais (famosas EPSON lx 300 e companhia limitada...) utilizava caracteres especiais do famoso chr(27)+"@..." para imprimir condensado, draft, normal, italic, bold, etc, etc...
Então, se eu fosse imprimir meu relatório em impressora LPT1 sairia normal, mas, aqui no lugar de sair condensado e aplicar os comandos, ele imprimiu apenas DRAFT 80 colunas, sendo que deveria ser em 160.
O que devo fazer?
vlw
PS: HMG 3.0.35 ou 3.0.46 que estou testando e compilando!
Imprimir condensado usando WIN_PRN
Enviado: 04 Jun 2015 09:47
por Itamar M. Lins Jr.
Ola!
Via win_PrintFileRaw() , já tentou enviar @ ... say chr(27)+chr(15)+"TEXTO COMPRIMIDO" para ver se funciona ?
Porque eu uso assim aqui e funciona.
Saudações,
Itamar M. Lins Jr.
Imprimir condensado usando WIN_PRN
Enviado: 04 Jun 2015 11:10
por microvolution
olá bomdia!
não sei se já falei, mas eu usava no clipper e meu código permanece ainda como era. Veja parte do meu código:
Código: Selecionar todos
@ prow()+1,15 say 'DOCUMENTO AUXILIAR DE VENDA - v1.1'
@ prow()+1,19 say 'NAO EH VALIDO COMO RECIBO E/OU COMO GRANTIA DE MERCADORIA(S)'
@ prow()+1,30 say 'ESTE DOCUMENTO NAO COMPROVA PAGAMENTO'
@ prow(),pcol() say chr (27) + chr (33) + '5' // Era '3' e mudei p/ '5' somente para teste. W09/02/02. // imprime condensado. 20-10-11w.
//@ prow(),pcol() say chr (27) + 'W' + '0' // imprime condensado. 20-10-11w.
@ prow(),pcol() say CHR(27)+'(s16.67H' // mudei p/ esta linha em 3/6/15w pois vi na internet esse código para condensado em impressoras HP.
@ prow()+1,0 say '----------------------------------------------------------------------------------------------------------------------------------------------------------------'
@ prow()+1,30 say ltrim (NOME_EMPRESA) + ' - ' + ltrim (DCI10017->EDENDEREC) + ' - ' + ltrim(transform (DCI10017->NUFONE,pNUFONE)) // era EDFONE - mudei p/ NUFONE pois no arquivo DCI10017 o correto é NUFONE. 26/2/14w
Então, prezado
professor Itamar
e os demais que lerem este post, você me sugere mudar para @SAY no lugar de @prow? Simples assim? se for, farei um CTRL+H e substituir as entradas... correto?
abraços!
Imprimir condensado usando WIN_PRN
Enviado: 04 Jun 2015 11:36
por Itamar M. Lins Jr.
Eu não uso dessa forma.
1) Evite mexer no seu código.
Coloque antes isso:
Código: Selecionar todos
SET PRINTER TO seurelatorio.prn
SET DEVICE TO PRINTER
...
@ prow() ... say chr(27)+chr(14) ....
@ prow()+1,15 say 'DOCUMENTO AUXILIAR DE VENDA - v1.1'
...
SET DEVICE TO
SET PRINTER TO
...
Win_PrinteFileaw(cPrint,"seurelatorio.prn","DOC AUX VDA")
Saudações,
Itamar M. Lins Jr.
Imprimir condensado usando WIN_PRN
Enviado: 04 Jun 2015 13:23
por microvolution
Prezado Itamar,
acho q mais ou menos tô percebendo o que está acontecendo. Crei uma variável pública de nome CLI que ela recebe o conteúdo do cliente atual e nesse caso é 0001. Na variável cArq e no PRINTFILERAW eu faço assim:
Código: Selecionar todos
cArq := CLI
nRet := Win_PrintFileRaw(cPrint,cArq+'.PRN',cTit)
Aí o texto vai para esse arquivo. Na próxima impressão, vai o texto, e aí, vai acumulando as informações.
Então, percebi isso, pois estava cada vez mais imprimindo as folhas acumulativas.
toda vez que sai do aplicativo (módulo) e no clipper eu uso asism para excluir, mas, não está excluindo (estou testando no win 7 64 bits):
Código: Selecionar todos
! del &CLI..PRN // assim não exclui
! del CLI.PRN // assim também não exclui
No mais, vou excluir manualmente e ver se o
CONDENSADO está pegando.
vou testar e postar aqui, enquanto isso, alguém tente descobrir como excluir o arquivo
"MEUARQUIVO.PRN" no caso
"CLI.PRN" no harbour/hmg 3.0.xx.
té breve
Imprimir condensado usando WIN_PRN
Enviado: 04 Jun 2015 13:35
por microvolution
Ah! mais uma informação para sua análise.
Eis aqui o conteúdo do arquivo 0001.PRN que é gerado (que funcionava no clipper em impressoras LPT1 LX 300).

- NOME CORRETO DO ARQUIVO: "0001.PRN"
- 0001_PRN.png (8.81 KiB) Exibido 7362 vezes
Veja o conteúdo texto dele:
Código: Selecionar todos
@W1
Nao Vale Como Cupom Fiscal!5W0
================================================================================================================================================================
Sistema de Controle Comercial Avancado - SiCCA v3.4 - todos os direitos reservados 1998/2014!5
----------------------------------------------------------------------------------------------------------------------------------------------------------------
DOCUMENTO AUXILIAR DE VENDA - ORDEM DE SERVI€O VEICULAR (O.S.V.) - v1.1
NAO EH VALIDO COMO RECIBO E/OU COMO GRANTIA DE MERCADORIA(S)
ESTE DOCUMENTO NAO COMPROVA PAGAMENTO
----------------------------------------------------------------------------------------------------------------------------------------------------------------
MVINFO Sistemas & Automa‡ão - teste1 - (31)3824-1556
04/06/2015 13:15:38
----------------------------------------------------------------------------------------------------------------------------------------------------------------
O.S.V. Numero... : 000001
D A D O S D O C L I E N T E
Cliente.. : 0001-WAL
Endereco. : DESC - 111
Bairro... : DESC
Fone..... : ( ) -
----------------------------------------------------------------------------------------------------------------------------------------------------------------
D A D O S D O V E I C U L O
Marca/Modelo.....: FIAT / UNO MILLE FIRE 1.0 Placas......: xxx-xxxx Extintor(S/N) S Combustivel...: GASOLINA
Ano Fabric/Modelo: 2004 / 2005 Observacoes.: 2PORTAS - MOTOR 1.0 - C/ ALARME, SOM, MàDULO ROADSTAR 1000W, GRADE FRONTAL QUEBRADA, CAPUT TRAZEIRO.
Data/Hora Entrada: 28/05/2015 / 03:00:21 KM Entrada..: 141 Vend./Mecanico: 01-W - SYSTEM ADM
Data/Hora Saida..: / / / KM Saida....: 0 Operador......:01-W - SYSTEM ADMINIS
DEFEITO(S) RECLAMADO(S): STATUS O.S.V.: 1
----------------------------------------------------------------------------------------------------------------------------------------------------------------
P E C A S / P R O D U T O S
CODIGO DESCRICAO DO PRODUTO/PECA QUANT GRADE VR. UNITARIO VR. TOTAL %DESC. VR.DESC.
Sub-Total. 0,00
----------------------------------------------------------------------------------------------------------------------------------------------------------------
S E R V I C O S / M A O D E O B R A
CODIGO DESCRICAO DO SERVICO QUANT VR. UNITARIO VR. TOTAL %DESC. VR.DESC.
Sub-Total. 0,00
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Total Bruto. 0,00
Desconto.. 0,00 Total a Pagar..... 0,00
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Ass.: ___________________________________________________
----------------------------------------------------------------------------------------------------------------------------------------------------------------
EH VEDADA A AUTENTICACAO DESTE DOCUMENTO
= MVinfo Sistemas - (31) 3824.1556 / 9711.1556 / 8854.1556 / 8758.1556 Copyrigth 1998-2014 =====================================================================
aqui no final, tem um caractere oculto que refere-se ao EJECT.
Esse formulário está imprimindo normalmente,só não aplica CONDENSADO, etc...
Impressora HP C4280. Não testei noutra pois só testarei no cliente, semana que vem,quando isso aqui estiver resolvido.
Imprimir condensado usando WIN_PRN
Enviado: 04 Jun 2015 13:38
por microvolution
Itamar M. Lins Jr. escreveu:Eu não uso dessa forma.
1) Evite mexer no seu código.
Coloque antes isso:
Código: Selecionar todos
SET PRINTER TO seurelatorio.prn
SET DEVICE TO PRINTER
...
@ prow() ... say chr(27)+chr(14) ....
@ prow()+1,15 say 'DOCUMENTO AUXILIAR DE VENDA - v1.1'
...
SET DEVICE TO
SET PRINTER TO
...
Win_PrinteFileaw(cPrint,"seurelatorio.prn","DOC AUX VDA")
Saudações,
Itamar M. Lins Jr.
Ah! no meu caso está assim:
Código: Selecionar todos
[b]SET DEVICE TO PRINTER
SET PRINTER TO seurelatorio.prn
[/b]...
Está ao contrário a ordem, será que é isso? :%
Imprimir condensado usando WIN_PRN
Enviado: 04 Jun 2015 13:46
por Itamar M. Lins Jr.
Para apagar use:
ferase("seuarquivo.qualquercoisa")
Lembre-se do PATH, seu EXE pode está em uma lugar e seu arquivo em outro.
ferase("\lugar\do\arquivo\arquivo.xyz")
Saudações,
Itamar M. Lins Jr.