When it came to the manipulation of multipage TIFFs, I found that the documentation wasn't easily understandable, and I only found little bits and pieces on the 'net for how to do it. I eventually pieced it all together into something workable, but I wanted to make it a little easier on you. So here's a class that loads and prints a multipage TIFF to the default printer.
Public Class PrintTiff
Private m_tiff As Drawing.Image
Private m_fd As FrameDimension
Public Sub New()
' Sends a multi-page TIFF document to the default printer.
Public Function PrintTiffDocument(ByVal PathToTIFF As String) As String
Dim tiffDocument As New PrintDocument
' Load TIFF from file.
m_tiff = System.Drawing.Image.FromFile(PathToTIFF)
' Get the frame dimensions.
m_fd = New FrameDimension(m_tiff.FrameDimensionsList(0))
' Setup the print handler.
AddHandler tiffDocument.PrintPage, AddressOf PrintTiffPage
' Print the image.
' Throw all exceptions to caller.
' Print each page of the tiff to the printer.
Private Sub PrintTiffPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
Static pageNum As Int32 = 0
e.Graphics.DrawImage(m_tiff, New PointF(0, 0))
pageNum += 1
If pageNum < m_tiff.GetFrameCount(m_fd) Then
e.HasMorePages = True
pageNum = 0
I'm not sure why, though I'm sure there's a good historic reason, but GDI+ refers to an image page as a "frame". So all of the methods with "frame" in the name are actually used in manipulating the pages. The PrintTiffPage needs a little bit of explaining, so here's what's happening there:
First of all, I keep the current page number in a static variable so that for each subsequent call the method knows which page to print (this number is reset to zero once the image has been completely printed). The SelectActiveFrame() method sets the page number that is the current page for the TIFF (starting with zero). You have to have a FrameDimension object for the TIFF to pass to this method. After selecting the page to print, I draw the page onto the printer using the DrawImage method. I put the page in the upper-left corner of the printer. Finally, if there are any pages left to print, I set the event flag indicating this is the case, otherwise I reset the page number to zero so the next call to the PrintTiffDocument() method will start on the first page.
Questions or comments? Email me!