DropCap.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

'' GcPdf 内でドロップキャップを作成する方法を示します。
Public Class DropCap
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim g = doc.NewPage().Graphics
        '' テキストを取得し、最初の文字(ドロップキャップ)とそれ以外の部分に分割します。
        Dim text = Util.getString_ja(1, 0, 1)
        Dim head = text.Substring(0, 1)
        Dim tail = text.Substring(1)
        '' Times フォントを使用します。
        Dim fnt = Font.FromFile(Path.Combine("Resources", "Fonts", "times.ttf"))
        '' ドロップキャップのテキストレイアウトします。
        Dim tlHead = g.CreateTextLayout()
        tlHead.DefaultFormat.Font = fnt
        tlHead.DefaultFormat.FontSize = 40
        tlHead.Append(head)
        tlHead.PerformLayout(True)
        '' 残りのテキストのテキストレイアウトします。
        Dim tlTail = g.CreateTextLayout()
        tlTail.DefaultFormat.Font = fnt
        tlTail.DefaultFormat.FontSize = 12
        '' 外周に 1 インチのマージンを持つページ全体を使用します。
        tlTail.MaxWidth = doc.Pages.Last.Size.Width - 72 * 2
        tlTail.MaxHeight = doc.Pages.Last.Size.Height - 72 * 2
        tlTail.Append(tail)
        '' テキストの本体をレイアウトする前に、ドロップキャップ矩形のサイズと位置を計算し、
        '' メインテキストレイアウトの ObjectRects に追加します。
        '' これは、外周にメインテキストがフローする長方形のリストです。
        '' 
        '' 注:ドロップキャップの矩形をメインテキストの左/左に配置するだけで済みますが、
        '' ドロップキャップの上端とメインテキストのグリフが整列している方が良いです。 
        '' このためには、テキスト境界ボックス内の文字上端のオフセットを計算し、
        '' それに応じてドロップキャップの位置を調整(少し上げる)する必要があります。
        '' 
        '' (この調整のためには、フォントの OS/2 テーブルのバージョン2以上の場合に存在する
        '' sCapHeight フィールドが必要です。したがって、それをテストし、CapHeight が利用できない
        '' 場合はこのステップをスキップする必要があります)
        Dim dy = 0F
        If fnt.CapHeight <> -1 Then
            '' ドロップキャップのフォントサイズの Em 四角内の上のスペースと残りのテキストの
            '' フォントサイズの差に等しい量だけ、ドロップキャップの位置を上に移動します。
            Dim k = tlHead.DefaultFormat.FontSize * tlHead.Resolution * tlHead.FontScaleFactor / (fnt.UnitsPerEm * 72)
            dy = (fnt.HorizontalAscender - fnt.CapHeight) * k
            k /= tlHead.DefaultFormat.FontSize
            k *= tlTail.DefaultFormat.FontSize
            dy -= (fnt.HorizontalAscender - fnt.SmallXHeight) * k
        End If
        '' 外周にメインテキストがフローする矩形を指定します。
        tlTail.ObjectRects = New List(Of ObjectRect) From {New ObjectRect(0, -dy, tlHead.ContentWidth * 1.2F, tlHead.ContentHeight)}
        '' 今すぐメインテキストをレイアウトします。
        tlTail.PerformLayout(True)
        '' すべてを描画します。
        g.DrawTextLayout(tlHead, New PointF(72, 72 - dy))
        g.DrawTextLayout(tlTail, New PointF(72, 72))
        ''
        '' PDF ドキュメントを保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class