Class FontMapperImpl

  • All Implemented Interfaces:
    FontMapper

    final class FontMapperImpl
    extends java.lang.Object
    implements FontMapper
    Font mapper, locates non-embedded fonts via a pluggable FontProvider.
    • Field Detail

      • LOG

        private static final org.apache.commons.logging.Log LOG
      • fontCache

        private static final FontCache fontCache
      • fontInfoByName

        private java.util.Map<java.lang.String,​FontInfo> fontInfoByName
      • substitutes

        private final java.util.Map<java.lang.String,​java.util.List<java.lang.String>> substitutes
        Map of PostScript name substitutes, in priority order.
    • Constructor Detail

      • FontMapperImpl

        FontMapperImpl()
    • Method Detail

      • setProvider

        public void setProvider​(FontProvider fontProvider)
        Sets the font service provider.
      • getProvider

        public FontProvider getProvider()
        Returns the font service provider. Defaults to using FileSystemFontProvider.
      • getFontCache

        public FontCache getFontCache()
        Returns the font cache associated with this FontMapper. This method is needed by FontProvider subclasses.
      • createFontInfoByName

        private java.util.Map<java.lang.String,​FontInfo> createFontInfoByName​(java.util.List<? extends FontInfo> fontInfoList)
      • getPostScriptNames

        private java.util.Set<java.lang.String> getPostScriptNames​(java.lang.String postScriptName)
        Gets alternative names, as seen in some PDFs, e.g. PDFBOX-142.
      • copySubstitutes

        private java.util.List<java.lang.String> copySubstitutes​(java.lang.String postScriptName)
        Copies a list of font substitutes, adding the original font at the start of the list.
      • addSubstitute

        public void addSubstitute​(java.lang.String match,
                                  java.lang.String replace)
        Adds a top-priority substitute for the given font.
        Parameters:
        match - PostScript name of the font to match
        replace - PostScript name of the font to use as a replacement
      • getSubstitutes

        private java.util.List<java.lang.String> getSubstitutes​(java.lang.String postScriptName)
        Returns the substitutes for a given font.
      • getFallbackFontName

        private java.lang.String getFallbackFontName​(PDFontDescriptor fontDescriptor)
        Attempts to find a good fallback based on the font descriptor.
      • getTrueTypeFont

        public FontMapping<TrueTypeFont> getTrueTypeFont​(java.lang.String baseFont,
                                                         PDFontDescriptor fontDescriptor)
        Finds a TrueType font with the given PostScript name, or a suitable substitute, or null.
        Specified by:
        getTrueTypeFont in interface FontMapper
        Parameters:
        fontDescriptor - FontDescriptor
      • getFontBoxFont

        public FontMapping<FontBoxFont> getFontBoxFont​(java.lang.String baseFont,
                                                       PDFontDescriptor fontDescriptor)
        Finds a font with the given PostScript name, or a suitable substitute, or null. This allows any font to be substituted with a PFB, TTF or OTF.
        Specified by:
        getFontBoxFont in interface FontMapper
        Parameters:
        fontDescriptor - the FontDescriptor of the font to find
      • findFontBoxFont

        private FontBoxFont findFontBoxFont​(java.lang.String postScriptName)
        Finds a font with the given PostScript name, or a suitable substitute, or null.
        Parameters:
        postScriptName - PostScript font name
      • findFont

        private FontBoxFont findFont​(FontFormat format,
                                     java.lang.String postScriptName)
        Finds a font with the given PostScript name, or a suitable substitute, or null.
        Parameters:
        postScriptName - PostScript font name
      • getFont

        private FontInfo getFont​(FontFormat format,
                                 java.lang.String postScriptName)
        Finds the named font with the given format.
      • getCIDFont

        public CIDFontMapping getCIDFont​(java.lang.String baseFont,
                                         PDFontDescriptor fontDescriptor,
                                         PDCIDSystemInfo cidSystemInfo)
        Finds a CFF CID-Keyed font with the given PostScript name, or a suitable substitute, or null. This method can also map CJK fonts via their CIDSystemInfo (ROS).
        Specified by:
        getCIDFont in interface FontMapper
        Parameters:
        fontDescriptor - FontDescriptor
        cidSystemInfo - the CID system info, e.g. "Adobe-Japan1", if any.
      • getFontMatches

        private java.util.PriorityQueue<FontMapperImpl.FontMatch> getFontMatches​(PDFontDescriptor fontDescriptor,
                                                                                 PDCIDSystemInfo cidSystemInfo)
        Returns a list of matching fonts, scored by suitability. Positive scores indicate matches for certain attributes, while negative scores indicate mismatches. Zero scores are neutral.
        Parameters:
        fontDescriptor - FontDescriptor, always present.
        cidSystemInfo - Font's CIDSystemInfo, may be null.
      • probablyBarcodeFont

        private boolean probablyBarcodeFont​(PDFontDescriptor fontDescriptor)
      • isCharSetMatch

        private boolean isCharSetMatch​(PDCIDSystemInfo cidSystemInfo,
                                       FontInfo info)
        Returns true if the character set described by CIDSystemInfo is present in the given font. Only applies to Adobe-GB1, Adobe-CNS1, Adobe-Japan1, Adobe-Korea1, as per the PDF spec.