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:
- Primeiro, é feito uma busca nas impressoras instaladas através da GetImpWindows
- 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
- 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):
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.
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.
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.