
## 📄 Imprimindo textos longos no Protheus sem "chutar" quantos caracteres cabem na linha
Quem desenvolve relatórios no Protheus certamente já passou por isso.
Você precisa imprimir um texto longo e acaba recorrendo ao clássico:
```advpl
For nLine := 1 To MLCount(cText,nChars)
cLine := MemoLine(cText,nChars,nLine)
oPrinter:Say(nRow,nCol,cLine)
nRow += nLineHeight
Next
```
O problema é que `MLCount()` e `MemoLine()` fazem a quebra considerando **quantidade de caracteres**, enquanto a impressão é realizada considerando a **largura visual do texto**, que depende da fonte, do tamanho, do estilo (negrito/itálico) e da área disponível para impressão.
O resultado normalmente é conhecido:
* textos ultrapassando a largura da coluna;
* quebra antes do necessário;
* cálculo incorreto da altura das células;
* necessidade de ajustar o número de caracteres "na tentativa e erro" sempre que muda a fonte ou o layout do relatório.
Foi justamente para resolver esse problema que desenvolvi o **DNATech TLPP VisualText**.
A ideia da biblioteca é simples: em vez de calcular a quebra por quantidade de caracteres, ela calcula o layout do texto considerando a largura disponível para impressão.
O código fica assim:
```advpl
oText := TVisualText():New()
oText:SetFont("Tahoma",10)
oText:SetArea(nLeft,nRight)
oText:SetWordWrap(.T.)
aLines := oText:Wrap(cText)
For Each cLine In aLines
oPrinter:Say(nRow,nLeft,cLine)
nRow += nLineHeight
Next
```
A biblioteca já oferece recursos como:
* ✅ quebra visual de texto;
* ✅ cálculo da quantidade de linhas;
* ✅ suporte a múltiplas fontes;
* ✅ Portrait e Landscape;
* ✅ negrito e itálico;
* ✅ tabulação (`nTabSize`);
* ✅ comportamento equivalente ao `MLCount()` (`lQuebra=.T.` e `.F.`);
* ✅ suporte a `CR`, `LF` e `CRLF`;
* ✅ programa de testes que gera PDFs comparativos para validar visualmente o resultado.
Atualmente a biblioteca utiliza perfis calibrados para estimar a largura dos caracteres, permitindo obter resultados bastante próximos da impressão real.
A próxima etapa do projeto será integrar diretamente com o Framework do Protheus utilizando `FWMsPrinter():GetTextWidth()` e `TReport():Char2Pix()`. Dessa forma, a quebra passará a utilizar as mesmas métricas empregadas pelo motor de impressão, tornando o cálculo ainda mais preciso e independente da fonte utilizada.
O projeto é totalmente **Open Source** e está disponível no GitHub para quem quiser utilizar, estudar ou contribuir.
🔗 **GitHub:**
[https://github.com/DNATechByNaldoDJ/dnatech-tlpp-visualtext](https://github.com/DNATechByNaldoDJ/dnatech-tlpp-visualtext)
---
#DNATech, #Protheus, #AdvPL, #TLPP, #TOTVS, #OpenSource, #PDF, #TextLayout, #SoftwareEngineering, #GitHub
---
Comentários
Postar um comentário