Printing in a .Net (or any VB) program has always been a challenge. I developed the following VB.Net Class (with guidance from others) using Visual Studio 2010 to help simplify the printing process. This Class was developed to handle multi-page printed reports.

A Visual Studio 2010 project for DemoPrintHelperPages is available for your use.

Formatting and creating a multi-page printed report is done by a two step process.

  • First, create the PrintHelperPages Class and place the Class in "Layout Mode" by setting the LayoutMode property to True. Then create the report by using the Print Functions. This will create a list of phLayout structures that define where on each page your text will be printed. This first pass will detect when a line will exceed the allowable printable region for a page. If a line will exceed the printable region, a new page is forced and the line will be located at the top of the next page.
  • Next, turn off LayoutMode and call the Print Routines with the phLayout structures to print a specific page.

The class can be created with:

  • Dim php As New PrintHelperPages(_event, _font, _debug)

    Parameter Type Description
    _event System.Drawing.Printing.PrintPageEventArgs From the Event Handler
    _font Font (optional) Default Font
    _debug Boolean (optional) Debug Flag (draw boxes around text) - Default is False

Text can be Laid-Out or Printed by calling one of the following routines. These routines will return a formatted Print Helper Page Layout Structure:

  • Dim phl As phLayout = php.Print(_text, _UpdateX, _HeaderFooter, _AlignToX)
  • Dim phl As phLayout = php.Print(_text, _x, _y, _UpdateX, _HeaderFooter, _AlignToX)
  • Dim phl As phLayout = php.Print(_text, _fontIndex, _UpdateX, _HeaderFooter, _AlignToX)
  • Dim phl As phLayout = php.Print(_text, _fontIndex, _x, _y, _UpdateX, _HeaderFooter, _AlignToX)
  • Dim phl As phLayout = php.Print(_text, _fontIndex, _sfIndex, _UpdateX, _HeaderFooter, _AlignToX)
  • Dim phl As phLayout = php.Print(_text, _fontIndex, _sfIndex, _y, _UpdateX, _HeaderFooter, _AlignToX)
  • Dim phl As phLayout = php.Print(_text, _fontIndex, _sfIndex, _x, _y, _UpdateX, _HeaderFooter, _AlignToX)

    Parameter Type Description
    _text String String to print
    _fontIndex Integer Index of Font in Font List to use for this string
    _sfIndex Integer Index of StringFormat in StringFormat List to left/right/center justify the text
    _x Single X or horizontal position on the page to begin printing
    _y Single Y or vertical position on the page to begin printing
    _UpdateX Boolean (optional) Update X Coordinate after Print - Default is False
    _HeaderFooter Boolean (optional) Are we printing a Header or Footer outside usable range - Default is False
    _AlignToX Boolean (optional) Alignment is based on X rather than margin width - Default is False

To add a formatted phLayout structure to the list, the following is an example:

  • php.LayoutMode = True
  • Dim phl As New List(Of PrintHelperPages.phLayout)
  • phl.Add(m_php.Print("First Line on the Report"))
  • phl.Add(m_php.Print("Second Line on the Report"))
  • php.LayoutMode = False
  • php.Print(phl, 1)     ' Actually print page one

If no X position is given, the string will begin at the left margin unless _UpdateX option was used on a prior Print statement. The _UpdateX option will reset the default X position to the end of the current Text printed. Don't forget to reset the default X position by using the xPos property, usually setting it to e.MarginBounds.X.

If no Y position is given, the current vertical position will be used, which is updated after each line is printed.

A new feature has been added to allow the alignment to be based on the X position rather than the usable region width. For example, if AlignToX is set the False (default value) and you have a string format set to center, your text will be centered on the page. But, if you set AlignToX to True, then your text will be centered on your X coordinate.

Print Helper Page Layout Structure (phLayout):

  • Dim phl As New phLayout

    Variable Type Description
    Text String Text to Print
    fIndex Integer Font List Index
    sfIndex Integer StringFormat List Index
    Page Integer Page Number of Text
    x Single X Position to start
    y Single Y Position to start
    AlignToX Boolean Alignment is based on X rather than margin width

The following Routines can be called after your print pages have been Laid-Out to actually print your pages. You pass as a parameter either a single phLayout record or the entire list of phLayout structures to print a specific page.

  • php.Print(_phLayouts As List(Of phLayout), _page As Integer)
  • php.Print(_phl As phLayout)

    Parameter Type Description
    _phLayouts List(Of phLayout) List Array of formatted Print Helper Page Layout Structures
    _page Integer Specific page to print
    _phl phLayout Formatted Print Helper Page Layout Structure

Class Properties:

Property Name Type Description
Debug Boolean Get or Set the Debug Flag
LayoutMode Boolean Get or Set whether we are in Layout Mode or Not
DefaultFont Font Get or Set the Default Font
GetFont(_Index As Integer) Font Get the Specific Indexed Font from List
FontHeight Single Get or Set the Default Font Height
FontSpacing Single Get or Set the Default Font Spacing or Padding
DefaultStringFormat StringFormat Get or Set the Default StringFormat
GetStringFormat(_Index As Integer) StringFormat Get the Specific Indexed StringFormat
SetBrush Brush Set the Default Brush
xPos Single Get or Set the Current x (horizontal) Position
yPos Single Get or Set the Current y (vertical) Position
Page Integer Get the Current Page Number

Class Routines:

Routine Name Parameters Description
AddFont System.Drawing.Font Add a Font to the List
AddStringFormat System.Drawing.StringFormat Add a StringFormat to the List
AddBlankLine   Add a Line Height to the Current Y Location

The PrintHelperPages.vb Class:




The follow is a demo program to test the PrintHelperPages Class.

  • Create a new Windows Form Application Project with Visual Studio.
  • Create a PrintHelperPages Class with the above code.
  • Create a Button on the default Form1.
  • Use the follow code for Form1