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.