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:

Código: Selecionar todos

   nRet   := Win_PrintFileRaw(cPrint,cArq+'.PRN',cTit)
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"
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.