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());
             }
         }
 


Reply via email to