Clipper On Line • Ver Tópico - Imprimir diretamente em Impressoras USB

Imprimir diretamente em Impressoras USB

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

Moderador: Moderadores

 

Imprimir diretamente em Impressoras USB

Mensagempor Marcio_Carneiro » 21 Out 2017 16:59

Boa tarde,

Sei que o assunto já foi respondido várias vezes, mas na minha pesquisa encontrei muitos posts muitos antigos.

E quero modernizar minha impressão em USB.

Meu prg já foi convertido para Harbour e já imprime em USB.

Mas faz isso imprimindo num arquivo
    ArqImp:='C:\USB.TXT'
    Imprime(ArqImp,13,gprintername)
    set printer to
    set printer to 'C:\USB.TXT'
   
   
*********************************************
Function Imprime( cArq, tamrel ,cPrinter )
*********************************************
local cTexto, nLinhas, n, cLinha,arquivoi,tam_pagina, estrut:={{"LINHA","C",200,0}}   // oPrinter := win32prn():New(cPrinter)
local oPrinter := win32prn():New(cPrinter)
                         

oPrinter:Landscape := .F.
oPrinter:FormType  := 9
oprinter:SetPrintQuality(-1) // qualidade da impressão

oPrinter:Copies    := 1

IF !oPrinter:Create()
   Mens("ATENÇÃO !!! Não foi possivel Iniciar a Impressão, Favor Verificar se a Impressora esta Ligada.","Aviso do Sistema",20)
   return NIL
ELSE
   IF !oPrinter:StartDoc("Impressao Pelo Sistema SCC")
      Mens("ATENÇÃO !!! Não foi possivel Iniciar a Impressão, Favor Verificar o Spoll da Impressora","Aviso do Sistema",20)
      Return NIL
   endif
   

   IF TAMREL=80
      oPrinter:setfont('Courier New',9,9,,,,255) // Normal
   ELSE
      oPrinter:SetFont("Courier New",14,{3,-50}) // Comprimida
   ENDIF
   oPrinter:Bold(0) // Normal
   
     cTexto := memoread(cArq)
     nLinhas := mlcount(cTexto)
     tam_pagina:=0   
     For n := 1 to nLinhas
     
        clinha:=memoline(CTexto,200,n)
       
        oPrinter:newline() // Inicia nova linha
        oPrinter:TextOut(HB_OemToAnsi(clinha))
        oPrinter:SetFont("Courier New",11,{3,-50}) // Comprimida
        oPrinter:Bold(0) // Normal
       
        tam_pagina=tam_pagina+1
               
        if n<> nLinhas
          *if tam_pagina=63
          if (oPrinter:MaxRow() - 4) <= oPrinter:Prow() // Usa "oPrinter:NewPage()" para iniciar nova pagina
           oPrinter:NewPage()
          endif
          tam_pagina:=0
        endif
       
    Next
    oPrinter:EndDoc()
    oPrinter:Destroy()
   
ENDIF


RETURN NIL   

E isto no Windows 7 às vezes trava, demora a liberar para a impressora, no caso um MP-100 s da Bematech.
Pergunto: no modo console tem como imprimir diretamente sem utilizar o arquivo txt?
Tem modo mais rápido? Pois me parece que o Windows fica controlando este arquivo escritos no raiz do HD e fica mais lento. Nunca é imediato.
Anexos
Imp_Usb.txt
(1.93 KiB) Baixado 56 vezes
Marcio_Carneiro
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 70
Data de registro: 07 Abr 2008 15:37
Cidade/Estado: Santo Antônio de Pádua - RJ
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Imprimir diretamente em Impressoras USB

Mensagempor MSDN » 21 Out 2017 21:26

Boa noite,

Segue exemplo que peguei aqui no fórum e uso no meu sistema :

