METHOD FormataMemo( cMemo, nLarguraPDF ) CLASS hbNFeDaNFe
LOCAL cNovoTexto := "", cTexto, nPos, nCont
FOR nCont = 1 TO MLCount( cMemo, 10000 )
cTexto := MemoLine( cMemo, 10000, nCont )
DO WHILE .T.
nPos := HPDF_Page_MeasureText( ::oPDFPage, cTexto, nLarguraPDF, .T. )
IF nPos == 0
nPos := HPDF_Page_MeasureText( ::oPDFPage, cTexto, nLarguraPDF, .F. )
nPos := Max( nPos, 2 )
ENDIF
cNovoTexto += Substr( cTexto, 1, nPos ) + Chr(13) + Chr(10)
cTexto := AllTrim( Substr( cTexto, nPos + 1 ) )
IF Len( cTexto ) == 0
EXIT
ENDIF
ENDDO
NEXT
IF Right( cNovoTexto, 2 ) == Chr(13) + Chr(10)
cNovoTexto := Substr( cNovoTexto, 1, Len( cNovoTexto ) - 2 )
ENDIF
RETURN cNovoTexto
Só passar a string, e a largura que será usada no PDF.
O resultado é o texto que poderá ser trabalhado usado MLCount() e MemoLine()
? Memoline( cTexto, 1000, nCont )
Ou seja, na impressão é só imprimir, já vai estar do tamanho certo.
- A primeira medida separando sem "quebrar" palavras
- Se essa falhar, separa do jeito que der.
- Se se essa também falhar, considera 2 letras - só pra evitar travamento em algum caso maluco.
Só como exemplo:
"Aaaaaaaaaaaaaaaaaaaaaaaaaa"
Se precisar dividir isso pra imprimir, com wordwrap on, não divide.
Por isso o teste em seguida com wordwrap off.
E já que é pra evitar erro, a terceira opção com 2 letras.... rs