Imprimir arquivo via AdvPL

No artigo de hoje, vamos mostrar em como imprimir um arquivo no sistema operacional via AdvPL.

Recentemente, nos perguntaram se teria como acionar a impressão de um arquivo do Windows via AdvPL. Conseguimos fazer para arquivos com a extensão .txt.

 

Para a montagem desse artigo, foi usado a função padrão SendFile. A lógica da função customizada ficou a seguinte:

  1. Primeiro, é feito uma busca nas impressoras instaladas através da GetImpWindows
  2. Se houver, ai vamos usar a zQry2Txt para gerar um arquivo TXT com o resultado de uma query, clique aqui para baixar essa função
  3. Após a geração do arquivo, será acionado a SendFile, onde será aberto uma tela para confirmar a impressão (similar a tela abaixo, usando o WebAgent com Google Chrome):
Tela de impressão via navegador

Tela de impressão via navegador

 

Abaixo o código fonte desenvolvido conforme a lógica descrita acima:

//Bibliotecas
#Include "Totvs.ch"

/*/{Protheus.doc} zTstPrint
Função para testar o acionamento da impressão de arquivo via impressora padrão
@type user function
@author Atilio
@since 28/04/2025
@obs Essa função ela aciona a SendFile que trabalha parecida com a PrintInWin (junto com a PreparePrint, InitPrint e PrintDriver)
/*/

User Function zTstPrint()
    Local aArea        := FWGetArea()
    Local cFolder      := ""
    Local cFileName    := ""
    Local aImpressoras := {}
    Local cFileTxt     := ""

    //Busca as impressoras
    aImpressoras := GetImpWindows(.F.)	

    //Se encontrou impressoras
    If Len(aImpressoras) > 0
        //Gera um arquivo txt conforme a query através da u_zQry2Txt
        cFileTxt := u_zQry2Txt("SELECT TOP 10 B1_COD, B1_DESC FROM " + RetSQLName("SB1"))
        cFolder := ExtractPath(cFileTxt)
        cFileName := ExtractFile(cFileTxt)

        //Envia o arquivo para a tela de confirmar a impressão
        SendFile(;
            cFileName,;       // cArquivo,;
            1,;               // nMidia,; 1 = Windows; 2 = Porta; 3=eMail
            "",;              // cPorta,;
            "",;              // cCbPortClie,;
            aImpressoras[1],; // cImpress,;
            aImpressoras[1],; // cImpCbClie,;
            ,;                // cCbDrv,;
            2,;               // nAmbiente,; 1=Server; 2=Client
            cFolder,;         // cDirAtu,;
            ,;                // cPagAtu,;
            .F.,;             // lPagAtu,; Imprime somente a página atual
            ,;                // cGetMail,;
            .F.,;             // lPagInt,; Imprime intervalo de páginas
            1,;               // nRgStart,;
            1,;               // nRgEnd,;
            0;                // nMargOpc;
        )
    EndIf
 
    FWRestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. WAGNER SOARES disse:

    Daniel, teria como enviar direto para uma impressora sem confirmação do usuário? Tipo ler os arquivos PDF’s de uma pasta e mandar imprimi-los via servidor?

    • Bom dia Wagner, tudo joia?

      Nativamente em AdvPL ou TLPP, não sei dizer se tem algum recurso que atenda sua necessidade.

      Uma alternativa seria preparar um script em PowerShell ou C# que mande um arquivo para a impressora padrão.

      Nisso, via AdvPL você iria pegar os pdfs dessa determinada pasta, e iria acionar esse script que manda para determinada impressora.

      Tenha uma ótima e abençoada quinta feira.

      Um forte abraço.

      • WAGNER SOARES disse:

        Muito obrigado pelo retorno Daniel. Achei que teria como usar essa SendFile sem interface com o usuario.

        • Bom dia Wagner, tudo joia?

          Ah entendi. Até onde eu sei, infelizmente não tem essa possibilidade atualmente.

          Pelo menos na versão 2410, a SendFile abre o prompt do navegador para impressão do arquivo.

          Mas pode ser que num futuro, eles adicionem alguma tratativa nesse sentido.

          Tenha uma ótima e abençoada sexta feira.

          Um forte abraço.

Deixe uma resposta

Terminal de Informação