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

'' GcPdf で JPEG と JPEG2000 画像を使用します。
'' 
'' 重要:GcPdf 内で画像を複数回描画するとき(例えば、すべてのページのページヘッダの一部として
'' 同じ画像を描画するなど)、すべてのページで同じイメージオブジェクトを使用する場合は、
'' 自動的に辞書に追加され、ドキュメント全体で再利用されます。
'' そのため、必要になるたびにファイル(またはストリーム)から同じ画像を読み込むのではなく、
'' 画像を一度読み込んでイメージオブジェクトにキャッシュすることが常に望ましいです。
'' これは、GcPdf(Image、RawImage)で利用できるすべての画像形式に適用されます。
Public Class RawImages
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        '' PDF 形式では、JPEG および JPEG2000 画像を PDF のネイティブ画像形式に変換せずに
        '' そのままドキュメントに挿入できます。
        ''  GcPdf でこれを行うには、以下のコードが示すように、RawImage クラスを使用できます。
        '' 
        '' JPEG ファイルから RawImage のインスタンスを作成します。
        Using img As RawImage = RawImage.FromFile(Path.Combine("Resources", "Images", "puffins.jpg"), RawImageFormat.Jpeg, 800, 532),
            imgSmall As RawImage = RawImage.FromFile(Path.Combine("Resources", "ImagesBis", "puffins-small.jpg"), RawImageFormat.Jpeg, 144, 96)
            '' キャプションの描画に使用されるテキスト書式。
            Dim tf = New TextFormat() With {.FontName = "Yu Gothic", .FontSize = 12}

            '' さまざまなオプションを使用して画像を描画するアクション。
            Dim drawImage As Action(Of RawImage, 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_, "4×4インチの矩形に切り取り", "切り取りなし")
                Dim align = If(ia_ Is ImageAlign.Default, "規定の配置",
                    If(ia_ Is ImageAlign.CenterImage, "中央寄せ",
                    If(ia_ Is ImageAlign.StretchImage, "矩形にあわせる", "カスタム")))
                '' 画像のキャプションを描画します。
                page_.Graphics.DrawString($"{doc.Pages.IndexOf(page_) + 1}ページ: 画像の場所 (1"", 1 ""), {clipped}, 配置 {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

            '' ImageAlign クラスは、さまざまな画像の配置オプションを提供します。
            '' また、一般的に使用されるオプションの組み合わせをいくつかの
            '' 静的インスタンスとして定義しています。

            '' ページ1:クリッピングせずにデフォルトの配置で画像を描画します。
            drawImage(img, doc.NewPage(), ImageAlign.Default, False)

            '' ページ2:デフォルトの配置でクリッピングして画像を描画します。
            drawImage(img, doc.NewPage(), ImageAlign.Default, True)

            '' ページ3:中央寄せ配置でクリッピングして画像を描画します。
            drawImage(img, doc.NewPage(), ImageAlign.CenterImage, True)

            '' ページ4:クリッピングせずに画像を引き延ばして描画します。
            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