FontEmbeddingStatus.vb
''
'' This code is part of Document Solutions for PDF .NET demos.
'' Copyright (c) MESCIUS inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports System.Linq
Imports System.Collections.Immutable
Imports System.Collections.Generic
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.TextMap
Imports GrapeCity.Documents.Pdf.Text
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Pdf.Spec

Public Class FontEmbeddingStatus
    Public Function CreatePDF(ByVal stream As Stream) As Integer
        Const pdfName As String = "C1Olap-QuickStart.pdf"
        Dim fs = File.OpenRead(Path.Combine("Resources", "PDFs", pdfName))
        Dim doc = New GcPdfDocument()
        doc.Load(fs)

        Dim page = doc.Pages.Insert(0)
        Dim g = page.Graphics
        Dim tl = g.CreateTextLayout()
        tl.AppendLine($"Fonts used in {pdfName}, and their embedding status:" & vbLf)
        ' List fonts and their embedding states:
        Dim ff = doc.GetFonts().ToImmutableArray().Select(Function(f_) GetFontInfo(f_)).DistinctBy(Function(fi_) fi_.Item2).OrderBy(Function(fi_) fi_.Item2)
        For Each fi In ff
            tl.AppendLine($"- ""{fi.Item2}"": {EmbedModeToString(fi.Item1)}")
        Next

        tl.MarginAll = g.Resolution
        g.DrawTextLayout(tl, PointF.Empty)

        doc.Save(stream)
        Return doc.Pages.Count
    End Function

    Private Function GetFontInfo(font As GrapeCity.Documents.Pdf.Text.Font) As (FontEmbedMode, String)
        If font.IsEmbedded Then
            Dim p = font.BaseFont.IndexOf("+"c)
            If p > 0 Then
                Return (FontEmbedMode.EmbedSubset, font.BaseFont.Substring(p + 1))
            Else
                Return (FontEmbedMode.EmbedFullFont, font.BaseFont)
            End If
        End If
        Return (FontEmbedMode.NotEmbed, font.BaseFont)
    End Function

    Private Function EmbedModeToString(fem As FontEmbedMode) As String
        If fem = FontEmbedMode.EmbedFullFont Then
            Return "Embedded font"
        ElseIf fem = FontEmbedMode.EmbedSubset Then
            Return "Embedded subset"
        Else
            Return "Not embedded"
        End If
    End Function
End Class