Como imprimir um texto Justificado no FWMSPrinter

Hoje vou mostrar como imprimir texto de modo justificado usando o FWMSPrinter.

Há um bom tempo atrás, para você imprimir um texto justificado em relatório gráfico em AdvPL, ou você usava uma fonte mono-espaçada (como Courier New) e controlava os espaços em branco.

Ou você usava alguma fonte como Arial, e controlava pulando espaços com Say / SayAlign.

Mas a TOTVS, a partir da versão 1.6.2 do TOTVS Printer, disponibilizou a opção de alinhamento Justificado para utilização na classe FWMSPrinter no método SayAlign.

Basicamente então, ao mandar imprimir algo com SayAlign, passamos a largura (no nosso exemplo, peguei a diferença entre coluna final e coluna inicial), e passamos a altura (no nosso exemplo, 300 pixels). A partir disso, no parâmetro de alinhamento, informamos 3 que é o de justificado. Com isso na montagem do relatório, o Protheus vai fazer automaticamente.

Abaixo um exemplo do pdf gerado com o bloco acima usando alinhamento a esquerda, e o bloco abaixo usando justificado.

Exemplo de impressão com texto alinhado a esquerda (acima) e justificado (abaixo)

Abaixo o código fonte de exemplo:

//Bibliotecas
#Include "TopConn.ch"
#Include "Protheus.ch"
#Include "RPTDef.ch"
#Include "FWPrintSetup.ch"

//Alinhamentos
#Define PAD_LEFT    0
#Define PAD_RIGHT   1
#Define PAD_CENTER  2
#Define PAD_JUSTIFY 3 //Opção disponível somente a partir da versão 1.6.2 da TOTVS Printer

/*/{Protheus.doc} zTstJust
Exemplo de Texto Justificado em FWMSPrinter
@author Atilio
@since 21/11/2020
@version 1.0
@type function
@see https://tdn.totvs.com/display/public/PROT/FWMsPrinter
/*/

User Function zTstJust()
	Local aArea        := GetArea()
	Local cArquivo     := "zTstJust_" + dToS(Date()) + "_" + StrTran(Time(), ':', '-') + ".pdf"
    Local cTexto       := fCriaTexto()
    //Linhas e colunas
	Private nLinAtu    := 0
	Private nLinFin    := 800
	Private nColIni    := 010
	Private nColFin    := 580
	Private nEspCol    := (nColFin-(nColIni+150))/13
	Private nColMeio   := (nColFin-nColIni)/2
    //Objetos de impressão e fonte
	Private oPrintPvt
	Private cNomeFont  := "Arial"
	Private oFontDet   := TFont():New(cNomeFont, 9, -11, .T., .F., 5, .T., 5, .T., .F.)
	Private oFontDetN  := TFont():New(cNomeFont, 9, -13, .T., .T., 5, .T., 5, .T., .F.)
	
    //Criando o objeto de impressao
    oPrintPvt := FWMSPrinter():New(cArquivo, IMP_PDF, .F., ,   .T., ,    @oPrintPvt, ,   ,    , ,.T.)
    oPrintPvt:cPathPDF := GetTempPath()
    oPrintPvt:SetResolution(72)
    oPrintPvt:SetPortrait()
    oPrintPvt:SetPaperSize(DMPAPER_A4)
    oPrintPvt:SetMargin(0, 0, 0, 0)
    oPrintPvt:StartPage()

    //Primeiramente iremos imprimir o texto alinhado a esquerda
    nLinAtu := 30
    oPrintPvt:SayAlign(nLinAtu, nColIni, "Texto (Esquerda):",            oFontDetN,  (nColFin - nColIni),    015, , PAD_LEFT,  )
    nLinAtu += 15
    oPrintPvt:SayAlign(nLinAtu, nColIni, cTexto,                         oFontDet,   (nColFin - nColIni),    300, , PAD_LEFT,  )

    //Agora iremos imprimir o texto com alinhamento justificado
    nLinAtu += 300
    oPrintPvt:SayAlign(nLinAtu, nColIni, "Texto (Justificado):",         oFontDetN,  (nColFin - nColIni),    015, , PAD_JUSTIFY,  )
    nLinAtu += 15
    oPrintPvt:SayAlign(nLinAtu, nColIni, cTexto,                         oFontDet,   (nColFin - nColIni),    300, , PAD_JUSTIFY,  )

    //Encerrando a impressão e exibindo o pdf
    oPrintPvt:EndPage()
    oPrintPvt:Preview()
	
	RestArea(aArea)
