Class OpenFont

java.lang.Object
org.docx4j.fonts.fop.fonts.truetype.OpenFont
Direct Known Subclasses:
OTFFile, TTFFile

public abstract class OpenFont
extends java.lang.Object
  • Nested Class Summary

    Nested Classes
    Modifier and Type Class Description
    static class  OpenFont.PostScriptVersion
    Version of the PostScript table (post) contained in this font.
  • Field Summary

    Fields
    Modifier and Type Field Description
    protected OTFAdvancedTypographicTableReader advancedTableReader  
    protected boolean cid  
    protected java.util.Map<OFTableName,​OFDirTabEntry> dirTabs
    Table directory
    protected java.lang.String embedFontName  
    protected java.util.Set<java.lang.String> familyNames  
    protected FontFileReader fontFile
    The FontFileReader used to read this TrueType font.
    protected java.lang.String fullName  
    protected long lastLoca
    Offset to last loca
    protected int locaFormat  
    protected org.slf4j.Logger log
    logging instance
    protected OFMtxEntry[] mtxTab
    Contains glyph data
    protected int nhmtx  
    protected java.lang.String notice  
    protected int numberOfGlyphs  
    protected java.lang.String postScriptName  
    protected java.lang.String subFamilyName  
    static boolean TRACE_ENABLED
    Set to true to get even more debug output than with level DEBUG
    protected java.util.List<org.docx4j.fonts.fop.fonts.truetype.OpenFont.UnicodeMapping> unicodeMappings  
    protected boolean useAdvanced  
    protected boolean useKerning  
  • Constructor Summary

    Constructors
    Constructor Description
    OpenFont()  
    OpenFont​(boolean useKerning, boolean useAdvanced)
    Constructor
  • Method Summary

    Modifier and Type Method Description
    protected boolean checkTTC​(java.lang.String tag, java.lang.String name)
    Check if this is a TrueType collection and that the given name exists in the collection.
    int convertTTFUnit2PDFUnit​(int n)
    Convert from truetype unit to pdf unit based on the unitsPerEm field in the "head" table
    protected void createCMaps()  
    protected void determineAscDesc()
    Determines the right source for the ascender and descender values.
    java.util.Map<java.lang.Integer,​java.util.Map<java.lang.Integer,​java.lang.Integer>> getAnsiKerning()
    Returns the ANSI kerning table.
    int[] getBBox​(int glyphIndex)
    Returns an array (xMin, yMin, xMax, yMax) for a glyph.
    int[] getBBoxRaw()
    Returns the original bounding box values from the HEAD table
    java.awt.Rectangle[] getBoundingBoxes()  
    int getCapHeight()
    Returns the CapHeight attribute of the font.
    java.lang.String getCharSetName()
    Returns the name of the character set used.
    int getCharWidth​(int idx)
    Returns the width of a given character.
    int getCharWidthRaw​(int idx)
    Returns the width of a given character in raw units
    java.util.List<CMapSegment> getCMaps()
    Returns this font's character to glyph mapping.
    java.lang.String getCopyrightNotice()  
    OFDirTabEntry getDirectoryEntry​(OFTableName name)
    Obtain directory table entry.
    java.lang.String getEmbedFontName()  
    java.util.Set<java.lang.String> getFamilyNames()
    Returns the font family names of the font.
    short getFirstChar()
    Returns the index of the first character.
    int getFlags()
    Returns the Flags attribute of the font.
    int[] getFontBBox()  
    java.lang.String getFullName()
    Returns the full name of the font.
    GlyphDefinitionTable getGDEF()
    Returns the GDEF table or null if none present.
    GlyphPositioningTable getGPOS()
    Returns the GPOS table or null if none present.
    GlyphSubstitutionTable getGSUB()
    Returns the GSUB table or null if none present.
    java.lang.String getItalicAngle()
    Returns the ItalicAngle attribute of the font.
    java.util.Map<java.lang.Integer,​java.util.Map<java.lang.Integer,​java.lang.Integer>> getKerning()
    Returns the kerning table.
    short getLastChar()
    Returns the index of the last character, but this is for WinAnsiEncoding only, so the last char is < 256.
    int getLowerCaseAscent()
    Returns the LowerCaseAscent attribute of the font.
    int getLowerCaseDescent()
    Returns the LowerCaseDescent attribute of the font.
    java.util.List<OFMtxEntry> getMtx()  
    protected void getNumGlyphs()
    Read the number of glyphs from the "maxp" table
    protected int getPadSize​(int currentPosition)
    Returns the number of bytes necessary to pad the currentPosition so that a table begins on a 4-byte boundary.
    Panose getPanose()  
    java.lang.String getPostScriptName()
    Returns the PostScript name of the font.
    java.lang.String getStemV()
    Returns the StemV attribute of the font.
    int getStrikeoutPosition()  
    int getStrikeoutThickness()  
    java.lang.String getSubFamilyName()
    Returns the font sub family name of the font.
    java.util.List<java.lang.String> getTTCnames​(FontFileReader in)
    Return TTC font names
    int getUnderlinePosition()  
    int getUnderlineThickness()  
    int getWeightClass()
    Returns the weight class of this font.
    int[] getWidths()
    Returns an array of character widths.
    int getXHeight()
    Returns the XHeight attribute of the font.
    protected void guessVerticalMetricsFromGlyphBBox()  
    protected void handleCharacterSpacing​(FontFileReader in)  
    boolean hasAdvancedTable()
    Determine if advanced (typographic) table is present.
    protected void initAnsiWidths()
    initialize the ansiWidths array (for winAnsiEncoding) and fill with the missingwidth
    protected abstract void initializeFont​(FontFileReader in)  
    boolean isCFF()
    Indicates whether or not the font is an OpenType CFF font (rather than a TrueType font).
    boolean isEmbeddable()
    Indicates if the font may be embedded.
    static void main​(java.lang.String[] args)
    Static main method to get info about a TrueType font.
    void printStuff()
    Dumps a few informational values to System.out.
    protected boolean readCMAP()
    Read the cmap table, return false if the table is not present or only unsupported tables are present.
    protected void readDirTabs()
    Read Table Directory from the current position in the FontFileReader and fill the global HashMap dirTabs with the table name (String) as key and a TTFDirTabEntry as value.
    void readFont​(FontFileReader in, java.lang.String header)
    Reads the font using a FontFileReader.
    boolean readFont​(FontFileReader in, java.lang.String header, java.lang.String name)
    Read the font data.
    void readFont​(FontFileReader in, java.lang.String header, MultiByteFont mbfont)
    Reads a font.
    protected void readFontHeader()
    Read the "head" table, this reads the bounding box and sets the upem (unitsPerEM) variable
    protected void readHorizontalHeader()
    Read the "hhea" table to find the ascender and descender and size of "hmtx" table, as a fixed size font might have only one width.
    protected void readHorizontalMetrics()
    Read "hmtx" table and put the horizontal metrics in the mtxTab array.
    protected void readKerning()
    Read the kerning table, create a table for both CIDs and winAnsiEncoding.
    protected abstract void readName()  
    protected void readOS2()
    Read the "OS/2" table
    protected boolean readPCLT()
    Read the "PCLT" table to find xHeight and capHeight.
    protected void readPostScript()
    Read the "post" table containing the PostScript names of the glyphs.
    boolean seekTab​(FontFileReader in, OFTableName tableName, long offset)
    Position inputstream to position indicated in the dirtab offset + offset
    void stream​(TTFOutputStream ttfOut)
    Streams a font.
    protected abstract void updateBBoxAndOffset()  

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • fontFile

      protected FontFileReader fontFile
      The FontFileReader used to read this TrueType font.
    • TRACE_ENABLED

      public static final boolean TRACE_ENABLED
      Set to true to get even more debug output than with level DEBUG
      See Also:
      Constant Field Values
    • useKerning

      protected boolean useKerning
    • dirTabs

      protected java.util.Map<OFTableName,​OFDirTabEntry> dirTabs
      Table directory
    • unicodeMappings

      protected java.util.List<org.docx4j.fonts.fop.fonts.truetype.OpenFont.UnicodeMapping> unicodeMappings
    • nhmtx

      protected int nhmtx
    • locaFormat

      protected int locaFormat
    • lastLoca

      protected long lastLoca
      Offset to last loca
    • numberOfGlyphs

      protected int numberOfGlyphs
    • mtxTab

      protected OFMtxEntry[] mtxTab
      Contains glyph data
    • postScriptName

      protected java.lang.String postScriptName
    • fullName

      protected java.lang.String fullName
    • embedFontName

      protected java.lang.String embedFontName
    • notice

      protected java.lang.String notice
    • familyNames

      protected final java.util.Set<java.lang.String> familyNames
    • subFamilyName

      protected java.lang.String subFamilyName
    • cid

      protected boolean cid
    • useAdvanced

      protected boolean useAdvanced
    • advancedTableReader

      protected OTFAdvancedTypographicTableReader advancedTableReader
    • log

      protected org.slf4j.Logger log
      logging instance
  • Constructor Details

    • OpenFont

      public OpenFont()
    • OpenFont

      public OpenFont​(boolean useKerning, boolean useAdvanced)
      Constructor
      Parameters:
      useKerning - true if kerning data should be loaded
      useAdvanced - true if advanced typographic tables should be loaded
  • Method Details

    • getDirectoryEntry

      public OFDirTabEntry getDirectoryEntry​(OFTableName name)
      Obtain directory table entry.
      Parameters:
      name - (tag) of entry
      Returns:
      a directory table entry or null if none found
    • seekTab

      public boolean seekTab​(FontFileReader in, OFTableName tableName, long offset) throws java.io.IOException
      Position inputstream to position indicated in the dirtab offset + offset
      Parameters:
      in - font file reader
      tableName - (tag) of table
      offset - from start of table
      Returns:
      true if seek succeeded
      Throws:
      java.io.IOException - if I/O exception occurs during seek
    • convertTTFUnit2PDFUnit

      public int convertTTFUnit2PDFUnit​(int n)
      Convert from truetype unit to pdf unit based on the unitsPerEm field in the "head" table
      Parameters:
      n - truetype unit
      Returns:
      pdf unit
    • readCMAP

      protected boolean readCMAP() throws java.io.IOException
      Read the cmap table, return false if the table is not present or only unsupported tables are present. Currently only unicode cmaps are supported. Set the unicodeIndex in the TTFMtxEntries and fills in the cmaps vector.
      Throws:
      java.io.IOException
      See Also:
      TrueType-Reference-Manual
    • getMtx

      public java.util.List<OFMtxEntry> getMtx()
      Returns:
      mmtx data
    • readFont

      public void readFont​(FontFileReader in, java.lang.String header) throws java.io.IOException
      Reads the font using a FontFileReader.
      Parameters:
      in - The FontFileReader to use
      Throws:
      java.io.IOException - In case of an I/O problem
    • initAnsiWidths

      protected void initAnsiWidths()
      initialize the ansiWidths array (for winAnsiEncoding) and fill with the missingwidth
    • readFont

      public boolean readFont​(FontFileReader in, java.lang.String header, java.lang.String name) throws java.io.IOException
      Read the font data. If the fontfile is a TrueType Collection (.ttc file) the name of the font to read data for must be supplied, else the name is ignored.
      Parameters:
      in - The FontFileReader to use
      name - The name of the font
      Returns:
      boolean Returns true if the font is valid
      Throws:
      java.io.IOException - In case of an I/O problem
    • readFont

      public void readFont​(FontFileReader in, java.lang.String header, MultiByteFont mbfont) throws java.io.IOException
      Reads a font.
      Parameters:
      in - FontFileReader to read from
      Throws:
      java.io.IOException - in case of an I/O problem
    • updateBBoxAndOffset

      protected abstract void updateBBoxAndOffset() throws java.io.IOException
      Throws:
      java.io.IOException
    • readName

      protected abstract void readName() throws java.io.IOException
      Throws:
      java.io.IOException
    • initializeFont

      protected abstract void initializeFont​(FontFileReader in) throws java.io.IOException
      Throws:
      java.io.IOException
    • handleCharacterSpacing

      protected void handleCharacterSpacing​(FontFileReader in) throws java.io.IOException
      Throws:
      java.io.IOException
    • createCMaps

      protected void createCMaps()
    • getPostScriptName

      public java.lang.String getPostScriptName()
      Returns the PostScript name of the font.
      Returns:
      String The PostScript name
    • getFamilyNames

      public java.util.Set<java.lang.String> getFamilyNames()
      Returns the font family names of the font.
      Returns:
      Set The family names (a Set of Strings)
    • getSubFamilyName

      public java.lang.String getSubFamilyName()
      Returns the font sub family name of the font.
      Returns:
      String The sub family name
    • getFullName

      public java.lang.String getFullName()
      Returns the full name of the font.
      Returns:
      String The full name
    • getCharSetName

      public java.lang.String getCharSetName()
      Returns the name of the character set used.
      Returns:
      String The caracter set
    • getCapHeight

      public int getCapHeight()
      Returns the CapHeight attribute of the font.
      Returns:
      int The CapHeight
    • getXHeight

      public int getXHeight()
      Returns the XHeight attribute of the font.
      Returns:
      int The XHeight
    • getPadSize

      protected int getPadSize​(int currentPosition)
      Returns the number of bytes necessary to pad the currentPosition so that a table begins on a 4-byte boundary.
      Parameters:
      currentPosition - the position to pad.
      Returns:
      int the number of bytes to pad.
    • getFlags

      public int getFlags()
      Returns the Flags attribute of the font.
      Returns:
      int The Flags
    • getWeightClass

      public int getWeightClass()
      Returns the weight class of this font. Valid values are 100, 200....,800, 900.
      Returns:
      the weight class value (or 0 if there was no OS/2 table in the font)
    • getStemV

      public java.lang.String getStemV()
      Returns the StemV attribute of the font.
      Returns:
      String The StemV
    • getItalicAngle

      public java.lang.String getItalicAngle()
      Returns the ItalicAngle attribute of the font.
      Returns:
      String The ItalicAngle
    • getFontBBox

      public int[] getFontBBox()
      Returns:
      int[] The font bbox
    • getBBoxRaw

      public int[] getBBoxRaw()
      Returns the original bounding box values from the HEAD table
      Returns:
      An array of bounding box values
    • getLowerCaseAscent

      public int getLowerCaseAscent()
      Returns the LowerCaseAscent attribute of the font.
      Returns:
      int The LowerCaseAscent
    • getLowerCaseDescent

      public int getLowerCaseDescent()
      Returns the LowerCaseDescent attribute of the font.
      Returns:
      int The LowerCaseDescent
    • getLastChar

      public short getLastChar()
      Returns the index of the last character, but this is for WinAnsiEncoding only, so the last char is < 256.
      Returns:
      short Index of the last character (<256)
    • getFirstChar

      public short getFirstChar()
      Returns the index of the first character.
      Returns:
      short Index of the first character
    • getWidths

      public int[] getWidths()
      Returns an array of character widths.
      Returns:
      int[] The character widths
    • getBoundingBoxes

      public java.awt.Rectangle[] getBoundingBoxes()
    • getBBox

      public int[] getBBox​(int glyphIndex)
      Returns an array (xMin, yMin, xMax, yMax) for a glyph.
      Parameters:
      glyphIndex - the index of the glyph
      Returns:
      int[] Array defining bounding box.
    • getCharWidth

      public int getCharWidth​(int idx)
      Returns the width of a given character.
      Parameters:
      idx - Index of the character
      Returns:
      int Standard width
    • getCharWidthRaw

      public int getCharWidthRaw​(int idx)
      Returns the width of a given character in raw units
      Parameters:
      idx - Index of the character
      Returns:
      int Width in it's raw form stored in the font
    • getKerning

      public java.util.Map<java.lang.Integer,​java.util.Map<java.lang.Integer,​java.lang.Integer>> getKerning()
      Returns the kerning table.
      Returns:
      Map The kerning table
    • getAnsiKerning

      public java.util.Map<java.lang.Integer,​java.util.Map<java.lang.Integer,​java.lang.Integer>> getAnsiKerning()
      Returns the ANSI kerning table.
      Returns:
      Map The ANSI kerning table
    • getUnderlinePosition

      public int getUnderlinePosition()
    • getUnderlineThickness

      public int getUnderlineThickness()
    • getStrikeoutPosition

      public int getStrikeoutPosition()
    • getStrikeoutThickness

      public int getStrikeoutThickness()
    • isEmbeddable

      public boolean isEmbeddable()
      Indicates if the font may be embedded.
      Returns:
      boolean True if it may be embedded
    • isCFF

      public boolean isCFF()
      Indicates whether or not the font is an OpenType CFF font (rather than a TrueType font).
      Returns:
      true if the font is in OpenType CFF format.
    • readDirTabs

      protected void readDirTabs() throws java.io.IOException
      Read Table Directory from the current position in the FontFileReader and fill the global HashMap dirTabs with the table name (String) as key and a TTFDirTabEntry as value.
      Throws:
      java.io.IOException - in case of an I/O problem
    • readFontHeader

      protected void readFontHeader() throws java.io.IOException
      Read the "head" table, this reads the bounding box and sets the upem (unitsPerEM) variable
      Throws:
      java.io.IOException - in case of an I/O problem
    • getNumGlyphs

      protected void getNumGlyphs() throws java.io.IOException
      Read the number of glyphs from the "maxp" table
      Throws:
      java.io.IOException - in case of an I/O problem
    • readHorizontalHeader

      protected void readHorizontalHeader() throws java.io.IOException
      Read the "hhea" table to find the ascender and descender and size of "hmtx" table, as a fixed size font might have only one width.
      Throws:
      java.io.IOException - in case of an I/O problem
    • readHorizontalMetrics

      protected void readHorizontalMetrics() throws java.io.IOException
      Read "hmtx" table and put the horizontal metrics in the mtxTab array. If the number of metrics is less than the number of glyphs (eg fixed size fonts), extend the mtxTab array and fill in the missing widths
      Throws:
      java.io.IOException - in case of an I/O problem
    • readPostScript

      protected void readPostScript() throws java.io.IOException
      Read the "post" table containing the PostScript names of the glyphs.
      Throws:
      java.io.IOException
    • readOS2

      protected void readOS2() throws java.io.IOException
      Read the "OS/2" table
      Throws:
      java.io.IOException
    • readPCLT

      protected boolean readPCLT() throws java.io.IOException
      Read the "PCLT" table to find xHeight and capHeight.
      Throws:
      java.io.IOException - In case of a I/O problem
    • determineAscDesc

      protected void determineAscDesc()
      Determines the right source for the ascender and descender values. The problem here is that the interpretation of these values is not the same for every font. There doesn't seem to be a uniform definition of an ascender and a descender. In some fonts the hhea values are defined after the Apple interpretation, but not in every font. The same problem is in the OS/2 table. FOP needs the ascender and descender to determine the baseline so we need values which add up more or less to the "em box". However, due to accent modifiers a character can grow beyond the em box.
    • guessVerticalMetricsFromGlyphBBox

      protected void guessVerticalMetricsFromGlyphBBox()
    • readKerning

      protected void readKerning() throws java.io.IOException
      Read the kerning table, create a table for both CIDs and winAnsiEncoding.
      Throws:
      java.io.IOException - In case of a I/O problem
    • stream

      public void stream​(TTFOutputStream ttfOut) throws java.io.IOException
      Streams a font.
      Parameters:
      ttfOut - The interface for streaming TrueType tables.
      Throws:
      java.io.IOException - file write error
    • getCMaps

      public java.util.List<CMapSegment> getCMaps()
      Returns this font's character to glyph mapping.
      Returns:
      the font's cmap
    • checkTTC

      protected final boolean checkTTC​(java.lang.String tag, java.lang.String name) throws java.io.IOException
      Check if this is a TrueType collection and that the given name exists in the collection. If it does, set offset in fontfile to the beginning of the Table Directory for that font.
      Parameters:
      name - The name to check
      Returns:
      True if not collection or font name present, false otherwise
      Throws:
      java.io.IOException - In case of an I/O problem
    • getTTCnames

      public final java.util.List<java.lang.String> getTTCnames​(FontFileReader in) throws java.io.IOException
      Return TTC font names
      Parameters:
      in - FontFileReader to read from
      Returns:
      True if not collection or font name present, false otherwise
      Throws:
      java.io.IOException - In case of an I/O problem
    • getPanose

      public Panose getPanose()
    • printStuff

      public void printStuff()
      Dumps a few informational values to System.out.
    • hasAdvancedTable

      public boolean hasAdvancedTable()
      Determine if advanced (typographic) table is present.
      Returns:
      true if advanced (typographic) table is present
    • getGDEF

      public GlyphDefinitionTable getGDEF()
      Returns the GDEF table or null if none present.
      Returns:
      the GDEF table
    • getGSUB

      public GlyphSubstitutionTable getGSUB()
      Returns the GSUB table or null if none present.
      Returns:
      the GSUB table
    • getGPOS

      public GlyphPositioningTable getGPOS()
      Returns the GPOS table or null if none present.
      Returns:
      the GPOS table
    • main

      public static void main​(java.lang.String[] args)
      Static main method to get info about a TrueType font.
      Parameters:
      args - The command line arguments
    • getEmbedFontName

      public java.lang.String getEmbedFontName()
    • getCopyrightNotice

      public java.lang.String getCopyrightNotice()