com.aspose.words

Class FontSettings

  • java.lang.Object
    • com.aspose.words.FontSettings
public class FontSettings 
extends java.lang.Object

Specifies font settings for a document.

Aspose.Words uses font settings to resolve the fonts in the document. Fonts are resolved mostly when building document layout or rendering to fixed page formats. But when loading some formats, Aspose.Words also may require to resolve the fonts. For example, when loading HTML documents Aspose.Words may resolve the fonts to perform font fallback. So it is recommended that you set the font settings in LoadOptions when loading the document. Or at least before building the layout or rendering the document to the fixed-page format.

By default all documents uses single static font settings instance. It could be accessed by DefaultInstance property.

Changing font settings is safe at any time from any thread. But it is recommended that you do not change the font settings while processing some documents which uses this settings. This can lead to the fact that the same font will be resolved differently in different parts of the document.

Example:

Shows how to add a font source to our existing font sources.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

builder.getFont().setName("Arial");
builder.writeln("Hello world!");
builder.getFont().setName("Amethysta");
builder.writeln("The quick brown fox jumps over the lazy dog.");
builder.getFont().setName("Junction Light");
builder.writeln("The quick brown fox jumps over the lazy dog.");

FontSourceBase[] originalFontSources = FontSettings.getDefaultInstance().getFontsSources();

Assert.assertEquals(1, originalFontSources.length);

Assert.assertTrue(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));

// The default font source is missing two of the fonts that we are using in our document.
// When we save this document, Aspose.Words will apply fallback fonts to all text formatted with inaccessible fonts.
Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Junction Light")));

// Create a font source from a folder that contains fonts.
FolderFontSource folderFontSource = new FolderFontSource(getFontsDir(), true);

// Apply a new array of font sources that contains the original font sources, as well as our custom fonts.
FontSourceBase[] updatedFontSources = {originalFontSources[0], folderFontSource};
FontSettings.getDefaultInstance().setFontsSources(updatedFontSources);

// Verify that Aspose.Words has access to all required fonts before we render the document to PDF.
updatedFontSources = FontSettings.getDefaultInstance().getFontsSources();

Assert.assertTrue(IterableUtils.matchesAny(updatedFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));
Assert.assertTrue(IterableUtils.matchesAny(updatedFontSources[1].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
Assert.assertTrue(IterableUtils.matchesAny(updatedFontSources[1].getAvailableFonts(), f -> f.getFullFontName().contains("Junction Light")));

doc.save(getArtifactsDir() + "FontSettings.AddFontSource.pdf");

// Restore the original font sources.
FontSettings.getDefaultInstance().setFontsSources(originalFontSources);

Example:

Shows how to set a font source directory.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

builder.getFont().setName("Arvo");
builder.writeln("Hello world!");
builder.getFont().setName("Amethysta");
builder.writeln("The quick brown fox jumps over the lazy dog.");

// Our font sources do not contain the font that we have used for text in this document.
// If we use these font settings while rendering this document,
// Aspose.Words will apply a fallback font to text which has a font that Aspose.Words cannot locate.
FontSourceBase[] originalFontSources = FontSettings.getDefaultInstance().getFontsSources();

Assert.assertEquals(1, originalFontSources.length);
Assert.assertTrue(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));

// The default font sources are missing the two fonts that we are using in this document.
Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arvo")));
Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));

// Use the "SetFontsFolder" method to set a directory which will act as a new font source.
// Pass "false" as the "recursive" argument to include fonts from all the font files that are in the directory
// that we are passing in the first argument, but not include any fonts in any of that directory's subfolders.
// Pass "true" as the "recursive" argument to include all font files in the directory that we are passing
// in the first argument, as well as all the fonts in its subdirectories.
FontSettings.getDefaultInstance().setFontsFolder(getFontsDir(), recursive);

FontSourceBase[] newFontSources = FontSettings.getDefaultInstance().getFontsSources();

