You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/07/01 04:57:43 UTC

svn commit: r1606970 - in /pdfbox/trunk: fontbox/src/main/java/org/apache/fontbox/util/ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ pdfbox/src/main/java/org/apache/pdfbox/rendering/ pdfbox/src/main/java/org/apache/pdfbox/util/ pdfbox/src/main/...

Author: jahewson
Date: Tue Jul  1 02:57:43 2014
New Revision: 1606970

URL: http://svn.apache.org/r1606970
Log:
PDFBOX-2169: improve error for missing standard font (partial push)

Added:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/util/SystemFontManager.java
      - copied, changed from r1606967, pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/util/FontManager.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFFontManager.java
      - copied, changed from r1606966, pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FontManager.java
Removed:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/util/FontManager.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FontManager.java
Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetTextFont.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/ResourcesValidationProcess.java

Copied: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/util/SystemFontManager.java (from r1606967, pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/util/FontManager.java)
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/util/SystemFontManager.java?p2=pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/util/SystemFontManager.java&p1=pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/util/FontManager.java&r1=1606967&r2=1606970&rev=1606970&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/util/FontManager.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/util/SystemFontManager.java Tue Jul  1 02:57:43 2014
@@ -32,28 +32,19 @@ import org.apache.fontbox.ttf.TrueTypeFo
 import org.apache.fontbox.util.autodetect.FontFileFinder;
 
 /**
- * This class is used as manager for local fonts. It's based on the font manager provided by Apache FOP. see
- * org.apache.fop.fonts.FontManager.java
+ * System font manager. Based on the font manager provided by Apache FOP.
+ *
+ * See: org.apache.fop.fonts.FontManager
  */
-
-public class FontManager
+public class SystemFontManager
 {
-    /**
-     * Log instance.
-     */
-    private static final Log LOG = LogFactory.getLog(FontManager.class);
+    private static final Log LOG = LogFactory.getLog(SystemFontManager.class);
 
     private static HashMap<String, String> ttfFontfiles = new HashMap<String, String>();
-
     private static boolean fontsLoaded = false;
-
-    // HashMap with all known true type fonts
     private static HashMap<String, String> fontMappingTTF = new HashMap<String, String>();
 
-    // fallback font
-    private static TrueTypeFont standardFont;
-
-    private FontManager()
+    private SystemFontManager()
     {
     }
 
@@ -340,38 +331,4 @@ public class FontManager
         }
         return ttfFont;
     }
-
-    /**
-     * Get the standard font from the environment.
-     *
-     * @return standard font
-     */
-    public static TrueTypeFont getStandardFont() throws IOException
-    {
-        if (standardFont == null)
-        {
-            // todo: make this configurable
-
-            // Windows
-            standardFont = findTTFont("Arial");
-
-            if (standardFont == null)
-            {
-                // OS X
-                standardFont = findTTFont("Helvetica");
-            }
-
-            if (standardFont == null)
-            {
-                // Linux
-                standardFont = findTTFont("Liberation Sans");
-            }
-
-            if (standardFont == null)
-            {
-                throw new IOException("Could not find TTF fallback font on the system");
-            }
-        }
-        return standardFont;
-    }
 }

Copied: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFFontManager.java (from r1606966, pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FontManager.java)
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFFontManager.java?p2=pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFFontManager.java&p1=pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FontManager.java&r1=1606966&r2=1606970&rev=1606970&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FontManager.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFFontManager.java Tue Jul  1 02:57:43 2014
@@ -25,27 +25,27 @@ import java.util.Properties;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import org.apache.fontbox.ttf.TrueTypeFont;
+import org.apache.fontbox.util.SystemFontManager;
 import org.apache.pdfbox.util.ResourceLoader;
 
 /**
- *  This class is used as font manager.
- *  @author <a href="mailto:andreas@lehmi.de">Andreas Lehmkühler</a>
- *  @version $Revision: 1.0 $
+ * PDF font manager.
+ *
+ * @author Andreas Lehmkühler
  */
