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.