DNATech :: 📄 Imprimindo textos longos no Protheus sem "chutar" quantos caracteres cabem na linha

## 📄 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

Postagens mais visitadas