Glyphs and Metrics of TrueType Fonts | Java
Get Font Metrics
Font metrics refer to informaiton such as Ascender
, Descender
, TypoAscender
, TypoDescender
and UnitsPerEm
. Aspose.Font for Java API can be used to open TTF font files and read the Font Metrics information from these using the following sample code.
1// For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-Java
2String fileName = Utils.getDataDir() + "Montserrat-Regular.ttf"; //Font file name with full path
3
4 FontDefinition fd = new FontDefinition(FontType.TTF, new FontFileDefinition("ttf", new FileSystemStreamSource(fileName)));
5 TtfFont font = (TtfFont) Font.open(fd);
6
7 String name = font.getFontName();
8 System.out.println("Font name: " + name);
9 System.out.println("Glyph count: " + font.getNumGlyphs());
10 String metrics = MessageFormat.format(
11 "Font metrics: ascender - {0}, descender - {1}, typo ascender = {2}, typo descender = {3}, UnitsPerEm = {4}",
12 font.getMetrics().getAscender(), font.getMetrics().getDescender(),
13 font.getMetrics().getTypoAscender(), font.getMetrics().getTypoDescender(), font.getMetrics().getUnitsPerEM());
14
15 System.out.println(metrics);
16
17 //Get cmap unicode encoding table from font as object TtfCMapFormatBaseTable to access information about font glyph for symbol 'A'.
18 //Also check that font has object TtfGlyfTable (table 'glyf') to access glyph.
19 TtfCMapFormatBaseTable cmapTable = null;
20 if (font.getTtfTables().getCMapTable() != null)
21 {
22 cmapTable = font.getTtfTables().getCMapTable().findUnicodeTable();
23 }
24 if (cmapTable != null && font.getTtfTables().getGlyfTable() != null)
25 {
26 System.out.println("Font cmap unicode table: PlatformID = " + cmapTable.getPlatformId() +
27 ", PlatformSpecificID = " + cmapTable.getPlatformSpecificId());
28
29 //Code for 'A' symbol
30 char unicode = (char)65;
31
32 //Glyph index for 'A'
33 long glIndex = cmapTable.getGlyphIndex(unicode);
34
35 if (glIndex != 0)
36 {
37 //Glyph for 'A'
38 Glyph glyph = font.getGlyphById(glIndex);
39 if (glyph != null)
40 {
41 //Print glyph metrics
42 System.out.println("Glyph metrics for 'A' symbol:");
43 String bbox = MessageFormat.format(
44 "Glyph BBox: Xmin = {0}, Xmax = {1}" + ", Ymin = {2}, Ymax = {3}",
45 glyph.getGlyphBBox().getXMin(), glyph.getGlyphBBox().getXMax(),
46 glyph.getGlyphBBox().getYMin(), glyph.getGlyphBBox().getYMax());
47 System.out.println(bbox);
48 System.out.println("Width:" + font.getMetrics().getGlyphWidth(new GlyphUInt32Id(glIndex)));
49 }
50 }
51 }
Detect Latin Symbols
Aspose.Font for .API lets you detect Latin Symbols from TrueType font files. This can be achieved using the following sample code.
- Load the Font file using FontFileDefinition
- Decode the GlyphId using the DecodeToGid() method
1// For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-Java 2String fileName = Utils.getDataDir() + "Montserrat-Regular.ttf"; //Font file name with full path 3 4 FontDefinition fd = new FontDefinition(FontType.TTF, new FontFileDefinition("ttf", new FileSystemStreamSource(fileName))); 5 TtfFont ttfFont = (TtfFont) Font.open(fd); 6 7 boolean latinText = true; 8 9 10 for (int code = 65; code < 123; code++) 11 { 12 GlyphId gid = ttfFont.getEncoding().decodeToGid(code); 13 if (gid == null || gid == GlyphUInt32Id.getNotDef()) 14 { 15 latinText = false; 16 } 17 } 18 19 if (latinText) 20 { 21 System.out.println(MessageFormat.format("Font {0} supports latin symbols.", ttfFont.getFontName())); 22 } 23 else 24 { 25 System.out.println(MessageFormat.format("Latin symbols are not supported by font {0}.", ttfFont.getFontName())); 26 }
Extract License Restrictions
Use Aspose.Font for Java API to extract licensing restrictions from font files. Fonts can have licensing information embedded into these in one of the following modes.
Editable Embedding
- Font may be embedded, and may be temporarily loaded on other systems. In addition, editing is permitted, including ability to format new text using the embedded font, and changes may be saved.Installable Embedding
- Font may be embedded, and may be permanently installed for use on a remote systems, or for use by other users.Preview and Print Embedding
- Font may be embedded, and may be temporarily loaded on other systems for purposes of viewing or printing the document.Restricted Embedding
- Font must not be modified, embedded or exchanged in any manner without first obtaining explicit permission of the legal owner.
The following code sample shows how to use an object Aspose.Font.Ttf.LicenseFlags to get information about font license restrictions(flag fsType from table OS/2) in convenient form.
1// For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-Java
2String fileName = Utils.getDataDir() + "Montserrat-Regular.ttf"; //Font file name with full path
3
4 FontDefinition fd = new FontDefinition(FontType.TTF, new FontFileDefinition("ttf", new FileSystemStreamSource(fileName)));
5 TtfFont font = (TtfFont) Font.open(fd);
6
7 LicenseFlags licenseFlags = null;
8 if (font.getTtfTables().getOs2Table() != null)
9 {
10 licenseFlags = font.getTtfTables().getOs2Table().getLicenseFlags();
11 }
12
13 if (licenseFlags == null || licenseFlags.isFSTypeAbsent())
14 {
15 System.out.println(MessageFormat.format("Font {0} has no embedded license restrictions", font.getFontName()));
16 }
17 else
18 {
19 if (licenseFlags.isEditableEmbedding())
20 {
21 System.out.println(MessageFormat.format("Font {0} may be embedded, and may be temporarily loaded on other systems.", font.getFontName())
22 + " In addition, editing is permitted, including ability to format new text"
23 + " using the embedded font, and changes may be saved.");
24 }
25 else if (licenseFlags.isInstallableEmbedding())
26 {
27 System.out.println(MessageFormat.format("Font {0} may be embedded, and may be permanently installed", font.getFontName())
28 + " for use on a remote systems, or for use by other users.");
29 }
30 else if (licenseFlags.isPreviewAndPrintEmbedding())
31 {
32 System.out.println(MessageFormat.format("Font {0} may be embedded, and may be temporarily loaded", font.getFontName())
33 + " on other systems for purposes of viewing or printing the document.");
34 }
35 else if (licenseFlags.isRestrictedLicenseEmbedding())
36 {
37 System.out.println(MessageFormat.format("Font {0} must not be modified, embedded or exchanged in any manner", font.getFontName())
38 + " without first obtaining explicit permission of the legal owner.");
39 }
40 }