If you are using e.HasMorePages then you are - correctly - using a PrintDocument.
e.HasMorePages tells the system that after you return from the PrintPage event handler, it should finish passing the page to the output and then raise a new PrintPage event to let you put the next set of information together.
From the sound of it, you are setting HasMorePages in a loop and expecting that to end the page out put - that doesn't happen: you need to exit the event handler to finalise the page.
Try this very basic example:
Private pageNo As Integer = 1
Private Sub pd_PrintPage(ByVal sender As Object, ByVal ev As PrintPageEventArgs)
ev.Graphics.DrawString(pageNo.ToString(), Font, Brushes.Black, 100, 100)
pageNo = pageNo + 1
ev.HasMorePages = pageNo <= 3
End Sub