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 2015/04/29 08:36:51 UTC

svn commit: r1676677 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java

Author: jahewson
Date: Wed Apr 29 06:36:51 2015
New Revision: 1676677

URL: http://svn.apache.org/r1676677
Log:
PDFBOX-1900: Fix glyph stretch bug for AFM fonts (again)

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java?rev=1676677&r1=1676676&r2=1676677&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java Wed Apr 29 06:36:51 2015
@@ -90,7 +90,7 @@ public abstract class PDSimpleFont exten
      * Reads the Encoding from the Font dictionary or the embedded or substituted font file.
      * Must be called at the end of any subclass constructors.
      *
-     * @throws IOException if the font file could not be read.
+     * @throws IOException if the font file could not be read
      */
     protected final void readEncoding() throws IOException
     {
@@ -99,11 +99,39 @@ public abstract class PDSimpleFont exten
         {
             if (encoding instanceof COSName)
             {
-                readEncodingFromName((COSName) encoding);
+                COSName encodingName = (COSName)encoding;
+                this.encoding = Encoding.getInstance(encodingName);
+                if (this.encoding == null)
+                {
+                    LOG.warn("Unknown encoding: " + encodingName.getName());
+                    this.encoding = readEncodingFromFont(); // fallback
+                }
             }
             else if (encoding instanceof COSDictionary)
             {
-                readEncodingFromDictionary((COSDictionary) encoding);
+                COSDictionary encodingDict = (COSDictionary)encoding;
+                Encoding builtIn = null;
+                Boolean symbolic = getSymbolicFlag();
+                boolean isFlaggedAsSymbolic = symbolic != null && symbolic;
+                if (!encodingDict.containsKey(COSName.BASE_ENCODING) && isFlaggedAsSymbolic)
+                {
+                    builtIn = readEncodingFromFont();
+                }
+
+                if (symbolic == null)
+                {
+                    symbolic = false;
+                }
+
+                if (builtIn == null && !encodingDict.containsKey(COSName.BASE_ENCODING) && symbolic)
+                {
+                    // TTF built-in encoding is handled by PDTrueTypeFont#codeToGID
+                    this.encoding = null;
+                }
+                else
+                {
+                    this.encoding = new DictionaryEncoding(encodingDict, !symbolic, builtIn);
+                }
             }
         }
         else
@@ -137,41 +165,6 @@ public abstract class PDSimpleFont exten
         }
     }
 
-    private void readEncodingFromDictionary(COSDictionary encodingDict) throws IOException
-    {
-        Encoding builtIn = null;
-        Boolean symbolic = getSymbolicFlag();
-        boolean isFlaggedAsSymbolic = symbolic != null && symbolic;
-        if (!encodingDict.containsKey(COSName.BASE_ENCODING) && isFlaggedAsSymbolic)
-        {
-            builtIn = readEncodingFromFont();
-        }
-        if (symbolic == null)
-        {
-            symbolic = false;
-        }
-        if (builtIn == null && !encodingDict.containsKey(COSName.BASE_ENCODING) && symbolic)
-        {
-            // TTF built-in encoding is handled by PDTrueTypeFont#codeToGID
-            this.encoding = null;
-        }
-        else
-        {
-            this.encoding = new DictionaryEncoding(encodingDict, !symbolic, builtIn);
-        }
-    }
-    
-    private void readEncodingFromName(COSName encodingName) throws IOException
-    {
-        this.encoding = Encoding.getInstance(encodingName);
-        if (this.encoding == null)
-        {
-            LOG.warn("Unknown encoding: " + encodingName.getName());
-            // fallback
-            this.encoding = readEncodingFromFont();
-        }
-    }
-
     /**
      * Called by readEncoding() if the encoding needs to be extracted from the font file.
      *
@@ -206,7 +199,6 @@ public abstract class PDSimpleFont exten
         }
 
         invertedEncoding = new HashMap<String, Integer>();
-        //Map<Integer, String> codeToName = MacOSRomanEncoding.INSTANCE.getCodeToNameMap();
         Map<Integer, String> codeToName = encoding.getCodeToNameMap();
         for (Map.Entry<Integer, String> entry : codeToName.entrySet())
         {
@@ -391,7 +383,6 @@ public abstract class PDSimpleFont exten
      * @param code character code
      * @return width in 1/1000 text space
      */
-    @Override
     protected final float getStandard14Width(int code)
     {
         if (getStandard14AFM() != null)
@@ -419,8 +410,16 @@ public abstract class PDSimpleFont exten
             DictionaryEncoding dictionary = (DictionaryEncoding)getEncoding();
             if (dictionary.getDifferences().size() > 0)
             {
-                // todo: do we need to check if entries actually differ from the base encoding?
-                return false;
+                // we also require that the differences are actually different, see PDFBOX-1900 with
+                // the file from PDFBOX-2192 on Windows
+                Encoding baseEncoding = dictionary.getBaseEncoding();
+                for (Map.Entry<Integer, String> entry : dictionary.getDifferences().entrySet())
+                {
+                    if (!entry.getValue().equals(baseEncoding.getName(entry.getKey())))
+                    {
+                        return false;
+                    }
+                }
             }
         }
         return super.isStandard14();