DropCap.vb
'' 完毕:
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing

'' 此示例演示如何在 GcDocs.Pdf 中创建首字下沉。
Public Class DropCap
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim g = doc.NewPage().Graphics
        '' 获取一些文本并将其拆分为第一个字母(首字下沉)和其余字母:
        Dim text = Util.LoremIpsum(1)
        Dim head = text.Substring(0, 1)
        Dim tail = text.Substring(1)
        '' 使用 Times 字体:
        Dim fnt = GCTEXT.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 -
        '' 主要文本将围绕的矩形列表。
        '' 
        '' 注意:虽然我们可以简单地将首字下沉矩形放置在顶部/左侧
        '' 主要文本,如果首字下沉的顶部和主要文本的字形看起来更好
        '' 对齐。为此,我们需要计算字母顶部的偏移量
        '' 文本边界框,并相应地调整首字下沉的位置
        '' (稍微提高一点)。
        '' (对于此调整,我们需要 sCapHeight 字段,如果字体的
        '' os/2 表版本 2 及更高版本,因此我们必须对此进行测试,并在以下情况下跳过此步骤
        '' 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))
        ''
        '' 完毕:
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class