STATIC FUNCTION Imprimir_Pedido_Cozinha()

     /*
          deve estar instalado na máquina o software :
          - Bematech Spooler Drivers
          - ( faz diferença a versão 32 da 64 bits )
     */
     LOCAL oQuery
     LOCAL cQuery
     LOCAL oQuery_2
     LOCAL cQuery_2
     LOCAL oRow
     LOCAL n_i := 0
     LOCAL x_i := 0
     LOCAL i := 0
     LOCAL xx_i := 0
     LOCAL v_sequencia := 0
     LOCAL v_nove := '9'
     LOCAL v_numero_mesa
     LOCAL v_nome_atendente
     LOCAL imp_nada      := '.'
     LOCAL a_dados       := {}
     LOCAL inicio        := Chr(29)+Chr(249)+Chr(32)+Chr(0)+Chr(27)+Chr(116)+Chr(8)
     LOCAL expande       := Chr(27)+Chr(87)+Chr(1)
     LOCAL c_expande     := Chr(27)+Chr(87)+Chr(0)
     LOCAL condensa      := Chr(15)
     LOCAL normal        := Chr(18)
     LOCAL corta         := Chr(27)+Chr(119)
     /*
          cria arquivo PRN
     */
     private temp := 'c:\sistema\cupom.prn'
     private arquivo := FCreate( temp, 0 )
     /*
          inicia envio de informações
     */
     TRY
          /*
               pegar sequencia impressão cupom cozinha
               e incrementar +1
          */
          SELE tmp_numcom
          IF tmp_numcom->data_mvto <> Date()
               REPLACE sequencia WITH 1
               REPLACE data_mvto WITH Date()
               COMMIT
               v_sequencia := tmp_numcom->sequencia
          ELSE
               v_sequencia := tmp_numcom->sequencia
               REPLACE tmp_numcom->sequencia WITH tmp_numcom->sequencia + 1
               COMMIT
          ENDIF
          /*
               saber numero da mesa e atendente
          */
          FOR xx_i := 1 TO oQuery:LastRec()
               oRow := oQuery:GetRow( xx_i )
               v_numero_mesa    := AllTrim( Str( oRow:FieldGet(17) ) )
               v_nome_atendente := AllTrim( oRow:FieldGet(4) )
               EXIT
          NEXT xx_i
          /*
          */
          AAdd( a_dados, inicio )
          AAdd( a_dados, expande + '    SEQUENCIA : ' + AllTrim(Str(v_sequencia)) + c_expande )
          AAdd( a_dados, imp_nada )
          AAdd( a_dados, imp_nada )
          AAdd( a_dados, Replicate( '-', 48 ) )
          AAdd( a_dados, expande + DToC( Date() )+'  -  '+Time() + c_expande )
          AAdd( a_dados, Replicate( '-', 48 ) )
          AAdd( a_dados, imp_nada )
          AAdd( a_dados, expande + 'AT.: '+v_nome_atendente+'    MESA : '+v_numero_mesa + c_expande )
          AAdd( a_dados, imp_nada )
          AAdd( a_dados, imp_nada )
          AAdd( a_dados, expande + '      COMANDA : '+AllTrim(Str(v_comanda)) + c_expande )
          AAdd( a_dados, imp_nada )
          AAdd( a_dados, Replicate( '-', 48 ) )
          AAdd( a_dados, 'QTD.       DESCRICAO')
          AAdd( a_dados, Replicate( '-', 48 ) )
          AAdd( a_dados, imp_nada )

          FOR n_i := 1 TO oQuery:LastRec()
               oRow := oQuery:GetRow( n_i )
               AAdd( a_dados, IIF( oRow:FieldGet(7) = 0, '', Str(oRow:FieldGet(7),7,3) ) +' | '+ Alltrim(oRow:FieldGet(6)) )
               /*
                    gravar que já foi impresso na cozinha
               */
               cQuery_2 := "update tmp_venda_comanda set "
               cQuery_2 += "ja_foi_cozinha = '" + v_nove + "' "
               cQuery_2 += "where id='" + AllTrim(Str(oRow:FieldGet(1))) + "'"      
               oQuery_2 := oMySQL:Query( cQuery_2 )
               oQuery_2:Destroy()
               /*
               */
               oQuery:Skip( 1 )
          NEXT n_i

          FClose(arquivo)
          txtarq := FOpen(temp,2)
          i := 1
          while i <= Len( a_dados )
               wlinha := a_dados[i]+Chr(13)+Chr(10)
               FSeek(txtarq,0,2)
               FWrite(txtarq, AllTrim(wlinha), Len(wlinha))
               i ++
               IF i > Len( a_dados )
                    FOR x_i := 1 to 5
                         wlinha := imp_nada+Chr(13)+Chr(10)
                         FSeek(txtarq,0,2)
                         FWrite(txtarq, AllTrim(wlinha), Len(wlinha))
                    NEXT x_i
                    wlinha := corta
                    FSeek(txtarq,0,2)
                    FWrite(txtarq, AllTrim(wlinha), Len(wlinha))
                    EXIT
               ENDIF
          end
          FClose(arquivo)
          carquivo := temp
          cimpressora := getdefaultprinter()
          printfileraw( cimpressora, carquivo, 'Cupom cozinha')
          Alerta('Pedido enviado para a COZINHA','MENSAGEM',1)
     CATCH e
          Alerta('A IMPRESSORA está DESLIGADA, verifique','ATENÇÃO',1)
     END

     oQuery:Destroy()

     RETURN( Nil )


Abraços
MSDN
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 741
Data de registro: 28 Nov 2003 14:55
Cidade/Estado: CWB
Curtiu: 178 vezes
Mens.Curtidas: 123 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro