ImageAlignment.vb
''
'' This code is part of Document Solutions for PDF demos.
'' Copyright (c) MESCIUS inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports System.Text
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Drawing
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing

'' Using image alignment options in DsPdf.
'' (This example replaces the older RawImages example; the RawImage class is obsolete and should not be used.)
''
'' NOTE: When you render an image in DsPdf multiple times (e.g. rendering
'' the same image as part of a page header on all pages), it will automatically be
'' added to a dictionary and reused throughout the document, provided you use
'' the same image object on all pages. So rather than loading the same image from
'' file (or stream) each time it is needed, it is always preferable to load the image
'' once and cache it in an image object. This applies to all image types used in DsPdf.
Public Class ImageAlignment
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()

        '' Text format used to draw captions:
        Dim tf = New TextFormat() With {.Font = StandardFonts.Times, .FontSize = 12}

        '' Action to draw the image with various alignment options:
        Dim drawImage As Action(Of GCDRAW.Image, Page, ImageAlign, Boolean) =
            Sub(ByVal image_, ByVal page_, ByVal ia_, ByVal clip_)
                Dim rect = New RectangleF(72, 72, 72 * 4, 72 * 4)
                Dim clipped = If(clip_, "clipped to a 4""x4"" rectangle", "without clipping")
                Dim align = If(ia_ Is ImageAlign.Default, "ImageAlign.Default",
                    If(ia_ Is ImageAlign.CenterImage, "ImageAlign.CenterImage",
                    If(ia_ Is ImageAlign.StretchImage, "ImageAlign.StretchImage", "custom ImageAlign")))
                '' Draw image caption:
                page_.Graphics.DrawString($"Page {doc.Pages.IndexOf(page_) + 1}: Image drawn at (1"", 1 ""), {clipped}, using {align}:", tf, New PointF(72, 36))
                Dim clip As RectangleF? = If(clip_, rect, New RectangleF?)
                '' Draw the image:
                Dim imageRects As RectangleF() = Nothing
                page_.Graphics.DrawImage(image_, rect, clip, ia_, imageRects)
                '' Show the image outline:
                page_.Graphics.DrawRectangle(imageRects(0), Color.Red, 1, DashStyle.Solid)
                '' Show image/clip area:
                page_.Graphics.DrawRectangle(rect, Color.Blue, 1, DashStyle.Solid)
            End Sub

        '' Create images from JPEG files (using the same Image class instance to draw an image
        '' in a PDF ensures that the image data will be reused and not duplicated in the PDF):
        Using img As GCDRAW.Image = GCDRAW.Image.FromFile(Path.Combine("Resources", "Images", "puffins.jpg")),
            imgSmall As GCDRAW.Image = GCDRAW.Image.FromFile(Path.Combine("Resources", "ImagesBis", "puffins-small.jpg"))

            '' The ImageAlign class provides various image alignment options.
            '' It also defines a few static instances with some commonly used
            '' combinations of options demonstrated below.

            '' Page 1: draw image without clipping, with default alignment:
            drawImage(img, doc.NewPage(), ImageAlign.Default, False)

            '' Page 2: draw image with clipping, with default alignment:
            drawImage(img, doc.NewPage(), ImageAlign.Default, True)

            '' Page 3: draw image with clipping, with CenterImage alignment:
            drawImage(img, doc.NewPage(), ImageAlign.CenterImage, True)

            '' Page 4: draw image without clipping and stretched image:
            drawImage(img, doc.NewPage(), ImageAlign.StretchImage, False)

            '' Page 5: draw image without clipping, fit into the rectangle, preserving aspect ratio:
            Dim ia = New ImageAlign(ImageAlignHorz.Center, ImageAlignVert.Center, True, True, True, False, False)
            drawImage(img, doc.NewPage(), ia, False)

            '' Page 6: draw a small image tiled, without clipping, fit into the rectangle, preserving aspect ratio:
            ia = New ImageAlign(ImageAlignHorz.Left, ImageAlignVert.Top, False, False, True, True, True)
            drawImage(imgSmall, doc.NewPage(), ia, False)
            ''
            '' Done:
            doc.Save(stream)
            Return doc.Pages.Count
        End Using
    End Function
End Class