InlineImages.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' Copyright (c) GrapeCity inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Drawing

'' このサンプルは、任意のオブジェクト(このサンプルの画像)をテキスト
'' ブロックに挿入して、そのオブジェクトが周囲のテキストに対して相対的な
'' 位置を保持し、他のテキストの実行とまったく同じように配置され、
'' テキストフローに参加できるようにする方法を示します 。
Public Class InlineImages
    Function CreatePDF(ByVal stream As Stream) As Integer
        '' インラインオブジェクトとして使用する画像を取得します。
        Using imgPuffins As Image = Image.FromFile(Path.Combine("Resources", "ImagesBis", "puffins-small.jpg")),
            imgFerns As Image = Image.FromFile(Path.Combine("Resources", "ImagesBis", "ferns-small.jpg"))
            '' 使用する画像配置。
            Dim ia = New ImageAlign(ImageAlignHorz.Center, ImageAlignVert.Bottom, True, True, True, False, False)
            '' ドキュメントを作成して設定します。
            Dim doc = New GcPdfDocument()
            Dim page = doc.NewPage()
            Dim g = page.Graphics
            Const fontname = "Yu Gothic"
            '' テキストを出力するための TextLayout オブジェクトを作成して設定します。
            Dim tl = g.CreateTextLayout()
            tl.MaxWidth = page.Size.Width
            tl.MaxHeight = page.Size.Height
            tl.MarginLeft = 36
            tl.MarginRight = 36
            tl.MarginTop = 36
            tl.MarginBottom = 36
            tl.DefaultFormat.FontName = fontname
            tl.DefaultFormat.FontSize = 12
            tl.DefaultFormat.BackColor = Color.LightGoldenrodYellow
            tl.TextAlignment = TextAlignment.Justified
            '' 画像と任意のサイズを使用してインラインオブジェクトを作成します。
            Dim ioPuffins = New InlineObject(imgPuffins, 36, 24)
            Dim ioFerns = New InlineObject(imgFerns, 36, 24)
            '' テキストを構築します。
            tl.Append(
                "TextLayout クラスの「Inline objects(インラインオブジェクト)」機能は、任意のオブジェクトをテキストブロックに挿入することを可能にします。" +
                "これらのオブジェクトは、他のテキストの実行とまったく同じように扱われ、" +
                "周囲のテキストに相対的な位置を保持します。" +
                "このサンプルでは、画像をインラインオブジェクトとしてテキストに挿入し、" +
                "TextLayout クラスを使用して画像をテキストと共に配置し、" +
                "GcGraphics.DrawImage メソッドを使用して描画します。"
            )
            tl.Append("海鳥の画像があります:")
            tl.Append(ioPuffins)
            tl.Append("こちらはシダ植物です:")
            tl.Append(ioFerns)
            tl.Append(" - おわり -")
            ''
            Debug.Assert(tl.InlineObjects.Count = 0, "インラインオブジェクトを再計算されたグリフで描画")
            '' このメソッドは、テキストのレンダリングに必要なグリフを取り出して測定します。
            '' 同じテキストを異なるレイアウトで数回描くので、これをループの前に一度呼びます。
            tl.RecalculateGlyphs()
            ''
            Debug.Assert(tl.InlineObjects.Count = 2, "インラインオブジェクトを再計算されたグリフで描画")
            '' ループ内で、ページ上の3つの異なる位置および領域に、テキストと
            '' インライン画像を描画します。
            For i = 0 To 2
                tl.MarginTop = tl.ContentRectangle.Bottom + 36
                tl.MarginLeft = 36 + 72 * i
                tl.MarginRight = 36 + 72 * i
                '' ここで 'false' を渡すことに注意してください。テキストは変更されていないので、
                '' グリフを再計算する必要はありません。
                tl.PerformLayout(False)
                '' テキストとイメージを描画します。
                g.DrawTextLayout(tl, PointF.Empty)
                For Each inlineObj In tl.InlineObjects
                    g.DrawImage(CType(inlineObj.Object, Image), inlineObj.ObjectRect.ToRectangleF(), Nothing, ia)
                Next
            Next
            ''
            '' PDF ドキュメントを保存します。
            doc.Save(stream)
            Return doc.Pages.Count
        End Using
    End Function
End Class