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.
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.

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
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.
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!
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.
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.
Opa, obrigado pelo comentário Luciano.
Na FWMSPrinter eu desconheço se ele tem algum método SetLineHeight igual é no TReport.
Você pode tratar manualmente fazendo um For e imprimindo, similar a esse exemplo: https://terminaldeinformacao.com/2016/11/29/funcao-quebra-um-campo-memo-em-varias-linhas-para-impressao-em-advpl/
Bom dia, estou tentando utilizar o alinhamento vertical do SayAlign mas não está funcionando. Teria alguma dica ou exemplo ? Antecipadamente agradeço.
Bom dia Cleiton, tudo joia?
Eu não costumo usar alinhamento vertical, mas como você está fazendo o SayAlign?
Pois vi aqui no TDN e vai depender da altura que você esta passando no seu SayAlign, por exemplo:
[…]
nAltura := 50
nVertAlin := 2 // 0 = Centralizado; 1 = Superior; 2 = Inferior – https://tdn.totvs.com/display/public/framework/FWMsPrinter
oPrintPvt:SayAlign(nLinAtu, nColIni, “testando 123”, oFontDetN, 270, nAltura, /*nClrText*/, PAD_CENTER, nVertAlin )
[…]
Tenha uma ótima e abençoada sexta feira.
Um grande abraço.
Parabéns pelo conteúdo,
pegando o texto(justificado) como exemplo, se eu quiser
colocar como NEGRITO somente a frase “muita coisa no Terminal mudou”,
como faço ?
Bom dia, tudo joia?
Opa, nós que agradecemos pelo comentário.
Você vai precisar primeiro, declarar uma variável TFont que tenha o atributo negrito como .T., vamos supor que o nome dela vai ser oFontDetN.
Em seguida, na impressão, você vai testar a linha, se for a linha que contém “muita coisa no Terminal mudou”, ai você vai usar no SayAlign a fonte oFontDetN, senão se for as outras linhas, você vai usar a fonte normal oFontDet.
Tenha uma ótima e abençoada semana.
Um grande abraço.