ImageAlignment.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' © 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

'' DsPdfの画像整列オプションの使用例を示すサンプルです。
'' このサンプルは、以前「Raw画像」という題名で公開されていた、
'' RawImageクラスを使用し、JPEG画像をドキュメントに追加するデモの代替です。
'' RawImageクラスは現在も使用可能ですが、将来的に廃止される予定のため、
'' ImageAlignクラスでの画像整列オプションを使用することをお勧めします。

'' 注意:DsPdfで同じ画像を複数回レンダリングする場合
'' (例:全ページのヘッダーとして同じ画像を描画する場合など)、
'' 同じ画像オブジェクトを使うと、その画像は自動的にDsPdf内部の
'' ディクショナリに登録され、ドキュメント全体で再利用されます。
'' そのため、毎回ファイル(またはストリーム)から同じ画像を読み込むのではなく、
'' 一度画像を読み込んで、画像オブジェクトとしてキャッシュすることが推奨されます。
'' (この仕組みはDsPdfで扱うすべての画像タイプに適用されます。)
Public Class ImageAlignment
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()

        '' キャプション描画用のテキストフォーマットを設定します:
        Dim tf = New TextFormat() With {.Font = StandardFonts.Times, .FontSize = 12}

        '' 様々な画像整列オプションを使って、画像を描画します:
        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")))
                '' イメージキャプションを描画します:
                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?)
                '' イメージを描画します:
                Dim imageRects As RectangleF() = Nothing
                page_.Graphics.DrawImage(image_, rect, clip, ia_, imageRects)
                '' 画像のアウトラインを表示します:
                page_.Graphics.DrawRectangle(imageRects(0), Color.Red, 1, DashStyle.Solid)
                '' 画像、クリップ領域を表示する:
                page_.Graphics.DrawRectangle(rect, Color.Blue, 1, DashStyle.Solid)
            End Sub

        '' JPEGからイメージを作成する
        ''(ここでImage クラスのインスタンスを一度作成して、それを使い回してPDFに画像を描画することで、
        ''画像データが再利用できます。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"))

            '' ImageAlignクラスは、さまざまな画像整列オプションを提供します。
            '' よく使われるオプションは、静的インスタンスで定義されています。
            '' 以下の例を参照してください。

            '' ページ 1: 既定の配置(Default)に、クリッピング無しで描画する:
            drawImage(img, doc.NewPage(), ImageAlign.Default, False)

            '' ページ 2:既定の配置(Default)に、クリッピングして描画する:
            drawImage(img, doc.NewPage(), ImageAlign.Default, True)

            '' ページ 3: 中央(CenterImage)に、クリッピングして描画:
            drawImage(img, doc.NewPage(), ImageAlign.CenterImage, True)

            '' ページ 4: 枠いっぱいに引き伸ばして(StretchImage)、クリッピング無しで描画:
            drawImage(img, doc.NewPage(), ImageAlign.StretchImage, False)

            ''以下のようにインスタンスを作成することで、細かいカスタム設定も可能です。

            '' ページ 5: クリッピング無し、画像を枠内に収め、縦横比を保って描画:
            Dim ia = New ImageAlign(ImageAlignHorz.Center, ImageAlignVert.Center, True, True, True, False, False)
            drawImage(img, doc.NewPage(), ia, False)

            '' ページ 6: 小さい画像を、クリッピング無し、画像を枠内に収め、縦横比を保って、タイル状に並べて描画:
            ia = New ImageAlign(ImageAlignHorz.Left, ImageAlignVert.Top, False, False, True, True, True)
            drawImage(imgSmall, doc.NewPage(), ia, False)

            '' PDF ドキュメントを保存します。
            doc.Save(stream)
            Return doc.Pages.Count
        End Using
    End Function
End Class