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