We recently had a client writing a nice application outputting PDF with our MBS Xojo DynaPDF Plugin. You can use the WriteFText function (or WriteStyledText) to layout text over multiple boxes on multiple pages to do layouts like a newspaper or a magazine. You can continue on a different page (next one, previous one, jump 10 pages forward) and leave room to place images.
Today we have the little trick to avoid having a last line in a paragraph on the next page like in the picture above. As you see we drew a rectangle to show the area we use for WriteFText to draw the text. Since our text doesn’t fit, the PageBreak event gets called and we start a new page to continue drawing there.
Recently we added the GetLastTextOffset function to ask where in the text we are for the page break. We can measure the height of the text going on the next box and just add this text as a line below the block, if it is short. This avoids the one line on the top of the next page. Here is the sample code:
EventHandler Function PageBreak(LastPosX as double, LastPosY as double, PageBreak as boolean) As integer
If fix Then
// where did text finish?
Dim LastTextPosY As Double = Me.GetLastTextPosY
// query the text rectangle
Dim RectX As Double
Dim RectY As Double
Dim RectW As Double
Dim RectH As Double
Call Me.GetTextRect(RectX, RectY, RectW, RectH)
// now check how much text is left
Dim pos As Integer = Me.GetLastTextOffset
Dim textLeft As String = CurrentText.Mid(pos+1)
// measure height
Dim Heigth As Double = Me.GetTextHeightEx(RectW, Me.ktaJustify, textLeft)
// if small, then add below existing block
If Heigth < 20 Then
Call Me.SetTextRect(RectX, LastTextPosY, RectW, 30)
Return Me.kNEW_ALIGN_JUSTIFY
End If
End If
// make a new page and continue
Call Me.EndPage
Call Me.Append
// continue
Return Me.kNEW_ALIGN_JUSTIFY
End EventHandler
Please try and let us know if you have questions. See the example “Create PDF with text block2” coming with 23.4 plugin versions.
If you like to use this, get a DynaPDF Starter (or higher) license, e.g. with OmegeBundle.
from our blog: DynaPDF WriteFText last line handling