-
-public class FontManager 
+public final class PDFFontManager
 {
-    /**
-     * Log instance.
-     */
-    private static final Log LOG = LogFactory.getLog(FontManager.class);
+    private static final Log LOG = LogFactory.getLog(PDFFontManager.class);
 
-    // HashMap with all known fonts
+    // AWT
     private static HashMap<String,java.awt.Font> envFonts = new HashMap<String,java.awt.Font>();
-    // the standard font
-    private final static String standardFont = "helvetica";
-    private static Properties fontMapping = new Properties(); 
-    
+    private final static String awtFallback = "helvetica";
+    private static Properties fontMapping = new Properties();
+
+    // system TTF
+    private static TrueTypeFont ttfFallback;
+
     static {
         try
         {
@@ -63,7 +63,7 @@ public class FontManager 
         loadFontMapping();
     }
     
-    private FontManager() 
+    private PDFFontManager()
     {
     }
     
@@ -73,21 +73,55 @@ public class FontManager 
      * @return The standard font 
      * 
      */
-    public static java.awt.Font getStandardFont() 
+    public static java.awt.Font getAWTFallbackFont()
     {
-        Font awtFont = getAwtFont(standardFont);
+        Font awtFont = getAwtFont(awtFallback);
         if (awtFont == null)
         {
             // PDFBOX-1069
-            LOG.error("Standard font '" + standardFont + "' is not part of the environment");
+            LOG.error("Standard font '" + awtFallback + "' is not part of the environment");
             LOG.error("Available fonts:");
             for (Font font : GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts())
             {
                 LOG.error("\t" + font.getFontName());
-    }
+            }
         }
         return awtFont;
     }
+
+    /**
+     * Get the standard font from the environment.
+     *
+     * @return standard font
+     */
+    public static TrueTypeFont getTrueTypeFallbackFont() throws IOException
+    {
+        if (ttfFallback == null)
+        {
+            // todo: make this configurable
+
+            // Windows
+            ttfFallback = SystemFontManager.findTTFont("Arial");
+
+            if (ttfFallback == null)
+            {
+                // OS X
+                ttfFallback = SystemFontManager.findTTFont("Helvetica");
+            }
+
+            if (ttfFallback == null)
+            {
+                // Linux
+                ttfFallback = SystemFontManager.findTTFont("Liberation Sans");
+            }
+
+            if (ttfFallback == null)
+            {
+                throw new IOException("Could not find TTF fallback font on the system");
+            }
+        }
+        return ttfFallback;
+    }
     
     /**
      * Get the font for the given fontname.

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java?rev=1606970&r1=1606969&r2=1606970&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java Tue Jul  1 02:57:43 2014
@@ -42,7 +42,7 @@ import org.apache.fontbox.ttf.OS2Windows
 import org.apache.fontbox.ttf.PostScriptTable;
 import org.apache.fontbox.ttf.TTFParser;
 import org.apache.fontbox.ttf.TrueTypeFont;
-import org.apache.fontbox.util.FontManager;
+import org.apache.fontbox.util.SystemFontManager;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.encoding.Encoding;
@@ -379,11 +379,11 @@ public class PDTrueTypeFont extends PDFo
             if (ttf == null)
             {
                 // check if there is a font mapping for an external font file
-                ttf = FontManager.findTTFont(getBaseFont());
+                ttf = SystemFontManager.findTTFont(getBaseFont());
             }
             if (ttf == null)
             {
-                ttf = FontManager.getStandardFont();
+                ttf = PDFFontManager.getTrueTypeFallbackFont();
             }
         }
         return ttf;

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1606970&r1=1606969&r2=1606970&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java Tue Jul  1 02:57:43 2014
@@ -57,7 +57,7 @@ import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDResources;
 import org.apache.pdfbox.pdmodel.common.PDMatrix;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
-import org.apache.pdfbox.pdmodel.font.FontManager;
+import org.apache.pdfbox.pdmodel.font.PDFFontManager;
 import org.apache.pdfbox.pdmodel.font.PDCIDFontType0Font;
 import org.apache.pdfbox.pdmodel.font.PDCIDFontType2Font;
 import org.apache.pdfbox.pdmodel.font.PDFont;
@@ -389,7 +389,7 @@ public class PageDrawer extends PDFStrea
         int textLength = charCodes.length;
         for (int i = 0; i < textLength; i++)
         {
-            COSStream stream = font.getCharStream((char)charCodes[i]);
+            COSStream stream = font.getCharStream((char) charCodes[i]);
             if (stream != null)
             {
                 // save the current graphics state and matrices
@@ -410,7 +410,7 @@ public class PageDrawer extends PDFStrea
             }
             else
             {
-                LOG.debug("drawType3String: stream for character " + (char)charCodes[i] + " not found");
+                LOG.debug("drawType3String: stream for character " + (char) charCodes[i] + " not found");
             }
         }
     }
@@ -480,7 +480,7 @@ public class PageDrawer extends PDFStrea
                         // check if the font is part of our environment
                         if (fd.getFontName() != null)
                         {
-                            awtFont = FontManager.getAwtFont(fd.getFontName());
+                            awtFont = PDFFontManager.getAwtFont(fd.getFontName());
                         }
                         if (awtFont == null)
                         {
@@ -492,7 +492,7 @@ public class PageDrawer extends PDFStrea
                 {
                     // check if the font is part of our environment
                     String baseFont = type1Font.getBaseFont();
-                    awtFont = FontManager.getAwtFont(baseFont);
+                    awtFont = PDFFontManager.getAwtFont(baseFont);
                     if (awtFont == null)
                     {
                         LOG.info("Can't find the specified basefont " + baseFont);
@@ -506,7 +506,7 @@ public class PageDrawer extends PDFStrea
             if (awtFont == null)
             {
                 // Fallback: we can't find anything, so we have to use the standard font
-                awtFont = FontManager.getStandardFont();
+                awtFont = PDFFontManager.getAWTFallbackFont();
                 LOG.info("Using font " + awtFont.getName() + " instead of " + font.getBaseFont());
             }
             awtFonts.put(font, awtFont);

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java?rev=1606970&r1=1606969&r2=1606970&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java Tue Jul  1 02:57:43 2014
@@ -508,7 +508,7 @@ public class PDFStreamEngine
     /**
      * @return Returns the fonts.
      */
-    public Map<String, PDFont> getFonts()
+    public Map<String, PDFont> getFonts() throws IOException
     {
         if (streamResourcesStack.isEmpty())
         {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetTextFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetTextFont.java?rev=1606970&r1=1606969&r2=1606970&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetTextFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetTextFont.java Tue Jul  1 02:57:43 2014
@@ -49,12 +49,7 @@ public class SetTextFont extends Operato
             COSName fontName = (COSName)arguments.get( 0 );
             float fontSize = ((COSNumber)arguments.get( 1 ) ).floatValue();
             context.getGraphicsState().getTextState().setFontSize( fontSize );
-
-            context.getGraphicsState().getTextState().setFont( (PDFont)context.getFonts().get( fontName.getName() ) );
-            if( context.getGraphicsState().getTextState().getFont() == null )
-            {
-                throw new IOException( "Error: Could not find font(" + fontName + ") in map=" + context.getFonts() );
-            }
+            context.getGraphicsState().getTextState().setFont( context.getFonts().get( fontName.getName() ) );
         }
     }
 

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/ResourcesValidationProcess.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/ResourcesValidationProcess.java?rev=1606970&r1=1606969&r2=1606970&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/ResourcesValidationProcess.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/ResourcesValidationProcess.java Tue Jul  1 02:57:43 2014
@@ -26,7 +26,9 @@ import static org.apache.pdfbox.prefligh
 import static org.apache.pdfbox.preflight.PreflightConfiguration.GRAPHIC_PROCESS;
 import static org.apache.pdfbox.preflight.PreflightConfiguration.SHADDING_PATTERN_PROCESS;
 import static org.apache.pdfbox.preflight.PreflightConfiguration.TILING_PATTERN_PROCESS;
+import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_DICTIONARY_INVALID;
 import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_GRAPHIC_INVALID_PATTERN_DEFINITION;
+import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_PDF_PROCESSING_MISSING;
 import static org.apache.pdfbox.preflight.PreflightConstants.TRANPARENCY_DICTIONARY_KEY_EXTGSTATE;
 
 import java.io.IOException;
@@ -88,14 +90,21 @@ public class ResourcesValidationProcess 
      */
     protected void validateFonts(PreflightContext context, PDResources resources) throws ValidationException
     {
-        Map<String, PDFont> mapOfFonts = resources.getFonts();
-        if (mapOfFonts != null)
+        try
         {
-            for (Entry<String, PDFont> entry : mapOfFonts.entrySet())
+            Map<String, PDFont> mapOfFonts = resources.getFonts();
+            if (mapOfFonts != null)
             {
-                ContextHelper.validateElement(context, entry.getValue(), FONT_PROCESS);
+                for (Entry<String, PDFont> entry : mapOfFonts.entrySet())
+                {
+                    ContextHelper.validateElement(context, entry.getValue(), FONT_PROCESS);
+                }
             }
         }
+        catch (IOException e)
+        {
+            context.addValidationError(new ValidationError(ERROR_FONTS_DICTIONARY_INVALID, "Could not read font"));
+        }
     }
 
     /**