''
'' This code is part of Document Solutions for PDF demos.
'' Copyright (c) MESCIUS inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports System.Collections.Generic
Imports System.Linq
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
'' This sample lists all fonts found in a loaded PDF,
'' prints some info for each font, And indicates whether a Font object
'' can be created from the font in the PDF.
Public Class ListFonts
Function CreatePDF(ByVal stream As Stream) As Integer
Dim sourcePDF = "CompleteJavaScriptBook.pdf"
Dim doc = New GcPdfDocument()
Dim page = doc.NewPage()
Dim rc = Util.AddNote(
"This sample loads an arbitrary PDF into a temporary GcPdfDocument, " +
"and lists all fonts found in that document, with some of their properties. " +
"It also tries to create a Font object from each of those PDF fonts, " +
"and reports whether this operation succeeded.",
page)
'' Text layout to render the text:
Dim tab = 24
Dim tl = page.Graphics.CreateTextLayout()
tl.DefaultFormat.Font = StandardFonts.Times
tl.DefaultFormat.FontSize = 12
tl.MaxWidth = doc.PageSize.Width
tl.MaxHeight = doc.PageSize.Height
tl.MarginAll = rc.Left
tl.MarginTop = rc.Bottom + 36
tl.TabStops = New List(Of TabStop)() From {New TabStop(tab)}
tl.FirstLineIndent = -tab
tl.MarginRight = 144
'' Text split options for widow/orphan control:
Dim tso = New TextSplitOptions(tl) With
{
.KeepParagraphLinesTogether = True,
.MinLinesInFirstParagraph = 2,
.MinLinesInLastParagraph = 2,
.RestMarginTop = rc.Left
}
'' Open an arbitrary PDF, load it into a temp document and get all fonts:
Using fs = New FileStream(Path.Combine("Resources", "PDFs", sourcePDF), FileMode.Open, FileAccess.Read)
Dim doc1 = New GcPdfDocument()
doc1.Load(fs)
Dim fonts = doc1.GetFonts()
tl.AppendLine($"Total of {fonts.Count} fonts found in {sourcePDF}:")
tl.AppendLine()
Dim i As Integer = 0
For Each fnt In fonts
Dim nativeFont = fnt.CreateNativeFont()
tl.Append($"{i}:{vbTab}BaseFont: {fnt.BaseFont} IsEmbedded: {fnt.IsEmbedded}.")
tl.AppendParagraphBreak()
If nativeFont IsNot Nothing Then
tl.AppendLine($"{vbTab}CreateNativeFont succeeded, family: {nativeFont.FontFamilyName} bold: {nativeFont.FontBold} italic: {nativeFont.FontItalic}.")
Else
tl.AppendLine($"{vbTab}CreateNativeFont failed")
End If
tl.AppendLine()
i += 1
Next
tl.PerformLayout(True)
While (True)
'' 'rest' will accept the text that did not fit:
Dim rest As TextLayout = Nothing
Dim splitResult = tl.Split(tso, rest)
doc.Pages.Last.Graphics.DrawTextLayout(tl, PointF.Empty)
If splitResult <> SplitResult.Split Then
Exit While
End If
tl = rest
doc.NewPage()
End While
End Using
'' Done:
doc.Save(stream)
Return doc.Pages.Count
End Function
End Class