package com.tom_roush.pdfbox.pdmodel.font; import com.tom_roush.fontbox.afm.AFMParser; import com.tom_roush.fontbox.afm.FontMetrics; import com.tom_roush.pdfbox.util.PDFBoxResourceLoader; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * The "Standard 14" PDF fonts, also known as the "base 14" fonts. * There are 14 font files, but Acrobat uses additional names for compatibility, e.g. Arial. * * @author John Hewson */ final class Standard14Fonts { private Standard14Fonts() { } private static final Set<String> STANDARD_14_NAMES = new HashSet<String>(); private static final Map<String, String> STANDARD_14_MAPPING = new HashMap<String, String>(); private static final Map<String, FontMetrics> STANDARD14_AFM_MAP; static { try { STANDARD14_AFM_MAP = new HashMap<String, FontMetrics>(); addAFM("Courier-Bold"); addAFM("Courier-BoldOblique"); addAFM("Courier"); addAFM("Courier-Oblique"); addAFM("Helvetica"); addAFM("Helvetica-Bold"); addAFM("Helvetica-BoldOblique"); addAFM("Helvetica-Oblique"); addAFM("Symbol"); addAFM("Times-Bold"); addAFM("Times-BoldItalic"); addAFM("Times-Italic"); addAFM("Times-Roman"); addAFM("ZapfDingbats"); // alternative names from Adobe Supplement to the ISO 32000 addAFM("CourierCourierNew", "Courier"); addAFM("CourierNew", "Courier"); addAFM("CourierNew,Italic", "Courier-Oblique"); addAFM("CourierNew,Bold", "Courier-Bold"); addAFM("CourierNew,BoldItalic", "Courier-BoldOblique"); addAFM("Arial", "Helvetica"); addAFM("Arial,Italic", "Helvetica-Oblique"); addAFM("Arial,Bold", "Helvetica-Bold"); addAFM("Arial,BoldItalic", "Helvetica-BoldOblique"); addAFM("TimesNewRoman", "Times-Roman"); addAFM("TimesNewRoman,Italic", "Times-Italic"); addAFM("TimesNewRoman,Bold", "Times-Bold"); addAFM("TimesNewRoman,BoldItalic", "Times-BoldItalic"); // Acrobat treats these fonts as "standard 14" too (at least Acrobat preflight says so) addAFM("Symbol,Italic", "Symbol"); addAFM("Symbol,Bold", "Symbol"); addAFM("Symbol,BoldItalic", "Symbol"); addAFM("Times", "Times-Roman"); addAFM("Times,Italic", "Times-Italic"); addAFM("Times,Bold", "Times-Bold"); addAFM("Times,BoldItalic", "Times-BoldItalic"); } catch (IOException e) { throw new RuntimeException(e); } } private static void addAFM(String fontName) throws IOException { addAFM(fontName, fontName); } private static void addAFM(String fontName, String afmName) throws IOException { STANDARD_14_NAMES.add(fontName); STANDARD_14_MAPPING.put(fontName, afmName); if (STANDARD14_AFM_MAP.containsKey(afmName)) { STANDARD14_AFM_MAP.put(fontName, STANDARD14_AFM_MAP.get(afmName)); } String resourceName = "com/tom_roush/pdfbox/resources/afm/" + afmName + ".afm"; InputStream afmStream; if(PDFBoxResourceLoader.isReady()) { afmStream = PDFBoxResourceLoader.getStream(resourceName); } else { // Fallback URL url = PDType1Font.class.getClassLoader().getResource(resourceName); if (url != null) { afmStream = url.openStream(); } else { throw new IOException(resourceName + " not found"); } } try { AFMParser parser = new AFMParser(afmStream); FontMetrics metric = parser.parse(); STANDARD14_AFM_MAP.put(fontName, metric); } finally { afmStream.close(); } } /** * Returns the AFM for the given font. * @param baseName base name of font */ public static FontMetrics getAFM(String baseName) { return STANDARD14_AFM_MAP.get(baseName); } /** * Returns true if the given font name a Standard 14 font. * @param baseName base name of font */ public static boolean containsName(String baseName) { return STANDARD_14_NAMES.contains(baseName); } /** * Returns the set of Standard 14 font names, including additional names. */ public static Set<String> getNames() { return Collections.unmodifiableSet(STANDARD_14_NAMES); } /** * Returns the name of the actual font which the given font name maps to. * @param baseName base name of font */ public static String getMappedFontName(String baseName) { return STANDARD_14_MAPPING.get(baseName); } }