Tinha muito disto na NFCe.
nLinha := 1
DO WHILE .T.
cLinha := Trim( MemoLine( ::aDest[ "xNome" ], 44, nLinha ) )
IF Empty( cLinha )
EXIT
ENDIF
::DrawTexto( 37, ::nLinhaPDF - 10, 220, NIL, cLinha, HPDF_TALIGN_LEFT, ::oPDFFontNormal, 7 )
::nLinhaPDF -= 10
nLinha++
ENDDO
Troquei por isto:
FOR EACH oElement IN ::FormatMemoAsArray( ::aDest[ "xNome" ] )
::DrawTexto( 37, ::nLinhaPDF - 10, 220, NIL, oElement, HPDF_TALIGN_LEFT, ::oPDFFontNormal, 7 )
::nLinhaPDF -= 10
NEXT
E passei a divisão pra uma função.
METHOD FormatTextAsArray( cText, nLarguraCol )
LOCAL aText := {}, nCont, cLinha
FOR nCont = 1 TO 100
cLinha := MemoLine( cText, nLarguraCol, nCont )
IF Empty( cLinha )
EXIT
ENDIF
AAdd( aText, cLinha )
NEXT
RETURN aText
Isso economizou linhas de fonte, e eliminou a variável cLinha.
Depois, foi só usar outra função já existente
HPDF_Page_SetFontAndSize( ::oPdfPage, ::oPDFFontBold, 7 )
cText := ::FormataMemo( cText, Int( 220 / 60 * nLarguraCol ) )
Essa eu já havia criado, que divide o texto pela "largura em PDF" e não por colunas.
Agora é testar com vários CFes.
por enquanto o antes e o depois, com o ajuste por "largura em pdf".
Achei interessante usar o FOR/EACH pra isso, por isso postando como mais um exemplo de uso.
Nota: reduziu cerca de 25 linhas, mesmo com a adição do novo recurso.
https://github.com/JoseQuintas/sefazclass/commit/59844fb957d25bbb4f3e5d25b8268ed8bd887207