Hi,

I guess you targeted the wrong repository. It should have been the trunk
and not the branch.

BR
Andreas Lehmkühler

Am 02.06.2013 16:49, schrieb [email protected]:
Author: leleueri
Date: Sun Jun  2 14:49:47 2013
New Revision: 1488722

URL: http://svn.apache.org/r1488722
Log:
[PDFBox-1617] Fix NullPointer during Type1C font validation

Modified:
     
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java
     
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java
     
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java

Modified: 
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java?rev=1488722&r1=1488721&r2=1488722&view=diff
==============================================================================
--- 
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java
 (original)
+++ 
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java
 Sun Jun  2 14:49:47 2013
@@ -142,8 +142,9 @@ public abstract class FontContainer
       *
       * @param cid
       * @return The Glyph width in 'em' unit.
+     * @throws GlyphException
       */
-    protected abstract float getFontProgramWidth(int cid);
+    protected abstract float getFontProgramWidth(int cid) throws 
GlyphException;

      /**
       * Test if both width are consistent. At the end of this method, the CID 
is marked as valid or invalid.

Modified: 
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java?rev=1488722&r1=1488721&r2=1488722&view=diff
==============================================================================
--- 
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java
 (original)
+++ 
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java
 Sun Jun  2 14:49:47 2013
@@ -25,6 +25,7 @@ import java.util.List;

  import org.apache.pdfbox.pdmodel.font.PDFont;
  import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
+import org.apache.pdfbox.preflight.font.util.GlyphException;

  public class Type0Container extends FontContainer
  {
@@ -37,7 +38,7 @@ public class Type0Container extends Font
      }

      @Override
-    protected float getFontProgramWidth(int cid)
+    protected float getFontProgramWidth(int cid) throws GlyphException
      {
          float width = 0;
          if (this.delegateFontContainer != null)

Modified: 
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java?rev=1488722&r1=1488721&r2=1488722&view=diff
==============================================================================
--- 
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java
 (original)
+++ 
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java
 Sun Jun  2 14:49:47 2013
@@ -27,6 +27,7 @@ import java.util.List;
  import org.apache.fontbox.cff.CFFFont;
  import org.apache.fontbox.cff.CFFFont.Mapping;
  import org.apache.pdfbox.pdmodel.font.PDFont;
+import org.apache.pdfbox.preflight.PreflightConstants;
  import org.apache.pdfbox.preflight.font.util.GlyphException;
  import org.apache.pdfbox.preflight.font.util.Type1;

@@ -52,7 +53,7 @@ public class Type1Container extends Font
      }

      @Override
-    protected float getFontProgramWidth(int cid)
+    protected float getFontProgramWidth(int cid) throws GlyphException
      {
          float widthResult = -1;
          try
@@ -67,41 +68,72 @@ public class Type1Container extends Font
              else
              {
                  /*
-                 * Retrieves the SID with the Character Name in the encoding 
map Need more PDF with a Type1C subfont to
-                 * valid this implementation
+                 * Retrieves the SID with the Character Name in the encoding 
map Need
+                 * more PDF with a Type1C subfont to valid this implementation
+                 */
+                String name = null;
+                if (this.font.getFontEncoding() != null) {
+                    name = this.font.getFontEncoding().getName(cid);
+                }
+
+                int SID = -1;
+
+                /* For each CFF, try to found the SID that correspond to the 
CID.
+                 * Look up by name if the encoding entry is present in the 
PDFont object
+                 * otherwise use the internal encoding map of the font.
                   */
-                String name = this.font.getFontEncoding().getName(cid);
                  for (CFFFont cff : lCFonts)
                  {
-                    int SID = cff.getEncoding().getSID(cid);
-                    for (Mapping m : cff.getMappings())
-                    {
-                        if (m.getName().equals(name))
+                    if (name == null) {
+                        SID = cff.getEncoding().getSID(cid);
+                    } else {
+                        SID = getSIDByCharacterName(name, cff);
+                    }
+
+                    if (SID > 0) {
+                        widthResult = cff.getWidth(SID);
+                        if (widthResult != defaultGlyphWidth)
                          {
-                            SID = m.getSID();
                              break;
                          }
                      }
-                    widthResult = cff.getWidth(SID);
-                    if (widthResult != defaultGlyphWidth)
-                    {
-                        break;
-                    }
+                }
+
+                if (SID < 0)
+                {
+                    throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH_MISSING, cid, 
"Unknown character CID(" + cid+")");
                  }
              }
          }
-        catch (GlyphException e)
-        {
-            widthResult = -1;
-        }
          catch (IOException e)
          {
-            widthResult = -1; // TODO validation exception
+            throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, cid, "Unexpected 
error during the width validtion for the character CID(" + cid+") : " + 
e.getMessage());
          }

          return widthResult;
      }

+    /**
+     * Return the SID of the given character name.
+     *
+     * @param name the character name looked up
+     * @param cff Compact Font Format that represents a sub set of the Type1C 
Font.
+     * @return -1 if the name is missing from the Font encoding map, the SID 
of the character if it is present in the CFF.
+     */
+    private int getSIDByCharacterName(String name, CFFFont cff)
+    {
+        int SID = -1;
+        for (Mapping m : cff.getMappings())
+        {
+            if (m.getName().equals(name))
+            {
+                SID = m.getSID();
+                break;
+            }
+        }
+        return SID;
+    }
+
      public void setType1Font(Type1 type1Font)
      {
          this.type1Font = type1Font;



Reply via email to