mike mcintyre's

.N e t J o u r n a l

This blog hosted by:
http://blogs.vbcity.com      
  Home :: Syndication  :: Login

AprMay 2008Jun
SMTWTFS
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

Archives

Topics

Source Code

Download Source Code: Source Code

Update: Cleaned up pages wide and pages tall calculation per suggestion from a reader.

This article discusses how to print a multiple page image and provides sample code in a Visual Studio 2005 solution. The process involves calculating an array of rectangles where each rectangle defines a page size chunk of the image. The rectangles are then used to extract a page sized chunk from the image for each page to be printed.

Code Example One

Before it can be printed, a large image must be divided into page size chunks. In the sample code this is accomplished with the CalculatePages method:

Private Sub CalculatePages(ByVal theImage As Image)

        ' Declare a variable named thePrinterSettings of type PrinterSettings;

        ' call the PrinterSettings class' New constructor assigning the resulting

        ' PrinterSettings object to thePrinterSettings variable.

        Dim thePrinterSettings As New PrinterSettings

 

        ' Calcuate Page Width

        Me._PageWidth = (thePrinterSettings.DefaultPageSettings.PaperSize.Width - thePrinterSettings.DefaultPageSettings.Margins.Left - thePrinterSettings.DefaultPageSettings.Margins.Right)

 

        ' Calculate Page Height

        Me._PageHeight = (thePrinterSettings.DefaultPageSettings.PaperSize.Height - thePrinterSettings.DefaultPageSettings.Margins.Top - thePrinterSettings.DefaultPageSettings.Margins.Bottom)

 

        ' Calculate Pages Wide

        Me._PagesWide = CInt(Math.Ceiling((theImage.Width / Me._PageWidth)))

 

        ' Calculate Pages Tall

        Me._PagesTall = CInt(Math.Ceiling((theImage.Height / Me._PageHeight)))

 

        ' Declare a variable of type Rectangle array;

        ' set its capacity to hold a rectangle for each of the pages to be printed.

        Dim pagesRectangles((Me._PagesTall * Me._PagesWide) - 1) As Rectangle

 

        ' Declare variables to hold coordinates as each pages rectangle is calculated.

        Dim LeftX, LeftY, RightX, RightY As Integer

 

        ' Declare variable to add rectangles to pagesRectangle elements.

        Dim rectNumber As Integer = 0

 

        ' Process the image into an array of rectangles; each rectangle

        ' contains the coordinates to extract part of the image to a printed page.

        For row As Integer = 0 To Me._PagesTall - 1

            For col As Integer = 0 To Me._PagesWide - 1

                LeftX = col * Me._PageWidth

                LeftY = row * Me._PageHeight

 

                RightX = (LeftX + Me._PageWidth)

                RightY = (LeftY + Me._PageHeight)

 

                ' Add a rectangle for the page to pagesRectangles.

                pagesRectangles(rectNumber) = New Rectangle(LeftX, LeftY, RightX, RightY)

 

                rectNumber += 1

 

            Next

        Next

 

        ' Assign pagesRectangle object to _pagesRectangles variable.

        Me._pageRectangles = pagesRectangles

 

End Sub

Code Example Two

After the page size chunks have converted into image coordinates they can be used to print each page size chunk one at a time:

Private Sub PrintImage(ByVal sender As Object, ByVal e As Printing.PrintPageEventArgs)

 

        ' Declare a variable named pageImage of type Bitmap;

        ' Call the BitMap class' New constructor assigning the resulting

        ' Bitmap object to the pageImage variable.

        Dim pageImage As New Bitmap(Me._PageWidth, Me._PageHeight)

 

        ' Declare a variable named pageImageGraphics of type Graphics;

        ' call the Graphics class' FromImage method assigning the resulting

        ' Graphics object to the pageImageGraphics variable.

        Dim pageImageGraphics As Graphics = Graphics.FromImage(pageImage)

 

        ' Call thePageImageGraphics object's DrawImage method to draw

        ' a portion of the image being printed to the pageImage BitMap.

        pageImageGraphics.DrawImage(Me._LargeImage, 0, 0, Me._pageRectangles(Me._PagesPrinted), GraphicsUnit.Pixel)

 

        ' Call the PrintPageEventArgs DrawImage method to draw pageImage to the printer.

        e.Graphics.DrawImage(pageImage, New Point(e.MarginBounds.Left, e.MarginBounds.Top))

 

        ' Increment _PagePrinted.

        _PagesPrinted += 1

 

        ' If all pages have been printed - either during preview or print - set

        ' the PrintPageEventsArgs HasMorePages property to false to stop printing.

        If Me._PagesPrinted = (Me._pageRectangles.GetLength(0)) Then

            e.HasMorePages = False

            ' Reset _PagesPrinted to 0 for the next print operation.

            Me._PagesPrinted = 0

        Else

            ' If not all pages have been printed set the PrintPageEventArgs HasMorePages

            ' property to True so the next page will be printed.

            e.HasMorePages = True

        End If

 

End Sub

For more information visit the links below:

PrintDocument Class

PrinterSettings Class

PrintDialog Class

Click the link above to download Visual Basic source code in a Visual Studio 2005 solution which demonstrates how to print a multiple page image.
 
 
Mike McIntyre
http://www.getdotnetcode.com
posted on Wednesday, September 20, 2006 3:16 PM