Ok I generate a print preview, the only thing is, if there is enough data to fill like 2-3 pages I don't know how to generate a new page. It only fills the first page and that's it....

Code:
Private Doc As New PrintDocument()

Private Sub btnPrint_Click(sender As System.Object, e As System.EventArgs) Handles btnPrint.Click
        Dim ppDlg As New PrintPreviewDialog()
        ppDlg.ShowIcon = False
        ppDlg.Document = Doc
        ppDlg.Show()
        AddHandler Doc.PrintPage, AddressOf Print_PrintPage
    End Sub

Dim g As Graphics = e.Graphics
        g.DrawImage(Roll_Off_Manager.My.Resources.Elk, 0, 10)
        g.DrawString("City of Elk City Roll-Off Account", New Font("arial", 18, FontStyle.Bold), Brushes.Black, 230, 110)
        Dim name As String = cboFinalAccounts.Text
        Dim stopName As Integer
        Dim startNumber, stopNumber As Integer
        For i As Integer = 0 To name.Length - 1
            If name.Substring(i, 1) = "(" Then
                stopName = i
                startNumber = i + 1
            ElseIf name.Substring(i, 1) = ")" Then
                stopNumber = i - 1
            End If
        Next
        g.DrawString(name.Substring(0, stopName - 1), New Font("arial", 14, FontStyle.Italic), Brushes.Black, 230, 150)
        g.DrawString("Account #: ", New Font("arial", 10, FontStyle.Bold), Brushes.Black, 550, 170)
        g.DrawString(name.Substring(startNumber, stopNumber - stopName), New Font("arial", 10, FontStyle.Bold), Brushes.Black, 625, 170)
        g.DrawString(txtPhone.Text, New Font("arial", 11), Brushes.Black, 230, 175)
        g.DrawString(txtAddress.Text, New Font("arial", 10), Brushes.Black, 100, 235)
        Try
            con.ConnectionString = dbProvider & dbSource
            con.Open()
            sql = "SELECT * FROM FinaledAccounts WHERE CustomerID = " & CInt(tsslCustomer.Text)
            da = New OleDb.OleDbDataAdapter(sql, con)
            ds.Clear()
            da.Fill(ds, "FinaledAccounts")
            con.Close()
            Dim setup, final As Date
            If ds.Tables("FinaledAccounts").Rows.Count > 0 Then
                setup = ds.Tables("FinaledAccounts").Rows(0).Item(9)
                final = ds.Tables("FinaledAccounts").Rows(0).Item(14)
            End If
            g.DrawString("__________________________________________________________________________________", New Font("arial", 10), Brushes.Black, 100, 190)
            g.DrawString(setup.ToString("MM/dd/yyyy") & " - " & final.ToString("MM/dd/yyyy"), New Font("arial", 10, FontStyle.Bold), Brushes.Black, 340, 210)
            g.DrawString("__________________________________________________________________________________", New Font("arial", 10), Brushes.Black, 100, 215)
            g.DrawString("Invoice #", New Font("arial", 8), Brushes.Black, 60, 270)
            g.DrawString("Ticket #", New Font("arial", 8), Brushes.Black, 120, 270)
            g.DrawString("Date", New Font("arial", 8), Brushes.Black, 180, 270)
            g.DrawString("Unit", New Font("arial", 8), Brushes.Black, 240, 270)
            g.DrawString("Weight", New Font("arial", 8), Brushes.Black, 280, 270)
            g.DrawString("Overweight", New Font("arial", 8), Brushes.Black, 330, 270)
            g.DrawString("Mileage", New Font("arial", 8), Brushes.Black, 400, 270)
            g.DrawString("Service", New Font("arial", 8), Brushes.Black, 460, 270)
            g.DrawString("Delivery", New Font("arial", 8), Brushes.Black, 520, 270)
            g.DrawString("Rental", New Font("arial", 8), Brushes.Black, 580, 270)
            g.DrawString("Extra", New Font("arial", 8), Brushes.Black, 640, 270)
            g.DrawString("Driver", New Font("arial", 8), Brushes.Black, 690, 270)
            g.DrawString("Subtotal", New Font("arial", 8), Brushes.Black, 730, 270)
            g.DrawString("______________________________________________________________", New Font("arial", 8), Brushes.Black, 280, 255)
            g.DrawString("Costs and Fees", New Font("arial", 8, FontStyle.Bold), Brushes.Black, 430, 250)
            g.DrawString("_________________________________________________________________________________________________________________", New Font("arial", 8), Brushes.Black, 60, 275)
            Dim down As Integer = 290
            Dim ticket, driver As String
            For i As Integer = 0 To dgvFinaledCharges.Rows.Count - 1
                g.DrawString(dgvFinaledCharges.Rows(i).Cells(0).Value, New Font("arial", 8), Brushes.Black, 60, down)
                ticket = IIf(IsDBNull(dgvFinaledCharges.Rows(i).Cells(1).Value), String.Empty, dgvFinaledCharges.Rows(i).Cells(1).Value)
                g.DrawString(ticket, New Font("arial", 8), Brushes.Black, 120, down)
                g.DrawString(dgvFinaledCharges.Rows(i).Cells(2).Value, New Font("arial", 8), Brushes.Black, 180, down)
                g.DrawString(dgvFinaledCharges.Rows(i).Cells(3).Value, New Font("arial", 8), Brushes.Black, 240, down)
                g.DrawString(dgvFinaledCharges.Rows(i).Cells(9).Value, New Font("arial", 8), Brushes.Black, 280, down)
                g.DrawString(dgvFinaledCharges.Rows(i).Cells(14).Value, New Font("arial", 8), Brushes.Black, 330, down)
                g.DrawString(dgvFinaledCharges.Rows(i).Cells(10).Value, New Font("arial", 8), Brushes.Black, 400, down)
                g.DrawString(dgvFinaledCharges.Rows(i).Cells(11).Value, New Font("arial", 8), Brushes.Black, 460, down)
                g.DrawString(dgvFinaledCharges.Rows(i).Cells(12).Value, New Font("arial", 8), Brushes.Black, 520, down)
                g.DrawString(dgvFinaledCharges.Rows(i).Cells(13).Value, New Font("arial", 8), Brushes.Black, 580, down)
                g.DrawString(dgvFinaledCharges.Rows(i).Cells(15).Value, New Font("arial", 8), Brushes.Black, 640, down)
                driver = IIf(IsDBNull(dgvFinaledCharges.Rows(i).Cells(17).Value), String.Empty, dgvFinaledCharges.Rows(i).Cells(17).Value)
                g.DrawString(driver, New Font("arial", 8), Brushes.Black, 690, down)
                g.DrawString(dgvFinaledCharges.Rows(i).Cells(19).Value, New Font("arial", 8), Brushes.Black, 730, down)
                down += 20
            Next
            g.DrawString("_________________________________________________________________________________________________________________", New Font("arial", 8), Brushes.Black, 60, down - 10)
            g.DrawString("Total Tons Emptied: ", New Font("arial", 11, FontStyle.Bold), Brushes.Black, 501, down + 20)
            g.DrawString("Total:", New Font("arial", 11, FontStyle.Bold), Brushes.Black, 610, down + 50)
            g.DrawString(tsslTotalTons.Text.Substring(0, (tsslTotalTons.Text.Length - 19)), New Font("arial", 11, FontStyle.Bold), Brushes.Black, 670, down + 20)
            g.DrawString(tsslTotalRevenue.Text, New Font("arial", 11, FontStyle.Bold), Brushes.Black, 670, down + 50)
don't worry about most of the code it's just pulling data from database and printing necessary charges to the invoice, but if the invoice is more than 1 page then I don't know what to do because it only generates 1 page.