Imprimir relatório direto na impressora padrão (usando FWMSPrinter)

No artigo de hoje, vamos demonstrar em como usar a classe FWMSPrinter imprimindo direto na impressora padrão sem usar a FWPrintSetup.

A dica de hoje foi enviada pelo grande Tiago Fonseca Lima de Moraes ( LinkedIn ).

Se você já teve a necessidade de gerar um relatório usando a FWMSPrinter direto para a impressora padrão instalada no Windows, basicamente você vai precisar:

  • No parâmetro nDevice, informar IMP_SPOOL (para ir direto para impressora)
  • No parâmetro cPrinter, informar o nome da impressora padrão
  • Usar a função GetImpWindows para buscar a impressora padrão no sistema operacional

 

Abaixo então um trecho de como ficaria:

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

//Se encontrou impressoras
If Len(aImpressoras) > 0
	//Pega a impressora padrão
	cImprPadrao := aImpressoras[1]

	//Cria o relatório
	oPrintRel := FWMSPrinter():New(;
		"TESTE_REL",; // cFilePrintert
		IMP_SPOOL,;   // nDevice
		.F.,;         // lAdjustToLegacy
		,;            // cPathInServer
		,;            // lDisabeSetup
		,;            // lTReport
		,;            // oPrintSetup
		cImprPadrao,; // cPrinter
		.F.;          // lServer
	)
	
	//Restante do seu código
	// ...
EndIf

E abaixo um exemplo que foi gentilmente disponibilizado pelo Tiago, onde caso não tenha impressora padrão, será exibido uma tela para escolha da impressora com a FWPrintSetup.

//Bibliotecas
#Include "Totvs.ch"
#Include "TopConn.ch"
#Include "protheus.ch"
#Include "RPTDef.ch"
#Include "FWPrintSetup.ch"
#Include "Rwmake.ch"
#Include "TbiConn.CH"
#Include "APWIZARD.CH"
#Include "FILEIO.CH"
#include "parmtype.ch"

/*/{Protheus.doc} GeraDanfe
	(Função que imprime as danfes)
	@type User Function
	@author Tiago Fonseca Lima
	@since 02/06/2023
	@version 12.1.33
	@param aAux, Array, Array com as notas para impressão
	@param cSerie, character, serie
	/*/
 User Function GeraDanfe(aAux, cSerie)

 	Local aArea         	:= FwGetArea()
    Local cIdent        	:= ""
    Local lEnd          	:= .F.
    Local nTamNota      	:= TamSX3("F2_DOC")[1]
    Local nTamSerie     	:= TamSX3("F2_SERIE")[1]
    Local dDataDe       	:= Date() - 365
    Local dDataAte       	:= Date() + 365
	Local lAdjustToLegacy 	:= .F.
	Local lDisableSetup  	:= .T.
	Local oDanfe			:= Nil
	Local aImpr				:= GetImpWindows(.F.)
	Local lSetup			:= .T.
	Local cPrinter			:= ""
    Private PixelX
    Private PixelY
    Private nConsNeg
    Private nConsTex
    Private oRetNF			:= Nil
    Private nColAux
	Default aAux			:= {}
    Default cArquivo    	:= ""
    Default cSerie      	:= ""

	If Len(aImpr) > 0
		cPrinter	:= aImpr[1]
		lSetup		:= .F.
	EndIf
	cIdent		:= RetIdEnti()
	cArquivo	:= aAux[1] + "_" + dToS(Date()) + "_" + StrTran(Time(), ":", "-") + ".pdf"

	Pergunte("NFSIGW",.F.)
	MV_PAR01 := PadR(aAux[1], nTamNota)   			//Nota Inicial
	MV_PAR02 := PadR(aAux[Len(aAux)], nTamNota)  	//Nota Final
	MV_PAR03 := PadR(cSerie, nTamSerie)    			//Série da Nota
	MV_PAR04 := 2                          			//NF de Saida
	MV_PAR05 := 2                          			//Frente e Verso = Nao
	MV_PAR06 := 2                          			//DANFE simplificado = Nao
	MV_PAR07 := dDataDe                    			//Data De
	MV_PAR08 := dDataAte                   			//Data Até

	If !lSetup
		oDanfe:= FwMSPrinter():New(cArquivo, IMP_SPOOL, lAdjustToLegacy,, lDisableSetup,,, cPrinter, .F.)
	Else
		Aviso("Impressora Padrão", "Não existe impressora padrão definida, será exibido o Setup de Impressão!!!", {"Ok"}, 1, , , , , 2000)
		oDanfe:= FwMSPrinter():New(cArquivo, IMP_SPOOL, lAdjustToLegacy,, lDisableSetup,,,,,,,)
		oDanfe:Setup()
	EndIf
	oDanfe:SetResolution(78)
	oDanfe:SetPortrait()
	oDanfe:SetPaperSize(9)
	oDanfe:SetMargin(60, 60, 60, 60)

	PixelX    := oDanfe:nLogPixelX()
	PixelY    := oDanfe:nLogPixelY()
	nConsNeg  := 0.4
	nConsTex  := 0.5
	oRetNF    := Nil
	nColAux   := 0

	If !lSetup
		FWMsgRun(, {|| u_DanfeProc(@oDanfe, @lEnd, cIdent, , , .F.)}, "Aguarde...", "Imprimindo Danfe......")
		oDanfe:Print()
	Else
		If oDanfe:nModalResult == PD_OK
			FWMsgRun(, {|| u_DanfeProc(@oDanfe, @lEnd, cIdent, , , .F.)}, "Aguarde...", "Imprimindo Danfe......")
			oDanfe:Print()
		EndIf
	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.

Deixe uma resposta

Terminal de Informação