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/05/11 23:05:23 UTC

svn commit: r1678825 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font: PDSimpleFont.java PDType3Font.java encoding/DictionaryEncoding.java

Author: jahewson
Date: Mon May 11 21:05:22 2015
New Revision: 1678825

URL: http://svn.apache.org/r1678825
Log:
PDFBOX-2794: Type 3 font Encoding is defined by Differences array

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/DictionaryEncoding.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=1678825&r1=1678824&r2=1678825&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 Mon May 11 21:05:22 2015
@@ -92,7 +92,7 @@ public abstract class PDSimpleFont exten
      *
      * @throws IOException if the font file could not be read
      */
-    protected final void readEncoding() throws IOException
+    protected void readEncoding() throws IOException
     {
         COSBase encoding = dict.getDictionaryObject(COSName.ENCODING);
         if (encoding != null)

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java?rev=1678825&r1=1678824&r2=1678825&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java Mon May 11 21:05:22 2015
@@ -18,7 +18,6 @@ package org.apache.pdfbox.pdmodel.font;
 
 import java.io.IOException;
 import java.io.InputStream;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.fontbox.util.BoundingBox;
@@ -26,9 +25,11 @@ import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSStream;
-import org.apache.pdfbox.pdmodel.font.encoding.Encoding;
 import org.apache.pdfbox.pdmodel.PDResources;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.pdmodel.font.encoding.DictionaryEncoding;
+import org.apache.pdfbox.pdmodel.font.encoding.Encoding;
+import org.apache.pdfbox.pdmodel.font.encoding.GlyphList;
 import org.apache.pdfbox.util.Matrix;
 import org.apache.pdfbox.util.Vector;
 
@@ -63,8 +64,17 @@ public class PDType3Font extends PDSimpl
     }
 
     @Override
+    protected final void readEncoding() throws IOException
+    {
+        COSDictionary encodingDict = (COSDictionary)dict.getDictionaryObject(COSName.ENCODING);
+        encoding = new DictionaryEncoding(encodingDict);
+        glyphList = GlyphList.getZapfDingbats();
+    }
+    
+    @Override
     protected Encoding readEncodingFromFont() throws IOException
     {
+        // Type 3 fonts do not have a built-in encoding
         throw new UnsupportedOperationException("not supported for Type 3 fonts");
     }
 

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/DictionaryEncoding.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/DictionaryEncoding.java?rev=1678825&r1=1678824&r2=1678825&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/DictionaryEncoding.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/DictionaryEncoding.java Mon May 11 21:05:22 2015
@@ -19,9 +19,6 @@ package org.apache.pdfbox.pdmodel.font.e
 
 import java.util.HashMap;
 import java.util.Map;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
@@ -35,8 +32,6 @@ import org.apache.pdfbox.cos.COSNumber;
  */
 public class DictionaryEncoding extends Encoding
 {
-    private static final Log LOG = LogFactory.getLog(DictionaryEncoding.class);
-
     private final COSDictionary encoding;
     private final Encoding baseEncoding;
     private final Map<Integer, String> differences = new HashMap<Integer, String>();
@@ -66,9 +61,23 @@ public class DictionaryEncoding extends
     }
 
     /**
+     * Creates a new DictionaryEncoding for a Type 3 font from a PDF.
+     *
+     * @param fontEncoding The Type 3 encoding dictionary.
+     */
+    public DictionaryEncoding(COSDictionary fontEncoding)
+    {
+        encoding = fontEncoding;
+        baseEncoding = null;
+        applyDifferences();
+    }
+    
+    /**
      * Creates a new DictionaryEncoding from a PDF.
      *
      * @param fontEncoding The encoding dictionary.
+     * @param isNonSymbolic True if the font is non-symbolic. False for Type 3 fonts.
+     * @param builtIn The font's built-in encoding. Null for Type 3 fonts.
      */
     public DictionaryEncoding(COSDictionary fontEncoding, boolean isNonSymbolic, Encoding builtIn)
     {
@@ -97,10 +106,8 @@ public class DictionaryEncoding extends
                 }
                 else
                 {
-                    base = StandardEncoding.INSTANCE;
-                    LOG.warn("Built-in encoding required for symbolic font, using standard encoding");
-                    //FIXME, see PDFBOX-2299, happens with Type3 fonts of the isartor test suite
-                    // throw new IllegalArgumentException("Built-in Encoding required for symbolic font");
+                    throw new IllegalArgumentException("Symbolic fonts must have a built-in " + 
+                                                       "encoding");
                 }
             }
         }
@@ -108,14 +115,18 @@ public class DictionaryEncoding extends
 
         codeToName.putAll( baseEncoding.codeToName );
         names.addAll( baseEncoding.names );
+        applyDifferences();
+    }
 
+    private void applyDifferences()
+    {
         // now replace with the differences
         COSArray differences = (COSArray)encoding.getDictionaryObject( COSName.DIFFERENCES );
         int currentIndex = -1;
         for( int i=0; differences != null && i<differences.size(); i++ )
         {
             COSBase next = differences.getObject( i );
-            if( next instanceof COSNumber )
+            if( next instanceof COSNumber)
             {
                 currentIndex = ((COSNumber)next).intValue();
             }
@@ -130,7 +141,7 @@ public class DictionaryEncoding extends
     }
 
     /**
-     * Returns the base encoding.
+     * Returns the base encoding. Will be null for Type 3 fonts.
      */
     public Encoding getBaseEncoding()
     {