Search in sources :

Example 1 with FontBoxFont

use of org.apache.fontbox.FontBoxFont in project pdfbox by apache.

the class FontMapperImpl method getCIDFont.

/**
 * 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).
 *
 * @param fontDescriptor FontDescriptor
 * @param cidSystemInfo the CID system info, e.g. "Adobe-Japan1", if any.
 */
@Override
public CIDFontMapping getCIDFont(String baseFont, PDFontDescriptor fontDescriptor, PDCIDSystemInfo cidSystemInfo) {
    // try name match or substitute with OTF
    OpenTypeFont otf1 = (OpenTypeFont) findFont(FontFormat.OTF, baseFont);
    if (otf1 != null) {
        return new CIDFontMapping(otf1, null, false);
    }
    // try name match or substitute with TTF
    TrueTypeFont ttf = (TrueTypeFont) findFont(FontFormat.TTF, baseFont);
    if (ttf != null) {
        return new CIDFontMapping(null, ttf, false);
    }
    if (cidSystemInfo != null) {
        // "In Acrobat 3.0.1 and later, Type 0 fonts that use a CMap whose CIDSystemInfo
        // dictionary defines the Adobe-GB1, Adobe-CNS1 Adobe-Japan1, or Adobe-Korea1 character
        // collection can also be substituted." - Adobe Supplement to the ISO 32000
        String collection = cidSystemInfo.getRegistry() + "-" + cidSystemInfo.getOrdering();
        if (collection.equals("Adobe-GB1") || collection.equals("Adobe-CNS1") || collection.equals("Adobe-Japan1") || collection.equals("Adobe-Korea1")) {
            // try automatic substitutes via character collection
            PriorityQueue<FontMatch> queue = getFontMatches(fontDescriptor, cidSystemInfo);
            FontMatch bestMatch = queue.poll();
            if (bestMatch != null) {
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Best match for '" + baseFont + "': " + bestMatch.info);
                }
                FontBoxFont font = bestMatch.info.getFont();
                if (font instanceof OpenTypeFont) {
                    return new CIDFontMapping((OpenTypeFont) font, null, true);
                } else if (font != null) {
                    return new CIDFontMapping(null, font, true);
                }
            }
        }
    }
    // last-resort fallback
    return new CIDFontMapping(null, lastResortFont, true);
}
Also used : TrueTypeFont(org.apache.fontbox.ttf.TrueTypeFont) OpenTypeFont(org.apache.fontbox.ttf.OpenTypeFont) FontBoxFont(org.apache.fontbox.FontBoxFont)

Example 2 with FontBoxFont

use of org.apache.fontbox.FontBoxFont in project pdfbox by apache.

the class FontMapperImpl method getFontBoxFont.

/**
 * 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.
 *
 * @param fontDescriptor the FontDescriptor of the font to find
 */
@Override
public FontMapping<FontBoxFont> getFontBoxFont(String baseFont, PDFontDescriptor fontDescriptor) {
    FontBoxFont font = findFontBoxFont(baseFont);
    if (font != null) {
        return new FontMapping<>(font, false);
    } else {
        // fallback - todo: i.e. fuzzy match
        String fallbackName = getFallbackFontName(fontDescriptor);
        font = findFontBoxFont(fallbackName);
        if (font == null) {
            // we have to return something here as TTFs aren't strictly required on the system
            font = lastResortFont;
        }
        return new FontMapping<>(font, true);
    }
}
Also used : FontBoxFont(org.apache.fontbox.FontBoxFont)

Aggregations

FontBoxFont (org.apache.fontbox.FontBoxFont)2 OpenTypeFont (org.apache.fontbox.ttf.OpenTypeFont)1 TrueTypeFont (org.apache.fontbox.ttf.TrueTypeFont)1