VintaSoft Imaging .NET SDK v8.7
Vintasoft.Imaging.Pdf Namespace / PdfFontManager Class / CreateFontSubset Method
Source PDF font.
A set of text symbols from source PDF font. Text symbols are ordered as they should be stored in new PDF font.
Size, in bytes, of code symbol of new PDF font.
Determines that information about Unicode codes of symbols must be added to new PDF font.
An array of text symbols of newly created PDF font. Each symbol in array newSymbols corresponds to the symbol, with the same index, in array symbols.
Example



In This Topic
    CreateFontSubset Method
    In This Topic
    Creates new PDF font, which contains the specified set of text symbols.
    Syntax
    'Declaration
     
    Public Function CreateFontSubset( _
       ByVal sourceFont As PdfFont, _
       ByVal symbols() As PdfTextSymbol, _
       ByVal symbolCodeSize As Integer, _
       ByVal addEncoding As Boolean, _
       ByRef newSymbols As PdfTextSymbol() _
    ) As PdfFont
    public PdfFont CreateFontSubset( 
       PdfFont sourceFont,
       PdfTextSymbol[] symbols,
       int symbolCodeSize,
       bool addEncoding,
       out PdfTextSymbol[] newSymbols
    )
    public: PdfFont* CreateFontSubset( 
       PdfFont* sourceFont,
       PdfTextSymbol*[]* symbols,
       int symbolCodeSize,
       bool addEncoding,
       [PARAMFLAG::Out] PdfTextSymbol*[] newSymbols
    ) 
    public:
    PdfFont^ CreateFontSubset( 
       PdfFont^ sourceFont,
       array<PdfTextSymbol^>^ symbols,
       int symbolCodeSize,
       bool addEncoding,
       [Out] array<PdfTextSymbol^> newSymbols
    ) 

    Parameters

    sourceFont
    Source PDF font.
    symbols
    A set of text symbols from source PDF font. Text symbols are ordered as they should be stored in new PDF font.
    symbolCodeSize
    Size, in bytes, of code symbol of new PDF font.
    addEncoding
    Determines that information about Unicode codes of symbols must be added to new PDF font.
    newSymbols
    An array of text symbols of newly created PDF font. Each symbol in array newSymbols corresponds to the symbol, with the same index, in array symbols.

    Return Value

    New PDF font.
    Exceptions
    ExceptionDescription
    Thrown if sourceFont or symbols is null.
    Thrown if array of symbols is empty -or- original font is not fully defined.
    Thrown if array of symbols contains symbols from another font.
    Thrown if symbolCodeSize is 0 or exceeds 2 -or- number of symbols exceeds maximum number that can be encoded by symbolCodeSize.
    Thrown if subsetting of sourceFont is not supported.
    Example
    This example shows how to create a PDF font, which is based on a subset of font symbols.
    ''' <summary>
    ''' Creates CID font, which is based on the specified TrueType font,
    ''' creates a PDF font, which is a minimal subset necessary for drawing specified text, and
    ''' creates a PDF document with the specified text and font.
    ''' </summary>
    ''' <param name="pdfFilename">The name of file, where PDF document must be saved.</param>
    ''' <param name="trueTypeFontFilename">The filename of TrueType font.</param>
    ''' <param name="text">The text to draw on PDF page.</param>
    Public Shared Sub CreatePdfFontSubset(pdfFilename As String, trueTypeFontFilename As String, text As String)
    	' list of unique necessary characters to render specified text
    	Dim usedChars As New System.Collections.Generic.List(Of Char)()
    	For i As Integer = 0 To text.Length - 1
    		If Not usedChars.Contains(text(i)) Then
    			usedChars.Add(text(i))
    		End If
    	Next
                
    	' create new PDF document
    	Using document As New Vintasoft.Imaging.Pdf.PdfDocument()
    		' create initial PDF font
    		Dim sourceFont As Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont = document.FontManager.CreateCIDFontFromTrueTypeFont(trueTypeFontFilename)
    		' get symbols of the font
    		Dim fontSymbols As Vintasoft.Imaging.Pdf.Content.TextExtraction.PdfTextSymbol() = Vintasoft.Imaging.Pdf.Content.TextExtraction.PdfTextSymbol.GetFontSymbols(sourceFont)
    		' list of PDF font symbols, which are necessary for rendering the specified text
    		Dim necessarySymbols As New System.Collections.Generic.List(Of Vintasoft.Imaging.Pdf.Content.TextExtraction.PdfTextSymbol)()
    		For i As Integer = 0 To fontSymbols.Length - 1
    			' get next PDF font symbol
    			Dim fontSymbol As Vintasoft.Imaging.Pdf.Content.TextExtraction.PdfTextSymbol = fontSymbols(i)
    			' determine if symbol is used in text
    			For j As Integer = 0 To usedChars.Count - 1
    				If fontSymbol.Symbol = usedChars(j) Then
    					necessarySymbols.Add(fontSymbol)
    					Exit For
    				End If
    			Next
                
    			If necessarySymbols.Count = usedChars.Count Then
    				' optimization: we have all necessary symbols and can go on
    				Exit For
    			End If
    		Next
                
    		' determine symbol code size in bytes
    		Dim symbolCodeSizeInBytes As Integer = If(sourceFont.FontType = Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFontType.Type0, 2, 1)
    		Dim newSymbols As Vintasoft.Imaging.Pdf.Content.TextExtraction.PdfTextSymbol() = Nothing
    		' create font subset
    		Dim pdfFontSubset As Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont = document.FontManager.CreateFontSubset(sourceFont, necessarySymbols.ToArray(), symbolCodeSizeInBytes, True, newSymbols)
                
    		' add PDF page
    		Dim page As Vintasoft.Imaging.Pdf.Tree.PdfPage = document.Pages.Add(Vintasoft.Imaging.PaperSizeKind.A4)
    		' open PDF graphics
    		Using graphics As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = page.GetGraphics()
    			Dim brush As New Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Black)
    			Dim location As New System.Drawing.PointF(30, page.Size.Height - 150)
    			' draw text using created font
    			graphics.DrawString(text, pdfFontSubset, 18F, brush, location)
    		End Using
    		' pack PDF document to the specified location
    		document.Pack(pdfFilename)
    	End Using
    End Sub
    /// <summary>
    /// Creates CID font, which is based on the specified TrueType font,
    /// creates a PDF font, which is a minimal subset necessary for drawing specified text, and
    /// creates a PDF document with the specified text and font.
    /// </summary>
    /// <param name="pdfFilename">The name of file, where PDF document must be saved.</param>
    /// <param name="trueTypeFontFilename">The filename of TrueType font.</param>
    /// <param name="text">The text to draw on PDF page.</param>
    public static void CreatePdfFontSubset(string pdfFilename, string trueTypeFontFilename, string text)
    {
        // list of unique necessary characters to render specified text
        System.Collections.Generic.List<char> usedChars = 
            new System.Collections.Generic.List<char>();
        for (int i = 0; i < text.Length; i++)
        {
            if (!usedChars.Contains(text[i]))
                usedChars.Add(text[i]);
        }
                
        // create new PDF document
        using (Vintasoft.Imaging.Pdf.PdfDocument document = new Vintasoft.Imaging.Pdf.PdfDocument())
        {
            // create initial PDF font
            Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont sourceFont = 
                document.FontManager.CreateCIDFontFromTrueTypeFont(trueTypeFontFilename);
            // get symbols of the font
            Vintasoft.Imaging.Pdf.Content.TextExtraction.PdfTextSymbol[] fontSymbols = 
                Vintasoft.Imaging.Pdf.Content.TextExtraction.PdfTextSymbol.GetFontSymbols(sourceFont);
            // list of PDF font symbols, which are necessary for rendering the specified text
            System.Collections.Generic.List<Vintasoft.Imaging.Pdf.Content.TextExtraction.PdfTextSymbol> necessarySymbols = 
                new System.Collections.Generic.List<Vintasoft.Imaging.Pdf.Content.TextExtraction.PdfTextSymbol>();
            for (int i = 0; i < fontSymbols.Length; i++)
            {
                // get next PDF font symbol
                Vintasoft.Imaging.Pdf.Content.TextExtraction.PdfTextSymbol fontSymbol = fontSymbols[i];
                // determine if symbol is used in text
                for (int j = 0; j < usedChars.Count; j++)
                {
                    if (fontSymbol.Symbol == usedChars[j])
                    {
                        necessarySymbols.Add(fontSymbol);
                        break;
                    }
                }
                
                if (necessarySymbols.Count == usedChars.Count)
                {
                    // optimization: we have all necessary symbols and can go on
                    break;
                }
            }
                
            // determine symbol code size in bytes
            int symbolCodeSizeInBytes = sourceFont.FontType == Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFontType.Type0 ? 2 : 1;
            Vintasoft.Imaging.Pdf.Content.TextExtraction.PdfTextSymbol[] newSymbols = null;
            // create font subset
            Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont pdfFontSubset = document.FontManager.CreateFontSubset(
                sourceFont,
                necessarySymbols.ToArray(),
                symbolCodeSizeInBytes,
                true,
                out newSymbols);
                
            // add PDF page
            Vintasoft.Imaging.Pdf.Tree.PdfPage page = document.Pages.Add(
                Vintasoft.Imaging.PaperSizeKind.A4);
            // open PDF graphics
            using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics graphics = page.GetGraphics())
            {
                Vintasoft.Imaging.Pdf.Drawing.PdfBrush brush = 
                    new Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Black);
                System.Drawing.PointF location = new System.Drawing.PointF(30, page.Size.Height - 150);
                // draw text using created font
                graphics.DrawString(text, pdfFontSubset, 18f, brush, location);
            }
            // pack PDF document to the specified location
            document.Pack(pdfFilename);
        }
    }
    Requirements

    Target Platforms: Windows 10, Windows 8, Windows 7, Windows Vista, Windows XP, Windows Server 2012, Windows Server 2008, Windows Server 2003

    See Also