FontCollection.vb
- ''
- '' This code is part of Document Solutions for PDF demos.
- '' Copyright (c) MESCIUS inc. All rights reserved.
- ''
- Imports System.IO
- Imports System.Drawing
- Imports GrapeCity.Documents.Pdf
- Imports GrapeCity.Documents.Text
-
- '' This sample shows how to create, initialize and use the FontCollection class,
- '' which is the recommended way to manage fonts and use them when rendering texts
- '' in Document Solutions for PDF.
- ''
- '' The main points to keep in mind, and the recommended steps to follow,
- '' when using FontCollection with DsPdf:
- ''
- '' 1. Create an instance of the FontCollection class.
- '' FontCollection is not a static class, you need an instance of it to use.
- '' Also, it is a regular .NET collection of Font objects, so all usual
- '' collection manipulation methods (Add, Insert, Remove etc) can be used on it.
- ''
- '' 2. Populate the font collection with fonts using any of the following methods:
- '' - RegisterDirectory(): registers all fonts found in a specified directory;
- '' - RegisterFont(): registers font(s) found in a specified file;
- '' - Add(Font): adds a font instance that you created.
- '' Note that registering directories or fonts with a font collection is a fast
- '' and light-weight operation. The font collection does not actually load all font data
- '' when directories or individual fonts are registered with it. Instead, it loads only
- '' the minimal info so that it can find and provide fonts quickly and efficiently
- '' when needed.
- ''
- '' 3. Assign your instance of the font collection to TextLayout.FontCollection (and to
- '' GcGraphics.FontCollection if using GcGraphics.MeasureString/DrawString) so that
- '' the correct fonts can be found.
- ''
- '' 4. In your text rendering code, select fonts by specifying font names (TextFormat.FontName,
- '' the names must match exactly but the case is not important), and font bold and italic
- '' flags (TextFormat.FontBold/FontItalic). If a suitable bold/italic version of the requested
- '' font is found in the collection, it will be used; otherwise font emulation will be applied.
- ''
- '' 5. FontCollection methods and properties are thread-safe, so once your font collection
- '' has been populated, you can cache and share it between sessions and/or modules
- '' of your application. You do need to exercise caution when modifying and accessing
- '' the font collection simultaneously from different threads though, as it may change
- '' between a check of some condition on the collection, and action on that check.
- '' For such cases the FontCollection.SyncRoot property is provided, and should be used.
- ''
- '' The code in this sample illustrates most of the points above.
- Public Class FontCollectionTest
- Function CreatePDF(ByVal stream As Stream) As Integer
- '' Create a FontCollection instance:
- Dim fc = New FontCollection()
- '' Populate it with fonts from the specified directory:
- fc.RegisterDirectory(Path.Combine("Resources", "Fonts"))
-
- '' Generate a sample document using the font collection to provide fonts:
- Dim doc = New GcPdfDocument()
- Dim page = doc.Pages.Add()
- Dim g = page.Graphics
-
- '' For TextLayout/TextFormat to be able to use a font collection, it must be
- '' associated with it like so:
- Dim tl = New TextLayout(72) With {.FontCollection = fc}
-
- '' Render some strings using the different fonts from our collection:
- Dim tf = New TextFormat() With {.FontName = "times new roman", .FontSize = 16}
- tl.Append("Using FontCollection to manage fonts and render text" + vbCrLf + vbCrLf, tf)
- tf.FontSize = 12
- tl.Append("Text rendered using Times New Roman regular font." + vbCrLf, tf)
- '' Setting a font style (bold or italic) will tell the font collection
- '' to search for a suitable font (if it is not found, emulation will be used):
- tf.FontItalic = True
- tl.Append("Text rendered using Times New Roman italic font." + vbCrLf, tf)
- '' Text format is applied to a text run when the text is appended,
- '' so we can re-use the same format, modifying its properties
- '' to render differently formatted texts:
- tf.FontBold = True
- tl.Append("Text rendered using Times New Roman bold italic font." + vbCrLf, tf)
- tf.FontItalic = False
- tl.Append("Text rendered using Times New Roman bold font." + vbCrLf, tf)
- tf.FontName = "segoe ui"
- tl.Append("Text rendered using Segoe UI bold font." + vbCrLf, tf)
- tf.FontBold = False
- tl.Append("Text rendered using Segoe UI regular font." + vbCrLf, tf)
-
- '' Apply page settings to the page layout and render the page:
- tl.MaxWidth = page.Size.Width
- tl.MaxHeight = page.Size.Height
- tl.MarginAll = 72
- tl.PerformLayout(True)
- g.DrawTextLayout(tl, PointF.Empty)
-
- '' If using GcGraphics.DrawString/MeasureString, this will allow the TextLayout
- '' created internally by GcGraphics to find the specified fonts in the font collection:
- g.FontCollection = fc
-
- '' Use GcGraphics.DrawString to show that the font collection is also used
- '' by the graphics once the FontCollection has been set on it:
- g.DrawString("Text rendered using Segoe UI bold, drawn by GcGraphics.DrawString() method.",
- New TextFormat() With {.FontName = "segoe ui", .FontBold = True, .FontSize = 10},
- New PointF(72, tl.ContentRectangle.Bottom + 12))
- ''
- '' Done:
- doc.Save(stream)
- Return doc.Pages.Count
- End Function
- End Class
-