Return

Static Function fCriaTexto()
    Local cTexto := ""

    cTexto += "O Terminal de Informação (Projeto ‘Ti’), foi criado para compartilhar ideias e informações com outros usuários, tratando de diversos assuntos, como sistemas operacionais (OpenSUSE, Windows e outras distros Linux), projetos da Mozilla, Desenvolvimento (Java, C / C++ e AdvPL), tutoriais, análises e dicas de aplicativos e produtos, dentre outros assuntos." + CRLF
    cTexto += "" + CRLF
    cTexto += "Tudo começou em 2012 (dia 08/08/2012 para ser mais preciso), e desde então o projeto não parou mais de crescer, recebendo sempre feedbacks positivos de toda a comunidade." + CRLF
    cTexto += "" + CRLF
    cTexto += "Em 2016 foi feita uma grande mudança para hospedagem própria, muita coisa no Terminal mudou, e cada vez mais focando em artigos de qualidade para os usuários." + CRLF
    cTexto += "" + CRLF
    cTexto += "Só tenho a agradecer aos amigos e aos internautas que sempre apoiam o projeto Ti." + CRLF
    cTexto += "" + CRLF
    cTexto += "Espero que gostem." + CRLF
    cTexto += "" + CRLF
    cTexto += "Sugestões, Críticas ou outras ideias, podem entrar em contato." + CRLF

Return cTexto

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.

6 Responses

  1. WALTER ARAUJO FRANCO disse:

    Bom dia,
    Muito oportuno esta sua dica, terminei na semana passada a impressão do docto da nossa política de privacidade, e fiz toda a edição manualmente, colocando espaços e tudo mais um a um pra acertar o texto.
    Só uma dúvida, notei o uso de acentuação normal no texto, o que não consegui fazer na minha impressora térmica, creio que seja limitação do driver dela uma Bematech MP4200, você sabe me dizer se esta impressão é no modo caracter como nas impressoras matricicais, ou gráfico como nas lasers?
    Parabéns pela dica!
    Obrigado,

    Walter Franco

    • Dan_Atilio disse:

      Bom dia Walter, tudo bem?
      Essa é impressão gráfica, ela usa o método FWMSPrinter. No exemplo acima, eu gero um arquivo pdf, mas você pode tentar modificar e enviar diretamente para a impressora (se ela for USB por exemplo).
      Obrigado pelo feedback. Grande abraço.

  2. Carlos Sabino disse:

    Bom dia, Atilio!
    Cara, sou iniciante em ADVPL e logo me deparei com um desafio em desenhar uma etiqueta com QRCode, PDF417 e código de barras.
    Estou quebrando a cabeça com isso, não tem nada que explique de forma clara e objetiva, nem na TDN.
    Porventura você tem algum conteúdo que possa me ajudar?
    Desde já agradeço!

    • Dan_Atilio disse:

      Bom dia Carlos, tudo bem?
      Já fiz alguns relatórios com QRCode e com código de barras, mas ainda não disponibilizei aqui no Terminal.
      No caso, qual é a dúvida específica que você tem? Se quiser, nos mande um e-mail que podemos lhe auxiliar.
      Abraços.

  3. Luciano Minari disse:

    Muito bom esse novo parâmetro de justificar, mão na roda.
    Fiquei só com uma duvida como é o espaçamento entre as linhas já que o SayAlign faz os saltos, quando é colocado um fonte menor, fica um espaçamento muito grande entre as linha.

Deixe uma resposta para Dan_AtilioCancelar resposta

Terminal de Informação