Imprimir diretamente em Impressoras USB

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

Moderador: Moderadores

Marcio_Carneiro
Usuário Nível 2
Usuário Nível 2
Mensagens: 70
Registrado em: 07 Abr 2008 15:37
Localização: Santo Antônio de Pádua - RJ

Imprimir diretamente em Impressoras USB

Mensagem por Marcio_Carneiro »

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

Código: Selecionar todos

    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 83 vezes
MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

Imprimir diretamente em Impressoras USB

Mensagem por MSDN »

Boa noite,

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

Código: Selecionar todos

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
Responder