Assert.assertEquals(1, newFontSources.length);
Assert.assertFalse(IterableUtils.matchesAny(newFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));
Assert.assertTrue(IterableUtils.matchesAny(newFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arvo")));

// The "Amethysta" font is in a subfolder of the font directory.
if (recursive) {
    Assert.assertEquals(25, newFontSources[0].getAvailableFonts().size());
    Assert.assertTrue(IterableUtils.matchesAny(newFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
} else {
    Assert.assertEquals(18, newFontSources[0].getAvailableFonts().size());
    Assert.assertFalse(IterableUtils.matchesAny(newFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
}

doc.save(getArtifactsDir() + "FontSettings.SetFontsFolder.pdf");

// Restore the original font sources.
FontSettings.getDefaultInstance().setFontsSources(originalFontSources);

Example:

Shows how to set multiple font source directories.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

builder.getFont().setName("Amethysta");
builder.writeln("The quick brown fox jumps over the lazy dog.");
builder.getFont().setName("Junction Light");
builder.writeln("The quick brown fox jumps over the lazy dog.");

// Our font sources do not contain the font that we have used for text in this document.
// If we use these font settings while rendering this document,
// Aspose.Words will apply a fallback font to text which has a font that Aspose.Words cannot locate.
FontSourceBase[] originalFontSources = FontSettings.getDefaultInstance().getFontsSources();

Assert.assertEquals(1, originalFontSources.length);
Assert.assertTrue(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));

// The default font sources are missing the two fonts that we are using in this document.
Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Junction Light")));

// Use the "SetFontsFolders" method to create a font source from each font directory that we pass as the first argument.
// Pass "false" as the "recursive" argument to include fonts from all the font files that are in the directories
// that we are passing in the first argument, but not include any fonts from any of the directories' subfolders.
// Pass "true" as the "recursive" argument to include all font files in the directories that we are passing
// in the first argument, as well as all the fonts in their subdirectories.
FontSettings.getDefaultInstance().setFontsFolders(new String[]{getFontsDir() + "/Amethysta", getFontsDir() + "/Junction"}, recursive);

FontSourceBase[] newFontSources = FontSettings.getDefaultInstance().getFontsSources();

Assert.assertEquals(2, newFontSources.length);
Assert.assertFalse(IterableUtils.matchesAny(newFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));
Assert.assertEquals(1, newFontSources[0].getAvailableFonts().size());
Assert.assertTrue(IterableUtils.matchesAny(newFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));

// The "Junction" folder itself contains no font files, but has subfolders that do.
if (recursive) {
    Assert.assertEquals(6, newFontSources[1].getAvailableFonts().size());
    Assert.assertTrue(IterableUtils.matchesAny(newFontSources[1].getAvailableFonts(), f -> f.getFullFontName().contains("Junction Light")));
} else {
    Assert.assertEquals(0, newFontSources[1].getAvailableFonts().size());
}

doc.save(getArtifactsDir() + "FontSettings.SetFontsFolders.pdf");

// Restore the original font sources.
FontSettings.getDefaultInstance().setFontsSources(originalFontSources);

Constructor Summary
 
Property Getters/Setters Summary
static FontSettingsgetDefaultInstance()
Static default font settings.
FontFallbackSettingsgetFallbackSettings()
Settings related to font fallback mechanism.
FontSubstitutionSettingsgetSubstitutionSettings()
Settings related to font substitution mechanism.
 
Method Summary
FontSourceBase[]getFontsSources()
Gets a copy of the array that contains the list of sources where Aspose.Words looks for TrueType fonts.
voidresetFontSources()
Resets the fonts sources to the system default.
voidsetFontsFolder(java.lang.String fontFolder, boolean recursive)
Sets the folder where Aspose.Words looks for TrueType fonts when rendering documents or embedding fonts. This is a shortcut to setFontsFolders(java.lang.String[],boolean) for setting only one font directory.
voidsetFontsFolders(java.lang.String[] fontsFolders, boolean recursive)
Sets the folders where Aspose.Words looks for TrueType fonts when rendering documents or embedding fonts.
voidsetFontsSources(FontSourceBase[] sources)
Sets the sources where Aspose.Words looks for TrueType fonts when rendering documents or embedding fonts.
 

    • Constructor Detail

      • FontSettings

        public FontSettings()
    • Property Getters/Setters Detail

      • getDefaultInstance

        public static FontSettings getDefaultInstance()
        
        Static default font settings. This instance is used by default in a document unless Document.FontSettings is specified.

        Example:

        Shows how to configure the default font settings instance.
        // Configure the default font settings instance to use the "Courier New" font
        // as a backup substitute when we attempt to use an unknown font.
        FontSettings.getDefaultInstance().getSubstitutionSettings().getDefaultFontSubstitution().setDefaultFontName("Courier New");
        
        Assert.assertTrue(FontSettings.getDefaultInstance().getSubstitutionSettings().getDefaultFontSubstitution().getEnabled());
        
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        
        builder.getFont().setName("Non-existent font");
        builder.write("Hello world!");
        
        // This document does not have a FontSettings configuration. When we render the document,
        // the default FontSettings instance will resolve the missing font.
        // Aspose.Words will use "Courier New" to render text that uses the unknown font.
        Assert.assertNull(doc.getFontSettings());
        
        doc.save(getArtifactsDir() + "FontSettings.DefaultFontInstance.pdf");

        Example:

        Shows how to use the IWarningCallback interface to monitor font substitution warnings.
        public void substitutionWarning() throws Exception {
            Document doc = new Document();
            DocumentBuilder builder = new DocumentBuilder(doc);
        
            builder.getFont().setName("Times New Roman");
            builder.writeln("Hello world!");
        
            FontSubstitutionWarningCollector callback = new FontSubstitutionWarningCollector();
            doc.setWarningCallback(callback);
        
            // Store the current collection of font sources, which will be the default font source for every document
            // for which we do not specify a different font source.
            FontSourceBase[] originalFontSources = FontSettings.getDefaultInstance().getFontsSources();
        
            // For testing purposes, we will set Aspose.Words to look for fonts only in a folder that does not exist.
            FontSettings.getDefaultInstance().setFontsFolder("", false);
        
            // When rendering the document, there will be no place to find the "Times New Roman" font.
            // This will cause a font substitution warning, which our callback will detect.
            doc.save(getArtifactsDir() + "FontSettings.SubstitutionWarning.pdf");
        
            FontSettings.getDefaultInstance().setFontsSources(originalFontSources);
        
            Assert.assertTrue(callback.FontSubstitutionWarnings.get(0).getWarningType() == WarningType.FONT_SUBSTITUTION);
            Assert.assertTrue(callback.FontSubstitutionWarnings.get(0).getDescription()
                    .equals("Font 'Times New Roman' has not been found. Using 'Fanwood' font instead. Reason: first available font."));
        }
        
        private static class FontSubstitutionWarningCollector implements IWarningCallback {
            /// <summary>
            /// Called every time a warning occurs during loading/saving.
            /// </summary>
            public void warning(WarningInfo info) {
                if (info.getWarningType() == WarningType.FONT_SUBSTITUTION)
                    FontSubstitutionWarnings.warning(info);
            }
        
            public WarningInfoCollection FontSubstitutionWarnings = new WarningInfoCollection();
        }
      • getFallbackSettings

        public FontFallbackSettings getFallbackSettings()
        
        Settings related to font fallback mechanism.

        Example:

        Shows how to distribute fallback fonts across Unicode character code ranges.
        Document doc = new Document();
        
        FontSettings fontSettings = new FontSettings();
        doc.setFontSettings(fontSettings);
        FontFallbackSettings fontFallbackSettings = fontSettings.getFallbackSettings();
        
        // Configure our font settings to source fonts only from the "MyFonts" folder.
        FolderFontSource folderFontSource = new FolderFontSource(getFontsDir(), false);
        fontSettings.setFontsSources(new FontSourceBase[]{folderFontSource});
        
        // Calling the "BuildAutomatic" method will generate a fallback scheme that
        // distributes accessible fonts across as many Unicode character codes as possible.
        // In our case, it only has access to the handful of fonts inside the "MyFonts" folder.
        fontFallbackSettings.buildAutomatic();
        fontFallbackSettings.save(getArtifactsDir() + "FontSettings.FallbackSettingsCustom.BuildAutomatic.xml");
        
        // We can also load a custom substitution scheme from a file like this.
        // This scheme applies the "AllegroOpen" font across the "0000-00ff" Unicode blocks, the "AllegroOpen" font across "0100-024f",
        // and the "M+ 2m" font in all other ranges that other fonts in the scheme do not cover.
        fontFallbackSettings.load(getMyDir() + "Custom font fallback settings.xml");
        
        // Create a document builder and set its font to one that does not exist in any of our sources.
        // Our font settings will invoke the fallback scheme for characters that we type using the unavailable font.
        DocumentBuilder builder = new DocumentBuilder(doc);
        builder.getFont().setName("Missing Font");
        
        // Use the builder to print every Unicode character from 0x0021 to 0x052F,
        // with descriptive lines dividing Unicode blocks we defined in our custom font fallback scheme.
        for (int i = 0x0021; i < 0x0530; i++) {
            switch (i) {
                case 0x0021:
                    builder.writeln("\n\n0x0021 - 0x00FF: \nBasic Latin/Latin-1 Supplement Unicode blocks in \"AllegroOpen\" font:");
                    break;
                case 0x0100:
                    builder.writeln("\n\n0x0100 - 0x024F: \nLatin Extended A/B blocks, mostly in \"AllegroOpen\" font:");
                    break;
                case 0x0250:
                    builder.writeln("\n\n0x0250 - 0x052F: \nIPA/Greek/Cyrillic blocks in \"M+ 2m\" font:");
                    break;
            }
        
            builder.write(MessageFormat.format("{0}", (char) i));
        }
        
        doc.save(getArtifactsDir() + "FontSettings.FallbackSettingsCustom.pdf");
      • getSubstitutionSettings

        public FontSubstitutionSettings getSubstitutionSettings()
        
        Settings related to font substitution mechanism.

        Example:

        Shows how to access a document's system font source and set font substitutes.
        Document doc = new Document();
        doc.setFontSettings(new FontSettings());
        
        // By default, a blank document always contains a system font source.
        Assert.assertEquals(1, doc.getFontSettings().getFontsSources().length);
        
        SystemFontSource systemFontSource = (SystemFontSource) doc.getFontSettings().getFontsSources()[0];
        Assert.assertEquals(FontSourceType.SYSTEM_FONTS, systemFontSource.getType());
        Assert.assertEquals(0, systemFontSource.getPriority());
        
        if (SystemUtils.IS_OS_WINDOWS) {
            final String FONTS_PATH = "C:\\WINDOWS\\Fonts";
            Assert.assertEquals(FONTS_PATH.toLowerCase(), SystemFontSource.getSystemFontFolders()[0].toLowerCase());
        }
        
        for (String systemFontFolder : SystemFontSource.getSystemFontFolders()) {
            System.out.println(systemFontFolder);
        }
        
        // Set a font that exists in the Windows Fonts directory as a substitute for one that does not.
        doc.getFontSettings().getSubstitutionSettings().getFontInfoSubstitution().setEnabled(true);
        doc.getFontSettings().getSubstitutionSettings().getTableSubstitution().addSubstitutes("Kreon-Regular", "Calibri");
        
        Assert.assertEquals(1, IterableUtils.size(doc.getFontSettings().getSubstitutionSettings().getTableSubstitution().getSubstitutes("Kreon-Regular")));
        Assert.assertTrue(IterableUtils.toString(doc.getFontSettings().getSubstitutionSettings().getTableSubstitution().getSubstitutes("Kreon-Regular")).contains("Calibri"));
        
        // Alternatively, we could add a folder font source in which the corresponding folder contains the font.
        FolderFontSource folderFontSource = new FolderFontSource(getFontsDir(), false);
        doc.getFontSettings().setFontsSources(new FontSourceBase[]{systemFontSource, folderFontSource});
        Assert.assertEquals(2, doc.getFontSettings().getFontsSources().length);
        
        // Resetting the font sources still leaves us with the system font source as well as our substitutes.
        doc.getFontSettings().resetFontSources();
        
        Assert.assertEquals(1, doc.getFontSettings().getFontsSources().length);
        Assert.assertEquals(FontSourceType.SYSTEM_FONTS, doc.getFontSettings().getFontsSources()[0].getType());
        Assert.assertEquals(1, IterableUtils.size(doc.getFontSettings().getSubstitutionSettings().getTableSubstitution().getSubstitutes("Kreon-Regular")));
    • Method Detail

      • getFontsSources

        public FontSourceBase[] getFontsSources()
        Gets a copy of the array that contains the list of sources where Aspose.Words looks for TrueType fonts.

        The returned value is a copy of the data that Aspose.Words uses. If you change the entries in the returned array, it will have no effect on document rendering. To specify new font sources use the setFontsSources(com.aspose.words.FontSourceBase[]) method.

        Returns:
        A copy of the current font sources.

        Example:

        Shows how to add a font source to our existing font sources.
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        
        builder.getFont().setName("Arial");
        builder.writeln("Hello world!");
        builder.getFont().setName("Amethysta");
        builder.writeln("The quick brown fox jumps over the lazy dog.");
        builder.getFont().setName("Junction Light");
        builder.writeln("The quick brown fox jumps over the lazy dog.");
        
        FontSourceBase[] originalFontSources = FontSettings.getDefaultInstance().getFontsSources();
        
        Assert.assertEquals(1, originalFontSources.length);
        
        Assert.assertTrue(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));
        
        // The default font source is missing two of the fonts that we are using in our document.
        // When we save this document, Aspose.Words will apply fallback fonts to all text formatted with inaccessible fonts.
        Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
        Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Junction Light")));
        
        // Create a font source from a folder that contains fonts.
        FolderFontSource folderFontSource = new FolderFontSource(getFontsDir(), true);
        
        // Apply a new array of font sources that contains the original font sources, as well as our custom fonts.
        FontSourceBase[] updatedFontSources = {originalFontSources[0], folderFontSource};
        FontSettings.getDefaultInstance().setFontsSources(updatedFontSources);
        
        // Verify that Aspose.Words has access to all required fonts before we render the document to PDF.
        updatedFontSources = FontSettings.getDefaultInstance().getFontsSources();
        
        Assert.assertTrue(IterableUtils.matchesAny(updatedFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));
        Assert.assertTrue(IterableUtils.matchesAny(updatedFontSources[1].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
        Assert.assertTrue(IterableUtils.matchesAny(updatedFontSources[1].getAvailableFonts(), f -> f.getFullFontName().contains("Junction Light")));
        
        doc.save(getArtifactsDir() + "FontSettings.AddFontSource.pdf");
        
        // Restore the original font sources.
        FontSettings.getDefaultInstance().setFontsSources(originalFontSources);
      • resetFontSources

        public void resetFontSources()
        Resets the fonts sources to the system default.

        Example:

        Shows how to access a document's system font source and set font substitutes.
        Document doc = new Document();
        doc.setFontSettings(new FontSettings());
        
        // By default, a blank document always contains a system font source.
        Assert.assertEquals(1, doc.getFontSettings().getFontsSources().length);
        
        SystemFontSource systemFontSource = (SystemFontSource) doc.getFontSettings().getFontsSources()[0];
        Assert.assertEquals(FontSourceType.SYSTEM_FONTS, systemFontSource.getType());
        Assert.assertEquals(0, systemFontSource.getPriority());
        
        if (SystemUtils.IS_OS_WINDOWS) {
            final String FONTS_PATH = "C:\\WINDOWS\\Fonts";
            Assert.assertEquals(FONTS_PATH.toLowerCase(), SystemFontSource.getSystemFontFolders()[0].toLowerCase());
        }
        
        for (String systemFontFolder : SystemFontSource.getSystemFontFolders()) {
            System.out.println(systemFontFolder);
        }
        
        // Set a font that exists in the Windows Fonts directory as a substitute for one that does not.
        doc.getFontSettings().getSubstitutionSettings().getFontInfoSubstitution().setEnabled(true);
        doc.getFontSettings().getSubstitutionSettings().getTableSubstitution().addSubstitutes("Kreon-Regular", "Calibri");
        
        Assert.assertEquals(1, IterableUtils.size(doc.getFontSettings().getSubstitutionSettings().getTableSubstitution().getSubstitutes("Kreon-Regular")));
        Assert.assertTrue(IterableUtils.toString(doc.getFontSettings().getSubstitutionSettings().getTableSubstitution().getSubstitutes("Kreon-Regular")).contains("Calibri"));
        
        // Alternatively, we could add a folder font source in which the corresponding folder contains the font.
        FolderFontSource folderFontSource = new FolderFontSource(getFontsDir(), false);
        doc.getFontSettings().setFontsSources(new FontSourceBase[]{systemFontSource, folderFontSource});
        Assert.assertEquals(2, doc.getFontSettings().getFontsSources().length);
        
        // Resetting the font sources still leaves us with the system font source as well as our substitutes.
        doc.getFontSettings().resetFontSources();
        
        Assert.assertEquals(1, doc.getFontSettings().getFontsSources().length);
        Assert.assertEquals(FontSourceType.SYSTEM_FONTS, doc.getFontSettings().getFontsSources()[0].getType());
        Assert.assertEquals(1, IterableUtils.size(doc.getFontSettings().getSubstitutionSettings().getTableSubstitution().getSubstitutes("Kreon-Regular")));
      • setFontsFolder

        public void setFontsFolder(java.lang.String fontFolder, boolean recursive)
        Sets the folder where Aspose.Words looks for TrueType fonts when rendering documents or embedding fonts. This is a shortcut to setFontsFolders(java.lang.String[],boolean) for setting only one font directory.
        Parameters:
        fontFolder - The folder that contains TrueType fonts.
        recursive - True to scan the specified folders for fonts recursively.

        Example:

        Shows how to set a font source directory.
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        
        builder.getFont().setName("Arvo");
        builder.writeln("Hello world!");
        builder.getFont().setName("Amethysta");
        builder.writeln("The quick brown fox jumps over the lazy dog.");
        
        // Our font sources do not contain the font that we have used for text in this document.
        // If we use these font settings while rendering this document,
        // Aspose.Words will apply a fallback font to text which has a font that Aspose.Words cannot locate.
        FontSourceBase[] originalFontSources = FontSettings.getDefaultInstance().getFontsSources();
        
        Assert.assertEquals(1, originalFontSources.length);
        Assert.assertTrue(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));
        
        // The default font sources are missing the two fonts that we are using in this document.
        Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arvo")));
        Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
        
        // Use the "SetFontsFolder" method to set a directory which will act as a new font source.
        // Pass "false" as the "recursive" argument to include fonts from all the font files that are in the directory
        // that we are passing in the first argument, but not include any fonts in any of that directory's subfolders.
        // Pass "true" as the "recursive" argument to include all font files in the directory that we are passing
        // in the first argument, as well as all the fonts in its subdirectories.
        FontSettings.getDefaultInstance().setFontsFolder(getFontsDir(), recursive);
        
        FontSourceBase[] newFontSources = FontSettings.getDefaultInstance().getFontsSources();
        
        Assert.assertEquals(1, newFontSources.length);
        Assert.assertFalse(IterableUtils.matchesAny(newFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));
        Assert.assertTrue(IterableUtils.matchesAny(newFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arvo")));
        
        // The "Amethysta" font is in a subfolder of the font directory.
        if (recursive) {
            Assert.assertEquals(25, newFontSources[0].getAvailableFonts().size());
            Assert.assertTrue(IterableUtils.matchesAny(newFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
        } else {
            Assert.assertEquals(18, newFontSources[0].getAvailableFonts().size());
            Assert.assertFalse(IterableUtils.matchesAny(newFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
        }
        
        doc.save(getArtifactsDir() + "FontSettings.SetFontsFolder.pdf");
        
        // Restore the original font sources.
        FontSettings.getDefaultInstance().setFontsSources(originalFontSources);
      • setFontsFolders

        public void setFontsFolders(java.lang.String[] fontsFolders, boolean recursive)
        Sets the folders where Aspose.Words looks for TrueType fonts when rendering documents or embedding fonts.

        By default, Aspose.Words looks for fonts installed to the system.

        Setting this property resets the cache of all previously loaded fonts.

        Parameters:
        fontsFolders - An array of folders that contain TrueType fonts.
        recursive - True to scan the specified folders for fonts recursively.

        Example:

        Shows how to set multiple font source directories.
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        
        builder.getFont().setName("Amethysta");
        builder.writeln("The quick brown fox jumps over the lazy dog.");
        builder.getFont().setName("Junction Light");
        builder.writeln("The quick brown fox jumps over the lazy dog.");
        
        // Our font sources do not contain the font that we have used for text in this document.
        // If we use these font settings while rendering this document,
        // Aspose.Words will apply a fallback font to text which has a font that Aspose.Words cannot locate.
        FontSourceBase[] originalFontSources = FontSettings.getDefaultInstance().getFontsSources();
        
        Assert.assertEquals(1, originalFontSources.length);
        Assert.assertTrue(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));
        
        // The default font sources are missing the two fonts that we are using in this document.
        Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
        Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Junction Light")));
        
        // Use the "SetFontsFolders" method to create a font source from each font directory that we pass as the first argument.
        // Pass "false" as the "recursive" argument to include fonts from all the font files that are in the directories
        // that we are passing in the first argument, but not include any fonts from any of the directories' subfolders.
        // Pass "true" as the "recursive" argument to include all font files in the directories that we are passing
        // in the first argument, as well as all the fonts in their subdirectories.
        FontSettings.getDefaultInstance().setFontsFolders(new String[]{getFontsDir() + "/Amethysta", getFontsDir() + "/Junction"}, recursive);
        
        FontSourceBase[] newFontSources = FontSettings.getDefaultInstance().getFontsSources();
        
        Assert.assertEquals(2, newFontSources.length);
        Assert.assertFalse(IterableUtils.matchesAny(newFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));
        Assert.assertEquals(1, newFontSources[0].getAvailableFonts().size());
        Assert.assertTrue(IterableUtils.matchesAny(newFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
        
        // The "Junction" folder itself contains no font files, but has subfolders that do.
        if (recursive) {
            Assert.assertEquals(6, newFontSources[1].getAvailableFonts().size());
            Assert.assertTrue(IterableUtils.matchesAny(newFontSources[1].getAvailableFonts(), f -> f.getFullFontName().contains("Junction Light")));
        } else {
            Assert.assertEquals(0, newFontSources[1].getAvailableFonts().size());
        }
        
        doc.save(getArtifactsDir() + "FontSettings.SetFontsFolders.pdf");
        
        // Restore the original font sources.
        FontSettings.getDefaultInstance().setFontsSources(originalFontSources);
      • setFontsSources

        public void setFontsSources(FontSourceBase[] sources)
        Sets the sources where Aspose.Words looks for TrueType fonts when rendering documents or embedding fonts.

        By default, Aspose.Words looks for fonts installed to the system.

        Setting this property resets the cache of all previously loaded fonts.

        Parameters:
        sources - An array of sources that contain TrueType fonts.

        Example:

        Shows how to add a font source to our existing font sources.
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        
        builder.getFont().setName("Arial");
        builder.writeln("Hello world!");
        builder.getFont().setName("Amethysta");
        builder.writeln("The quick brown fox jumps over the lazy dog.");
        builder.getFont().setName("Junction Light");
        builder.writeln("The quick brown fox jumps over the lazy dog.");
        
        FontSourceBase[] originalFontSources = FontSettings.getDefaultInstance().getFontsSources();
        
        Assert.assertEquals(1, originalFontSources.length);
        
        Assert.assertTrue(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));
        
        // The default font source is missing two of the fonts that we are using in our document.
        // When we save this document, Aspose.Words will apply fallback fonts to all text formatted with inaccessible fonts.
        Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
        Assert.assertFalse(IterableUtils.matchesAny(originalFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Junction Light")));
        
        // Create a font source from a folder that contains fonts.
        FolderFontSource folderFontSource = new FolderFontSource(getFontsDir(), true);
        
        // Apply a new array of font sources that contains the original font sources, as well as our custom fonts.
        FontSourceBase[] updatedFontSources = {originalFontSources[0], folderFontSource};
        FontSettings.getDefaultInstance().setFontsSources(updatedFontSources);
        
        // Verify that Aspose.Words has access to all required fonts before we render the document to PDF.
        updatedFontSources = FontSettings.getDefaultInstance().getFontsSources();
        
        Assert.assertTrue(IterableUtils.matchesAny(updatedFontSources[0].getAvailableFonts(), f -> f.getFullFontName().contains("Arial")));
        Assert.assertTrue(IterableUtils.matchesAny(updatedFontSources[1].getAvailableFonts(), f -> f.getFullFontName().contains("Amethysta")));
        Assert.assertTrue(IterableUtils.matchesAny(updatedFontSources[1].getAvailableFonts(), f -> f.getFullFontName().contains("Junction Light")));
        
        doc.save(getArtifactsDir() + "FontSettings.AddFontSource.pdf");
        
        // Restore the original font sources.
        FontSettings.getDefaultInstance().setFontsSources(originalFontSources);