Author: jahewson Date: Wed Aug 27 00:37:11 2014 New Revision: 1620767 URL: http://svn.apache.org/r1620767 Log: PDFBOX-2262: Smart fallback
Removed: pdfbox/branches/no-awt/pdfbox/src/main/resources/org/apache/pdfbox/resources/ttf/ Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ExternalFonts.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ExternalFonts.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ExternalFonts.java?rev=1620767&r1=1620766&r2=1620767&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ExternalFonts.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ExternalFonts.java Wed Aug 27 00:37:11 2014 @@ -16,8 +16,6 @@ */ package org.apache.pdfbox.pdmodel.font; -import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -31,7 +29,6 @@ import org.apache.fontbox.cff.CFFCIDFont import org.apache.fontbox.cff.CFFFont; import org.apache.fontbox.cff.CFFType1Font; import org.apache.fontbox.ttf.Type1Equivalent; -import org.apache.fontbox.ttf.TTFParser; import org.apache.fontbox.ttf.TrueTypeFont; import org.apache.fontbox.type1.Type1Font; @@ -67,28 +64,6 @@ public final class ExternalFonts return fontProvider; } - // todo: we could just rely on the system to provide Times rather than ship our own - /** Fallback font, used as as a last resort */ - private static TrueTypeFont fallbackFont; - static - { - try - { - String name = "org/apache/pdfbox/resources/ttf/LiberationSans-Regular.ttf"; - TTFParser ttfParser = new TTFParser(); - InputStream fontStream = org.apache.fontbox.util.ResourceLoader.loadResource(name); - if (fontStream == null) - { - throw new IOException("Error loading resource: " + name); - } - fallbackFont = ttfParser.parseTTF(fontStream); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - /** Map of PostScript name substitutes, in priority order. */ private final static Map<String, List<String>> substitutes = new HashMap<String, List<String>>(); static @@ -181,13 +156,84 @@ public final class ExternalFonts } /** - * Returns the fallback font, used for rendering when no other fonts are available. + * Returns the fallback font, used for rendering when no other fonts are available, + * we attempt to find a good fallback based on the font descriptor. */ - public static TrueTypeFont getFallbackFont() + public static TrueTypeFont getFallbackFont(PDFontDescriptor fontDescriptor) { - // todo: add FontDescriptor to the parameters for this method for "smart fallback" to - // standard 14 fonts via the FontProvider - return fallbackFont; + String fontName = "Times"; + + if (fontDescriptor != null) + { + // heuristic detection of bold + boolean isBold = false; + String name = fontDescriptor.getFontName(); + if (name != null) + { + isBold = fontDescriptor.getFontName().toLowerCase().contains("bold"); + } + + // font descriptor flags should describe the style + if (fontDescriptor.isFixedPitch()) + { + fontName = "Courier"; + if (isBold && fontDescriptor.isItalic()) + { + fontName += "-BoldOblique"; + } + else if (isBold) + { + fontName += "-Bold"; + } + else if (fontDescriptor.isItalic()) + { + fontName += "-Oblique"; + } + } + else if (fontDescriptor.isSerif()) + { + fontName = "Times"; + if (isBold && fontDescriptor.isItalic()) + { + fontName += "-BoldItalic"; + } + else if (isBold) + { + fontName += "-Bold"; + } + else if (fontDescriptor.isItalic()) + { + fontName += "-Italic"; + } + else + { + fontName += "-Roman"; + } + } + else + { + fontName = "Helvetica"; + if (isBold && fontDescriptor.isItalic()) + { + fontName += "-BoldOblique"; + } + else if (isBold) + { + fontName += "-Bold"; + } + else if (fontDescriptor.isItalic()) + { + fontName += "-Oblique"; + } + } + } + + TrueTypeFont ttf = getTrueTypeFont(fontName); + if (ttf == null) + { + throw new IllegalStateException("No fonts available on the system"); + } + return ttf; } /** Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java?rev=1620767&r1=1620766&r2=1620767&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java Wed Aug 27 00:37:11 2014 @@ -82,7 +82,7 @@ public class PDCIDFontType2 extends PDCI { // fallback LOG.warn("Using fallback font for " + getBaseFont()); - ttf = ExternalFonts.getFallbackFont(); + ttf = ExternalFonts.getFallbackFont(getFontDescriptor()); } isEmbedded = false; } Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java?rev=1620767&r1=1620766&r2=1620767&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java Wed Aug 27 00:37:11 2014 @@ -115,7 +115,7 @@ public class PDTrueTypeFont extends PDSi if (ttfFont == null) { LOG.warn("Using fallback font for " + getBaseFont()); - ttfFont = ExternalFonts.getFallbackFont(); + ttfFont = ExternalFonts.getFallbackFont(getFontDescriptor()); } } ttf = ttfFont; Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java?rev=1620767&r1=1620766&r2=1620767&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java Wed Aug 27 00:37:11 2014 @@ -99,7 +99,7 @@ public class PDType1CFont extends PDSimp else { LOG.warn("Using fallback font for " + getBaseFont()); - type1Equivalent = ExternalFonts.getFallbackFont(); + type1Equivalent = ExternalFonts.getFallbackFont(getFontDescriptor()); } isEmbedded = false; } Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java?rev=1620767&r1=1620766&r2=1620767&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java Wed Aug 27 00:37:11 2014 @@ -229,7 +229,7 @@ public class PDType1Font extends PDSimpl else { LOG.warn("Using fallback font for " + getBaseFont()); - type1Equivalent = ExternalFonts.getFallbackFont(); + type1Equivalent = ExternalFonts.getFallbackFont(getFontDescriptor()); } }