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/10/09 07:15:26 UTC

svn commit: r1630284 - in /pdfbox/trunk: pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ preflight/src/main/java/org/apache/pdfbox/preflight/content/ preflight/src/main/java/org/apache/pdfbox/preflight/font/ preflight/src/main/java/org/apache/pdfb...

Author: jahewson
Date: Thu Oct  9 05:15:25 2014
New Revision: 1630284

URL: http://svn.apache.org/r1630284
Log:
PDFBOX-2299: Update preflight to use 2.0 font handing
- Removes preflight legacy Type1Parser and associated classes, uses Type 1 parser from FontBox 2.0
- Replaces FontContainer#getFontProgramWidth() with PDFont#getWidthFromFont()
- Removes most of the functionality of FontContainer subclasses, as PDFont and its various subclasses now handle these checks
- Added PDFont#isDamaged() to gain access to PDFBox font parsing status
-Removed preflight FontLike and replaced with PDFontLike from 2.0

Removed:
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/CIDToGIDMap.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/FontLike.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphDescription.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/PeekInputStream.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/Type1.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/Type1Parser.java
Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontLike.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/CIDType2FontValidator.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/DescendantFontValidator.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type1FontValidator.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type3FontValidator.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType0Container.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type3Container.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphDetail.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphException.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/FontValidationProcess.java
    pdfbox/trunk/preflight/src/test/java/org/apache/pdfbox/preflight/TestIsartor.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java Thu Oct  9 05:15:25 2014
@@ -52,6 +52,7 @@ public class PDCIDFontType0 extends PDCI
 
     private final Map<Integer, Float> glyphHeights = new HashMap<Integer, Float>();
     private final boolean isEmbedded;
+    private final boolean isDamaged;
 
     private Float avgWidth = null;
     private Matrix fontMatrix;
@@ -81,7 +82,18 @@ public class PDCIDFontType0 extends PDCI
         {
             // embedded
             CFFParser cffParser = new CFFParser();
-            CFFFont cffFont = cffParser.parse(bytes).get(0);
+            boolean fontIsDamaged = false;
+            CFFFont cffFont = null;
+            try
+            {
+                cffFont = cffParser.parse(bytes).get(0);
+            }
+            catch (IOException e)
+            {
+                LOG.error("Can't read the embedded CFF font " + fd.getFontName(), e);
+                fontIsDamaged = true;
+            }
+
             if (cffFont instanceof CFFCIDFont)
             {
                 cidFont = (CFFCIDFont)cffFont;
@@ -93,6 +105,7 @@ public class PDCIDFontType0 extends PDCI
                 t1Font = (CFFType1Font)cffFont;
             }
             isEmbedded = true;
+            isDamaged = fontIsDamaged;
         }
         else
         {
@@ -135,6 +148,7 @@ public class PDCIDFontType0 extends PDCI
                 }
             }
             isEmbedded = false;
+            isDamaged = false;
         }
         fontMatrixTransform = getFontMatrix().createAffineTransform();
         fontMatrixTransform.scale(1000, 1000);
@@ -261,6 +275,12 @@ public class PDCIDFontType0 extends PDCI
     }
 
     @Override
+    public boolean isDamaged()
+    {
+        return isDamaged;
+    }
+
+    @Override
     public float getHeight(int code) throws IOException
     {
         int cid = codeToCID(code);

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java Thu Oct  9 05:15:25 2014
@@ -52,6 +52,7 @@ public class PDCIDFontType2 extends PDCI
     private final int[] cid2gid;
     private final boolean hasIdentityCid2Gid;
     private final boolean isEmbedded;
+    private final boolean isDamaged;
     private Matrix fontMatrix;
 
     /**
@@ -67,22 +68,25 @@ public class PDCIDFontType2 extends PDCI
         PDStream ff2Stream = fd.getFontFile2();
         PDStream ff3Stream = fd.getFontFile3();
 
+        TrueTypeFont ttfFont = null;
+        boolean fontIsDamaged = false;
         if (ff2Stream != null)
         {
             try
             {
                 // embedded
                 TTFParser ttfParser = new TTFParser(true);
-                ttf = ttfParser.parse(ff2Stream.createInputStream());
-                isEmbedded = true;
+                ttfFont = ttfParser.parse(ff2Stream.createInputStream());
             }
             catch (NullPointerException e) // TTF parser is buggy
             {
-                throw new IOException("Could not read embedded TTF for font " + getBaseFont(), e);
+                LOG.warn("Could not read embedded TTF for font " + getBaseFont(), e);
+                fontIsDamaged = true;
             }
             catch (IOException e)
             {
-                throw new IOException("Could not read embedded TTF for font " + getBaseFont(), e);
+                LOG.warn("Could not read embedded TTF for font " + getBaseFont(), e);
+                fontIsDamaged = true;
             }
         }
         else if (ff3Stream != null)
@@ -92,8 +96,7 @@ public class PDCIDFontType2 extends PDCI
                 // embedded
                 OTFParser otfParser = new OTFParser(true);
                 OpenTypeFont otf = otfParser.parse(ff3Stream.createInputStream());
-                ttf = otf;
-                isEmbedded = true;
+                ttfFont = otf;
 
                 if (otf.isPostScript())
                 {
@@ -110,40 +113,38 @@ public class PDCIDFontType2 extends PDCI
             }
             catch (NullPointerException e) // TTF parser is buggy
             {
-                throw new IOException("Could not read embedded OTF for font " + getBaseFont(), e);
+                fontIsDamaged = true;
+                LOG.warn("Could not read embedded OTF for font " + getBaseFont(), e);
             }
             catch (IOException e)
             {
-                throw new IOException("Could not read embedded OTF for font " + getBaseFont(), e);
+                fontIsDamaged = true;
+                LOG.warn("Could not read embedded OTF for font " + getBaseFont(), e);
             }
         }
-        else
+        isEmbedded = ttfFont != null;
+        isDamaged = fontIsDamaged;
+
+        if (ttfFont == null)
         {
             // substitute
             TrueTypeFont ttfSubstitute = ExternalFonts.getTrueTypeFont(getBaseFont());
             if (ttfSubstitute != null)
             {
-                ttf = ttfSubstitute;
+                ttfFont = ttfSubstitute;
             }
             else
             {
                 // fallback
                 LOG.warn("Using fallback font for " + getBaseFont());
-                ttf = ExternalFonts.getTrueTypeFallbackFont(getFontDescriptor());
+                ttfFont = ExternalFonts.getTrueTypeFallbackFont(getFontDescriptor());
             }
-            isEmbedded = false;
         }
+        ttf = ttfFont;
 
         cid2gid = readCIDToGIDMap();
         COSBase map = dict.getDictionaryObject(COSName.CID_TO_GID_MAP);
-        if (map instanceof COSName && ((COSName) map).getName().equals("Identity"))
-        {
-            hasIdentityCid2Gid = true;
-        }
-        else
-        {
-            hasIdentityCid2Gid = false;
-        }
+        hasIdentityCid2Gid = map instanceof COSName && ((COSName) map).getName().equals("Identity");
     }
 
     @Override
@@ -375,6 +376,12 @@ public class PDCIDFontType2 extends PDCI
         return isEmbedded;
     }
 
+    @Override
+    public boolean isDamaged()
+    {
+        return isDamaged;
+    }
+
     /**
      * Returns the embedded or substituted TrueType font.
      */

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java Thu Oct  9 05:15:25 2014
@@ -518,6 +518,9 @@ public abstract class PDFont implements 
     }
 
     @Override
+    public abstract boolean isDamaged();
+
+    @Override
     public boolean equals(Object other)
     {
         return other instanceof PDFont && ((PDFont) other).getCOSObject() == this.getCOSObject();

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontLike.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontLike.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontLike.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontLike.java Thu Oct  9 05:15:25 2014
@@ -89,6 +89,11 @@ public interface PDFontLike
     public abstract boolean isEmbedded();
 
     /**
+     * Returns true if the embedded font file is damaged.
+     */
+    public abstract boolean isDamaged();
+
+    /**
      * This will get the average font width for all characters.
      *
      * @return The width is in 1000 unit of text space, ie 333 or 777

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=1630284&r1=1630283&r2=1630284&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 Thu Oct  9 05:15:25 2014
@@ -98,6 +98,7 @@ public class PDTrueTypeFont extends PDSi
 
     private final TrueTypeFont ttf;
     private final boolean isEmbedded;
+    private final boolean isDamaged;
 
     /**
      * Creates a new TrueType font from a Font dictionary.
@@ -109,6 +110,7 @@ public class PDTrueTypeFont extends PDSi
         super(fontDictionary);
 
         TrueTypeFont ttfFont = null;
+        boolean fontIsDamaged = false;
         if (getFontDescriptor() != null)
         {
             PDFontDescriptor fd = super.getFontDescriptor();
@@ -123,15 +125,18 @@ public class PDTrueTypeFont extends PDSi
                 }
                 catch (NullPointerException e) // TTF parser is buggy
                 {
-                    throw new IOException("Could not read embedded TTF for font " + getBaseFont(), e);
+                    LOG.warn("Could not read embedded TTF for font " + getBaseFont(), e);
+                    fontIsDamaged = true;
                 }
                 catch (IOException e)
                 {
-                    throw new IOException("Could not read embedded TTF for font " + getBaseFont(), e);
+                    LOG.warn("Could not read embedded TTF for font " + getBaseFont(), e);
+                    fontIsDamaged = true;
                 }
             }
         }
         isEmbedded = ttfFont != null;
+        isDamaged = fontIsDamaged;
 
         // substitute
         if (ttfFont == null)
@@ -174,6 +179,7 @@ public class PDTrueTypeFont extends PDSi
         encoding = embedder.getFontEncoding();
         ttf = embedder.getTrueTypeFont();
         isEmbedded = true;
+        isDamaged = false;
     }
 
     @Override
@@ -194,6 +200,12 @@ public class PDTrueTypeFont extends PDSi
         return ttf.getFontBBox();
     }
 
+    @Override
+    public boolean isDamaged()
+    {
+        return isDamaged;
+    }
+
     /**
      * Returns the embedded or substituted TrueType font.
      */

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java Thu Oct  9 05:15:25 2014
@@ -326,6 +326,12 @@ public class PDType0Font extends PDFont
     }
 
     @Override
+    public boolean isDamaged()
+    {
+        return descendantFont.isDamaged();
+    }
+
+    @Override
     public String toString()
     {
         String descendant = null;

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java Thu Oct  9 05:15:25 2014
@@ -28,6 +28,7 @@ import java.util.Map;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.fontbox.cff.CFFFont;
 import org.apache.fontbox.cff.CFFParser;
 import org.apache.fontbox.cff.CFFType1Font;
 import org.apache.fontbox.ttf.Type1Equivalent;
@@ -60,6 +61,7 @@ public class PDType1CFont extends PDSimp
     private final CFFType1Font cffFont; // embedded font
     private final Type1Equivalent type1Equivalent; // embedded or system font for rendering
     private final boolean isEmbedded;
+    private final boolean isDamaged;
 
     /**
      * Constructor.
@@ -82,9 +84,21 @@ public class PDType1CFont extends PDSimp
             }
         }
 
-        // note: this could be an OpenType file, fortunately CFFParser can handle that
-        CFFParser cffParser = new CFFParser();
-        cffFont = (CFFType1Font)cffParser.parse(bytes).get(0);
+        boolean fontIsDamaged = false;
+        CFFType1Font cffEmbedded = null;
+        try
+        {
+            // note: this could be an OpenType file, fortunately CFFParser can handle that
+            CFFParser cffParser = new CFFParser();
+            cffEmbedded = (CFFType1Font)cffParser.parse(bytes).get(0);
+        }
+        catch (IOException e)
+        {
+            LOG.error("Can't read the embedded Type1C font " + getName(), e);
+            fontIsDamaged = true;
+        }
+        isDamaged = fontIsDamaged;
+        cffFont = cffEmbedded;
 
         if (cffFont != null)
         {
@@ -189,6 +203,12 @@ public class PDType1CFont extends PDSimp
     }
 
     @Override
+    public boolean isDamaged()
+    {
+        return isDamaged;
+    }
+
+    @Override
     public float getWidthFromFont(int code) throws IOException
     {
         if (getStandard14AFM() != null)

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java Thu Oct  9 05:15:25 2014
@@ -84,6 +84,7 @@ public class PDType1Font extends PDSimpl
     private final Type1Font type1font; // embedded font
     private final Type1Equivalent type1Equivalent; // embedded or system font for rendering
     private final boolean isEmbedded;
+    private final boolean isDamaged;
     private Matrix fontMatrix;
 
     /**
@@ -102,6 +103,7 @@ public class PDType1Font extends PDSimpl
         type1font = null;
         type1Equivalent = ExternalFonts.getType1EquivalentFont(getBaseFont());
         isEmbedded = false;
+        isDamaged = false;
     }
 
     /**
@@ -119,6 +121,7 @@ public class PDType1Font extends PDSimpl
         type1font = embedder.getType1Font();
         type1Equivalent = embedder.getType1Font();
         isEmbedded = true;
+        isDamaged = false;
     }
 
     /**
@@ -132,6 +135,7 @@ public class PDType1Font extends PDSimpl
 
         PDFontDescriptor fd = getFontDescriptor();
         Type1Font t1 = null;
+        boolean fontIsDamaged = false;
         if (fd != null)
         {
             // a Type1 font may contain a Type1C font
@@ -164,14 +168,17 @@ public class PDType1Font extends PDSimpl
                 catch (DamagedFontException e)
                 {
                     LOG.warn("Can't read damaged embedded Type1 font " + fd.getFontName());
+                    fontIsDamaged = true;
                 }
                 catch (IOException e)
                 {
                     LOG.error("Can't read the embedded Type1 font " + fd.getFontName(), e);
+                    fontIsDamaged = true;
                 }
             }
         }
         isEmbedded = t1 != null;
+        isDamaged = fontIsDamaged;
 
         // try to find a suitable .pfb font to substitute
         if (t1 == null)
@@ -431,4 +438,10 @@ public class PDType1Font extends PDSimpl
         }
         return fontMatrix;
     }
+
+    @Override
+    public boolean isDamaged()
+    {
+        return isDamaged;
+    }
 }

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=1630284&r1=1630283&r2=1630284&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 Thu Oct  9 05:15:25 2014
@@ -178,6 +178,13 @@ public class PDType3Font extends PDSimpl
         return fontMatrix;
     }
 
+    @Override
+    public boolean isDamaged()
+    {
+        // there's no font file to load
+        return false;
+    }
+
     /**
      * Returns the optional resources of the type3 stream.
      *

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java Thu Oct  9 05:15:25 2014
@@ -324,7 +324,7 @@ public class PreflightContentStream exte
         else if (!fontContainer.isValid() && !fontContainer.errorsAleadyMerged())
         {
             context.addValidationErrors(fontContainer.getAllErrors());
-            fontContainer.setErrorsAleadyMerged(true);
+            fontContainer.setErrorsAlreadyMerged(true);
             return;
         }
         if (!fontContainer.isValid() && fontContainer.errorsAleadyMerged())

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/CIDType2FontValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/CIDType2FontValidator.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/CIDType2FontValidator.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/CIDType2FontValidator.java Thu Oct  9 05:15:25 2014
@@ -26,11 +26,9 @@ import org.apache.pdfbox.pdmodel.font.PD
 import org.apache.pdfbox.preflight.PreflightContext;
 import org.apache.pdfbox.preflight.font.container.CIDType2Container;
 import org.apache.pdfbox.preflight.font.descriptor.CIDType2DescriptorHelper;
-import org.apache.pdfbox.preflight.font.util.CIDToGIDMap;
 
 public class CIDType2FontValidator extends DescendantFontValidator<CIDType2Container>
 {
-
     public CIDType2FontValidator(PreflightContext context, PDCIDFontType2 font)
     {
         super(context, font, new CIDType2Container(font));
@@ -39,8 +37,7 @@ public class CIDType2FontValidator exten
     @Override
     protected void checkCIDToGIDMap(COSBase ctog)
     {
-        CIDToGIDMap cidToGid = checkCIDToGIDMap(ctog, true);
-        this.fontContainer.setCidToGid(cidToGid);
+        checkCIDToGIDMap(ctog, true);
     }
 
     @Override
@@ -48,5 +45,4 @@ public class CIDType2FontValidator exten
     {
         this.descriptorHelper = new CIDType2DescriptorHelper(context, font, fontContainer);
     }
-
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/DescendantFontValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/DescendantFontValidator.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/DescendantFontValidator.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/DescendantFontValidator.java Thu Oct  9 05:15:25 2014
@@ -26,8 +26,11 @@ import static org.apache.pdfbox.prefligh
 import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_DICTIONARY_INVALID;
 import static org.apache.pdfbox.preflight.PreflightConstants.FONT_DICTIONARY_VALUE_CMAP_IDENTITY;
 
+
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
+import java.io.InputStream;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSDocument;
@@ -37,7 +40,6 @@ import org.apache.pdfbox.pdmodel.font.PD
 import org.apache.pdfbox.preflight.PreflightContext;
 import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
 import org.apache.pdfbox.preflight.font.container.FontContainer;
-import org.apache.pdfbox.preflight.font.util.CIDToGIDMap;
 import org.apache.pdfbox.preflight.utils.COSUtils;
 
 public abstract class DescendantFontValidator<T extends FontContainer> extends SimpleFontValidator<T>
@@ -123,10 +125,8 @@ public abstract class DescendantFontVali
      * @param mandatory true for CIDType2 , false for CIDType0
      * @return
      */
-    protected CIDToGIDMap checkCIDToGIDMap(COSBase ctog, boolean mandatory)
+    protected void checkCIDToGIDMap(COSBase ctog, boolean mandatory)
     {
-        CIDToGIDMap cidToGidMap = null;
-
         if (COSUtils.isString(ctog, cosDocument))
         {
             // ---- valid only if the string is Identity
@@ -141,9 +141,12 @@ public abstract class DescendantFontVali
         {
             try
             {
-                COSStream ctogMap = COSUtils.getAsStream(ctog, cosDocument);
-                cidToGidMap = new CIDToGIDMap();
-                cidToGidMap.parseStream(ctogMap);
+                COSStream stream = COSUtils.getAsStream(ctog, cosDocument);
+
+                // todo: check the map's content? (won't pdfbox do this?)
+                InputStream is = stream.getUnfilteredStream();
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                byte[] map = os.toByteArray();
             }
             catch (IOException e)
             {
@@ -155,6 +158,5 @@ public abstract class DescendantFontVali
         {
             this.fontContainer.push(new ValidationError(ERROR_FONTS_CIDKEYED_CIDTOGID));
         }
-        return cidToGidMap;
     }
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type1FontValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type1FontValidator.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type1FontValidator.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type1FontValidator.java Thu Oct  9 05:15:25 2014
@@ -33,6 +33,7 @@ import org.apache.pdfbox.cos.COSDictiona
 import org.apache.pdfbox.cos.COSDocument;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.pdmodel.font.PDSimpleFont;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
 import org.apache.pdfbox.preflight.PreflightContext;
 import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
 import org.apache.pdfbox.preflight.font.container.Type1Container;
@@ -42,7 +43,7 @@ import org.apache.pdfbox.preflight.utils
 public class Type1FontValidator extends SimpleFontValidator<Type1Container>
 {
 
-    public Type1FontValidator(PreflightContext context, PDSimpleFont font)
+    public Type1FontValidator(PreflightContext context, PDType1Font font)
     {
         super(context, font, font.getCOSObject(), new Type1Container(font));
     }
@@ -50,7 +51,7 @@ public class Type1FontValidator extends 
     @Override
     protected void createFontDescriptorHelper()
     {
-        this.descriptorHelper = new Type1DescriptorHelper(context, (PDSimpleFont) font, fontContainer);
+        this.descriptorHelper = new Type1DescriptorHelper(context, (PDType1Font) font, fontContainer);
     }
 
     @Override

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type3FontValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type3FontValidator.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type3FontValidator.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type3FontValidator.java Thu Oct  9 05:15:25 2014
@@ -307,13 +307,13 @@ public class Type3FontValidator extends 
                     if (width == fontProgamWidth)
                     {
                         // Glyph is OK, we keep the CID.
-                        this.fontContainer.markCIDAsValid(cid);
+                        this.fontContainer.markAsValid(cid);
                     }
                     else
                     {
                         GlyphException glyphEx = new GlyphException(ERROR_FONTS_METRICS, cid,
                                 "The character with CID\"" + cid + "\" should have a width equals to " + width);
-                        this.fontContainer.markCIDAsInvalid(cid, glyphEx);
+                        this.fontContainer.markAsInvalid(cid, glyphEx);
                     }
                 }
                 catch (ContentStreamException e)
@@ -374,7 +374,7 @@ public class Type3FontValidator extends 
              */
             GlyphException glyphEx = new GlyphException(ERROR_FONTS_METRICS, cid, "The CharProcs \"" + charName
                     + "\" doesn't exist");
-            this.fontContainer.markCIDAsInvalid(cid, glyphEx);
+            this.fontContainer.markAsInvalid(cid, glyphEx);
         }
         return charStream;
     }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType0Container.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType0Container.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType0Container.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType0Container.java Thu Oct  9 05:15:25 2014
@@ -22,41 +22,18 @@
 package org.apache.pdfbox.preflight.font.container;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.fontbox.cff.CFFCIDFont;
-import org.apache.fontbox.cff.CFFFont;
 import org.apache.pdfbox.pdmodel.font.PDCIDFontType0;
-import org.apache.pdfbox.preflight.font.util.FontLike;
 
-public class CIDType0Container extends FontContainer
+public class CIDType0Container extends FontContainer<PDCIDFontType0>
 {
-    protected List<CFFFont> lCFonts = new ArrayList<CFFFont>();
-
     public CIDType0Container(PDCIDFontType0 font)
     {
-        super(new FontLike(font));
+        super(font);
     }
 
     @Override
-    protected float getFontProgramWidth(int cid)
-    {
-        CFFCIDFont cffFont = (CFFCIDFont)lCFonts.get(0);
-        try
-        {
-            // fixme: this does not take into account the PDF's CMap or the FontDescriptor's default width
-            return cffFont.getType2CharString(cid).getWidth();
-        }
-        catch (IOException e)
-        {
-            return -1;
-        }
-    }
-
-    public void setlCFonts(List<CFFFont> lCFonts)
+    public boolean hasGlyph(int code) throws IOException
     {
-        this.lCFonts = lCFonts;
+        return font.codeToGID(code) != 0;
     }
-
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java Thu Oct  9 05:15:25 2014
@@ -21,87 +21,19 @@
 
 package org.apache.pdfbox.preflight.font.container;
 
-import org.apache.fontbox.ttf.TrueTypeFont;
-import org.apache.pdfbox.pdmodel.font.PDCIDFontType2;
-import org.apache.pdfbox.preflight.PreflightConstants;
-import org.apache.pdfbox.preflight.font.util.CIDToGIDMap;
-import org.apache.pdfbox.preflight.font.util.FontLike;
-import org.apache.pdfbox.preflight.font.util.GlyphException;
-
 import java.io.IOException;
+import org.apache.pdfbox.pdmodel.font.PDCIDFontType2;
 
-public class CIDType2Container extends FontContainer
+public class CIDType2Container extends FontContainer<PDCIDFontType2>
 {
-    protected CIDToGIDMap cidToGid = null;
-    protected TrueTypeFont ttf = null;
-
     public CIDType2Container(PDCIDFontType2 font)
     {
-        super(new FontLike(font));
+        super(font);
     }
 
     @Override
-    protected float getFontProgramWidth(int cid) throws GlyphException
-    {
-        float foundWidth = -1;
-        final int glyphIndex = getGlyphIndex(cid);
-
-        try
-        {
-            // if glyph exists we can check the width
-            if (this.ttf != null && this.ttf.getMaximumProfile().getNumGlyphs() > glyphIndex)
-            {
-            /*
-             * In a Mono space font program, the length of the AdvanceWidth array must be one. According to the TrueType
-             * font specification, the Last Value of the AdvanceWidth array is apply to the subsequent glyphs. So if the
-             * GlyphId is greater than the length of the array the last entry is used.
-             */
-                int numberOfLongHorMetrics = ttf.getHorizontalHeader().getNumberOfHMetrics();
-                int unitsPerEm = ttf.getHeader().getUnitsPerEm();
-                int[] advanceGlyphWidths = ttf.getHorizontalMetrics().getAdvanceWidth();
-                float glypdWidth = advanceGlyphWidths[numberOfLongHorMetrics - 1];
-                if (glyphIndex < numberOfLongHorMetrics)
-                {
-                    glypdWidth = advanceGlyphWidths[glyphIndex];
-                }
-                foundWidth = ((glypdWidth * 1000) / unitsPerEm);
-            }
-            return foundWidth;
-        }
-        catch (IOException e)
-        {
-            throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, cid, "Unexpected error during the width validation for the character CID(" + cid+") : " + e.getMessage());
-        }
-    }
-
-    /**
-     * If CIDToGID map is Identity, the GID equals to the CID. Otherwise the conversion is done by the CIDToGID map
-     * 
-     * @param cid
-     * @return -1 CID doesn't match with a GID
-     */
-    private int getGlyphIndex(int cid)
+    public boolean hasGlyph(int code) throws IOException
     {
-        int glyphIndex = cid;
-        if (this.cidToGid != null)
-        {
-            glyphIndex = cidToGid.getGID(cid);
-            if (glyphIndex == cidToGid.NOTDEF_GLYPH_INDEX)
-            {
-                glyphIndex = -14;
-            }
-        }
-        return glyphIndex;
+        return font.codeToGID(code) != 0;
     }
-
-    public void setCidToGid(CIDToGIDMap cidToGid)
-    {
-        this.cidToGid = cidToGid;
-    }
-
-    public void setTtf(TrueTypeFont ttf)
-    {
-        this.ttf = ttf;
-    }
-
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java Thu Oct  9 05:15:25 2014
@@ -27,40 +27,34 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.pdfbox.pdmodel.font.PDFont;
+import org.apache.pdfbox.pdmodel.font.PDFontLike;
 import org.apache.pdfbox.preflight.PreflightConstants;
 import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
-import org.apache.pdfbox.preflight.font.util.FontLike;
 import org.apache.pdfbox.preflight.font.util.GlyphDetail;
 import org.apache.pdfbox.preflight.font.util.GlyphException;
 
-public abstract class FontContainer
+public abstract class FontContainer<T extends PDFontLike>
 {
     /**
      * List of validation errors that occur during the font validation. If the font is used by an object in the PDF, all
      * these errors will be appended to the Error list of the PreflightContext.
      */
     protected List<ValidationError> errorBuffer = new ArrayList<ValidationError>();
+
     /**
      * Boolean used to known if the font is embedded.
      */
     protected boolean embeddedFont = true;
 
+    private final Map<Integer, GlyphDetail> codeToDetail = new HashMap<Integer, GlyphDetail>();
+    private boolean errorsAlreadyMerged = false;
+
     /**
-     * Link CID to an Object that contain information about the Glyph state (Valid or no)
+     * Font-like object.
      */
-    protected Map<Integer, GlyphDetail> computedCid = new HashMap<Integer, GlyphDetail>();
-
-    protected boolean errorsAleadyMerged = false;
-
-    protected FontLike font;
-
-    public FontContainer(PDFont font)
-    {
-        this.font = new FontLike(font);
-    }
+    protected final T font;
 
-    public FontContainer(FontLike font)
+    public FontContainer(T font)
     {
         this.font = font;
     }
@@ -82,17 +76,17 @@ public abstract class FontContainer
 
     public boolean isValid()
     {
-        return (this.errorBuffer.isEmpty() && isEmbeddedFont());
+        return this.errorBuffer.isEmpty() && isEmbeddedFont();
     }
 
     public boolean errorsAleadyMerged()
     {
-        return errorsAleadyMerged;
+        return errorsAlreadyMerged;
     }
 
-    public void setErrorsAleadyMerged(boolean errorsAleadyMerged)
+    public void setErrorsAlreadyMerged(boolean errorsAlreadyMerged)
     {
-        this.errorsAleadyMerged = errorsAleadyMerged;
+        this.errorsAlreadyMerged = errorsAlreadyMerged;
     }
 
     public boolean isEmbeddedFont()
@@ -106,98 +100,100 @@ public abstract class FontContainer
     }
 
     /**
-     * 
-     * @param cid todo: not a CID, this is actually a char code!
+     * Check that the Width or W entry in the PDF matches the widths in the embedded font program.
+     *
+     * @param code character code
      * @throws GlyphException
      */
-    public void checkGlyphWidth(int cid) throws GlyphException
+    public void checkGlyphWidth(int code) throws GlyphException
     {
-        if (isAlreadyComputedCid(cid))
+        if (isAlreadyProcessed(code))
         {
             return;
         }
+
         try
         {
-            final float expectedWidth = this.font.getWidth(cid);
-            final float foundWidth = getFontProgramWidth(cid);
-            checkWidthsConsistency(cid, expectedWidth, foundWidth);
+            // check for missing glyphs
+            if (!hasGlyph(code))
+            {
+                GlyphException e = new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH_MISSING, code, "The character \""
+                        + code + "\" in the font program \"" + font.getName()
+                        + "\" is missing from the Character Encoding.");
+                markAsInvalid(code, e);
+                throw e;
+            }
+
+            // check widths
+            float expectedWidth = font.getWidth(code);
+            float foundWidth = font.getWidthFromFont(code);
+            checkWidthsConsistency(code, expectedWidth, foundWidth);
         }
         catch (IOException e)
         {
-            throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, cid, "Unexpected error during the width validation for the character CID(" + cid+") : " + e.getMessage());
+            throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, code,
+                    "Unexpected error during the width validation for the character code " + code +
+                    " : " + e.getMessage());
         }
     }
 
     /**
-     * Check if the given CID is already computed
+     * Checks if the embedded font contains a glyph for the given character code.
+     *
+     * @param code character code
+     */
+    protected abstract boolean hasGlyph(int code) throws IOException;
+
+    /**
+     * Check if the given character code has already been processed.
      * 
-     * @param cid
-     *            the CID to check
+     * @param code character code
      * @return true if the CID has previously been marked as valid, false otherwise
-     * @throws GlyphException
-     *             if the CID has previously been marked as invalid // TODO useful ??
+     * @throws GlyphException if the code has previously been marked as invalid // TODO useful ??
      */
-    protected boolean isAlreadyComputedCid(int cid) throws GlyphException
+    private boolean isAlreadyProcessed(int code) throws GlyphException
     {
         boolean already = false;
-        GlyphDetail gdetail = this.computedCid.get(cid);
-        if (gdetail != null)
+        GlyphDetail detail = codeToDetail.get(code);
+        if (detail != null)
         {
-            gdetail.throwExceptionIfNotValid();
+            detail.throwExceptionIfNotValid();
             already = true;
         }
         return already;
     }
 
     /**
-     * Extract the Glyph width for the given CID.
-     * 
-     * @param cid
-     * @return The Glyph width in 'em' unit.
-     * @throws GlyphException 
-     */
-    protected abstract float getFontProgramWidth(int cid) throws GlyphException;
-
-    /**
      * Test if both widths are consistent. At the end of this method, the CID is
      * marked as valid or invalid.
      *
-     * @param cid
-     * @param expectedWidth
+     * @param code character code
+     * @param expectedWidth expected with given in the PDF file
      * @param foundWidth the glyph width found in the font program, a negative
      * value if the CID is missing from the font.
      * @throws GlyphException the appropriate exception if the CID is invalid.
      */
-    protected void checkWidthsConsistency(int cid, float expectedWidth, float foundWidth) throws GlyphException
+    private void checkWidthsConsistency(int code, float expectedWidth, float foundWidth) throws GlyphException
     {
-        if (foundWidth < 0)
-        {
-            GlyphException e = new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH_MISSING, cid, "The character \""
-                    + cid + "\" in the font program \"" + this.font.getBaseFont()
-                    + "\" is missing from the Charater Encoding.");
-            markCIDAsInvalid(cid, e);
-            throw e;
-        }
-
         // consistent is defined to be a difference of no more than 1/1000 unit.
         if (Math.abs(foundWidth - expectedWidth) > 1)
         {
-            GlyphException e = new GlyphException(PreflightConstants.ERROR_FONTS_METRICS, cid,
-                    "Width (" + foundWidth + ") of the character \"" + cid + "\" in the font program \"" + this.font.getBaseFont()
+            GlyphException e = new GlyphException(PreflightConstants.ERROR_FONTS_METRICS, code,
+                    "Width (" + foundWidth + ") of the character \"" + code + "\" in the font program \"" + this.font.getName()
                             + "\" is inconsistent with the width (" + expectedWidth + ") in the PDF dictionary.");
-            markCIDAsInvalid(cid, e);
+            markAsInvalid(code, e);
             throw e;
         }
-        markCIDAsValid(cid);
+        markAsValid(code);
     }
 
-    public final void markCIDAsValid(int cid)
+    public final void markAsValid(int code)
     {
-        this.computedCid.put(cid, new GlyphDetail(cid));
+        this.codeToDetail.put(code, new GlyphDetail(code));
     }
 
-    public final void markCIDAsInvalid(int cid, GlyphException gex)
+    public final void markAsInvalid(int code, GlyphException e)
     {
-        this.computedCid.put(cid, new GlyphDetail(cid, gex));
+        this.codeToDetail.put(code, new GlyphDetail(code, e));
     }
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java Thu Oct  9 05:15:25 2014
@@ -22,191 +22,23 @@
 package org.apache.pdfbox.preflight.font.container;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.fontbox.ttf.CmapSubtable;
-import org.apache.fontbox.ttf.CmapTable;
-import org.apache.fontbox.ttf.TrueTypeFont;
-import org.apache.pdfbox.pdmodel.font.encoding.Encoding;
-import org.apache.pdfbox.pdmodel.font.encoding.GlyphList;
 import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
-import org.apache.pdfbox.preflight.PreflightConstants;
-import org.apache.pdfbox.preflight.font.util.GlyphException;
 
-public class TrueTypeContainer extends FontContainer
+public class TrueTypeContainer extends FontContainer<PDTrueTypeFont>
 {
-    protected TrueTypeFont ttFont;
-    private CmapSubtable[] cmapEncodingEntries = null;
-    private PDTrueTypeFont trueTypeFont;
-
     public TrueTypeContainer(PDTrueTypeFont font)
     {
         super(font);
-        this.trueTypeFont = font;
-    }
-
-    public void setTrueTypeFont(TrueTypeFont ttFont)
-    {
-        this.ttFont = ttFont;
-        initCMapEncodingEntries(); // TODO appel sur le checkWidth
-    }
-
-    /**
-     * Initialize the {@linkplain #cmapEncodingEntries} with CMaps that belong to the TrueType Font Program.
-     * 
-     * Here the selection rules :
-     * <UL>
-     * <li>For a Symbolic TrueType, the Font Program has only one CMap (Checked in the checkFontFileElement method)
-     * <li>For a Non-Symbolic TrueType, the list of CMap is reordered to provide WinAnsi CMap first (plateformId : 3 /
-     * encodingId : 1) followed by MacRoman CMap (plateformId : 1 / encodingId : 0). This CMap returns the CMap which
-     * corresponds to the Encoding value of the FontDescriptor dictionary.
-     * </UL>
-     */
-    protected void initCMapEncodingEntries()
-    {
-        if (this.cmapEncodingEntries != null)
-            return;
-
-        try
-        {
-            CmapTable cmap = this.ttFont.getCmap();
-            if (this.trueTypeFont.getFontDescriptor().isSymbolic())
-            {
-                this.cmapEncodingEntries = cmap.getCmaps();
-            }
-            else
-            {
-                this.cmapEncodingEntries = orderCMapEntries(cmap);
-            }
-        }
-        catch (IOException e)
-        {
-            return;
-        }
-    }
-
-    private CmapSubtable[] orderCMapEntries(CmapTable cmap)
-    {
-        List<CmapSubtable> res = new ArrayList<CmapSubtable>();
-        boolean firstIs31 = false;
-        for (CmapSubtable cmapEntry : cmap.getCmaps())
-        {
-            // WinAnsi
-            if ((cmapEntry.getPlatformId() == 3) && (cmapEntry.getPlatformEncodingId() == 1))
-            {
-                res.add(0, cmapEntry);
-                firstIs31 = true;
-            }
-            else if ((cmapEntry.getPlatformId() == 1) && (cmapEntry.getPlatformEncodingId() == 0))
-            {
-                // MacRoman
-                if (firstIs31)
-                {
-                    // WinAnsi is present, MacRoman is set in second position
-                    res.add(1, cmapEntry);
-                }
-                else
-                {
-                    // WinAnsi is missing, MacRoman has the priority
-                    res.add(0, cmapEntry);
-                }
-            }
-            else
-            {
-                res.add(cmapEntry);
-            }
-        }
-        return res.toArray(new CmapSubtable[res.size()]);
     }
 
     @Override
-    protected float getFontProgramWidth(int cid) throws GlyphException
-    {
-        try
-        {
-            float result = -1f;
-            if (cmapEncodingEntries != null)
-            {
-                for (CmapSubtable entry : cmapEncodingEntries)
-                {
-                    int glyphID = extractGlyphID(cid, entry);
-                    if (glyphID > 0)
-                    {
-                        result = extractGlyphWidth(glyphID);
-                        break;
-                    }
-                }
-            }
-            return result;
-        }
-        catch (IOException e)
-        {
-            throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, cid, "Unexpected error during the width validation for the character CID(" + cid+") : " + e.getMessage());
-        }
-    }
-
-    /**
-     * TrueType has internal CMap that map the CID used in the PDF file with an internal character identifier. This
-     * method converts the given CID in the internal font program identifier. (0 if no match found)
-     * 
-     * @param cid
-     * @param cmap
-     * @return
-     */
-    private int extractGlyphID(int cid, CmapSubtable cmap)
-    {
-        int notFoundGlyphID = 0;
-
-        int innerFontCid = cid;
-        if (cmap.getPlatformEncodingId() == 1 && cmap.getPlatformId() == 3)
-        {
-            Encoding fontEncoding = this.trueTypeFont.getEncoding();
-            String name = fontEncoding.getName(cid);
-            String character = GlyphList.getAdobeGlyphList().toUnicode(name);
-            if (character == null)
-            {
-                return notFoundGlyphID;
-            }
-
-            char[] characterArray = character.toCharArray();
-            if (characterArray.length == 1)
-            {
-                innerFontCid = (int) characterArray[0];
-            }
-            else
-            {
-                // TODO OD-PDFA-87 A faire?
-                innerFontCid = (int) characterArray[0];
-                for (int i = 1; i < characterArray.length; ++i)
-                {
-                    if (cmap.getGlyphId((int) characterArray[i]) == 0)
-                    {
-                        return notFoundGlyphID; // TODO what we have to do here ???
-                    }
-                }
-            }
-        }
-
-        // search glyph
-        return cmap.getGlyphId(innerFontCid);
-    }
-
-    private float extractGlyphWidth(int glyphID) throws IOException
+    public boolean hasGlyph(int code) throws IOException
     {
-        int unitsPerEm = this.ttFont.getHeader().getUnitsPerEm();
-        int[] glyphWidths = this.ttFont.getHorizontalMetrics().getAdvanceWidth();
-        /*
-         * In a Mono space font program, the length of the AdvanceWidth array must be one. According to the TrueType
-         * font specification, the Last Value of the AdvanceWidth array is apply to the subsequent glyphs. So if the
-         * GlyphId is greater than the length of the array the last entry is used.
-         */
-        int numberOfLongHorMetrics = this.ttFont.getHorizontalHeader().getNumberOfHMetrics();
-        float glypdWidth = glyphWidths[numberOfLongHorMetrics - 1];
-        if (glyphID < numberOfLongHorMetrics)
+        if (font.isEmbedded())
         {
-            glypdWidth = glyphWidths[glyphID];
+            int gid = font.codeToGID(code);
+            return gid != 0;
         }
-        return ((glypdWidth * 1000) / unitsPerEm);
+        return false;
     }
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java Thu Oct  9 05:15:25 2014
@@ -21,33 +21,21 @@
 
 package org.apache.pdfbox.preflight.font.container;
 
+import java.io.IOException;
 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
 {
-
-    protected FontContainer delegateFontContainer;
+    private FontContainer delegateFontContainer;
 
     public Type0Container(PDFont font)
     {
         super(font);
     }
 
-    @Override
-    protected float getFontProgramWidth(int cid) throws GlyphException
-    {
-        float width = 0;
-        if (this.delegateFontContainer != null)
-        {
-            width = this.delegateFontContainer.getFontProgramWidth(cid);
-        }
-        return width;
-    }
-
     public void setDelegateFontContainer(FontContainer delegateFontContainer)
     {
         this.delegateFontContainer = delegateFontContainer;
@@ -81,4 +69,10 @@ public class Type0Container extends Font
         }
         return result;
     }
+
+    @Override
+    public boolean hasGlyph(int code) throws IOException
+    {
+        return this.delegateFontContainer.hasGlyph(code);
+    }
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java Thu Oct  9 05:15:25 2014
@@ -22,89 +22,23 @@
 package org.apache.pdfbox.preflight.font.container;
 
 import java.io.IOException;
-import java.util.List;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
 
-import org.apache.fontbox.cff.CFFFont;
-import org.apache.fontbox.cff.CFFType1Font;
-import org.apache.pdfbox.pdmodel.font.PDSimpleFont;
-import org.apache.pdfbox.preflight.PreflightConstants;
-import org.apache.pdfbox.preflight.font.util.GlyphException;
-import org.apache.pdfbox.preflight.font.util.Type1;
-
-public class Type1Container extends FontContainer
+public class Type1Container extends FontContainer<PDType1Font>
 {
-    /**
-     * Represent the missingWidth value of the FontDescriptor dictionary. According to the PDF Reference, if this value
-     * is missing, the default one is 0.
-     */
-    private float defaultGlyphWidth = 0;
-
-    /**
-     * true if information come from the FontFile1 Stream, false if they come from the FontFile3
-     */
-    protected boolean isFontFile1 = true;
-
-    protected Type1 type1Font;
-    protected List<CFFFont> lCFonts;
-
-    private PDSimpleFont simpleFont;
-
-    public Type1Container(PDSimpleFont font)
+    public Type1Container(PDType1Font font)
     {
         super(font);
-        this.simpleFont = font;
     }
 
     @Override
-    protected float getFontProgramWidth(int cid) throws GlyphException
+    public boolean hasGlyph(int code) throws IOException
     {
-        // fixme: Type 1 fonts don't use CIDs, so this method makes little sense,
-        //        when making changes I've assumed that "cid" is actually the character code
-        //        from the PDF content stream.
-
-        float widthResult = -1;
-        try
+        if (font.isEmbedded())
         {
-            if (isFontFile1)
-            {
-                if (type1Font != null)
-                {
-                    widthResult = this.type1Font.getWidthOfCID(cid);
-                }
-            }
-            else
-            {
-                // assuming that "cid" is actually the character code
-                String name = simpleFont.getEncoding().getName(cid);
-                if (name.equals(".notdef"))
-                {
-                    throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH_MISSING, cid, "Unknown character CID(" + cid+")");
-                }
-
-                CFFType1Font cffFont = (CFFType1Font)lCFonts.get(0);
-                widthResult = cffFont.getType1CharString(name).getWidth();
-            }
+            String name = font.codeToName(code);
+            return font.getType1Font().hasGlyph(name);
         }
-        catch (IOException e)
-        {
-            throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, cid, "Unexpected error during the width validation for the character CID(" + cid+") : " + e.getMessage());
-        }
-
-        return widthResult;
-    }
-
-    public void setType1Font(Type1 type1Font)
-    {
-        this.type1Font = type1Font;
-    }
-
-    public void setFontFile1(boolean isFontFile1)
-    {
-        this.isFontFile1 = isFontFile1;
-    }
-
-    public void setCFFFontObjects(List<CFFFont> lCFonts)
-    {
-        this.lCFonts = lCFonts;
+        return false;
     }
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type3Container.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type3Container.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type3Container.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type3Container.java Thu Oct  9 05:15:25 2014
@@ -21,24 +21,23 @@
 
 package org.apache.pdfbox.preflight.font.container;
 
-import org.apache.pdfbox.pdmodel.font.PDFont;
+import java.io.IOException;
+import org.apache.pdfbox.pdmodel.font.PDType3Font;
 
 /**
  * Because Type3 font program is an inner type of the PDF file, this font container is quite different from the other
  * because all character/glyph are already checked.
  */
-public class Type3Container extends FontContainer
+public class Type3Container extends FontContainer<PDType3Font>
 {
-
-    public Type3Container(PDFont font)
+    public Type3Container(PDType3Font font)
     {
         super(font);
     }
 
     @Override
-    protected float getFontProgramWidth(int cid)
+    public boolean hasGlyph(int code) throws IOException
     {
-        return 0;
+        return font.getCharStream(code) != null;
     }
-
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java Thu Oct  9 05:15:25 2014
@@ -49,7 +49,6 @@ import org.apache.pdfbox.preflight.utils
 
 public class CIDType0DescriptorHelper extends FontDescriptorHelper<CIDType0Container>
 {
-
     public CIDType0DescriptorHelper(PreflightContext context, PDFontLike font, CIDType0Container fontContainer)
     {
         super(context, font, fontContainer);
@@ -61,9 +60,7 @@ public class CIDType0DescriptorHelper ex
         PDStream ff3 = fontDescriptor.getFontFile3();
         if (ff3 != null)
         {
-            /*
-             * Stream validation should be done by the StreamValidateHelper. Process font specific check
-             */
+            // Stream validation should be done by the StreamValidateHelper. Process font specific check
             COSStream stream = ff3.getStream();
             if (stream == null)
             {
@@ -73,10 +70,8 @@ public class CIDType0DescriptorHelper ex
             }
             else
             {
-                /*
-                 * Lengthx aren't mandatory for this type of font But the Subtype is a mandatory field with specific
-                 * values
-                 */
+                // Length1/2/3 aren't mandatory for this type of font
+                // But the Subtype is a mandatory field with specific values
                 String st = stream.getNameAsString(COSName.SUBTYPE);
                 if (!(FONT_DICTIONARY_VALUE_TYPE0C.equals(st) || FONT_DICTIONARY_VALUE_TYPE1C.equals(st)))
                 {
@@ -113,23 +108,9 @@ public class CIDType0DescriptorHelper ex
     @Override
     protected void processFontFile(PDFontDescriptor fontDescriptor, PDStream fontFile)
     {
-        /*
-         * try to load the font using the java.awt.font object. if the font is invalid, an exception will be thrown
-         */
-        try
-        {
-            CFFParser cffParser = new CFFParser();
-            List<CFFFont> lCFonts = cffParser.parse(fontFile.getByteArray());
-            if (lCFonts == null || lCFonts.isEmpty())
-            {
-                this.fContainer.push(new ValidationError(ERROR_FONTS_CID_DAMAGED, "The FontFile can't be read"));
-            }
-            fContainer.setlCFonts(lCFonts);
-        }
-        catch (IOException e)
+        if (font.isDamaged())
         {
-            this.fContainer.push(new ValidationError(ERROR_FONTS_CID_DAMAGED, "The FontFile can't be read", e));
+            this.fContainer.push(new ValidationError(ERROR_FONTS_CID_DAMAGED, "The FontFile can't be read"));
         }
     }
-
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java Thu Oct  9 05:15:25 2014
@@ -26,10 +26,6 @@ import static org.apache.pdfbox.prefligh
 import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_FONT_FILEX_INVALID;
 import static org.apache.pdfbox.preflight.PreflightConstants.FONT_DICTIONARY_KEY_CIDSET;
 
-import java.io.ByteArrayInputStream;
-
-import org.apache.fontbox.ttf.TTFParser;
-import org.apache.fontbox.ttf.TrueTypeFont;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDocument;
 import org.apache.pdfbox.cos.COSName;
@@ -78,9 +74,7 @@ public class CIDType2DescriptorHelper ex
         PDStream ff2 = fontDescriptor.getFontFile2();
         if (ff2 != null)
         {
-            /*
-             * Stream validation should be done by the StreamValidateHelper. Process font specific check
-             */
+            // Stream validation should be done by the StreamValidateHelper. Process font specific check
             COSStream stream = ff2.getStream();
             if (stream == null)
             {
@@ -96,26 +90,9 @@ public class CIDType2DescriptorHelper ex
     @Override
     protected void processFontFile(PDFontDescriptor fontDescriptor, PDStream fontFile)
     {
-        /*
-         * try to load the font using the java.awt.font object. if the font is invalid, an exception will be thrown
-         */
-        TrueTypeFont ttf = null;
-        try
-        {
-            /*
-             * According to PDF Reference, CIDFontType2 is a TrueType font. Remark : Java.awt.Font throws exception when
-             * a CIDFontType2 is parsed even if it is valid.
-             */
-            ttf = new TTFParser(true).parse(new ByteArrayInputStream(fontFile.getByteArray()));
-            this.fContainer.setTtf(ttf);
-        }
-        catch (Exception e)
+        if (font.isDamaged())
         {
-            /*
-             * Exceptionally, Exception is catched Here because of damaged font can throw NullPointer Exception...
-             */
             this.fContainer.push(new ValidationError(ERROR_FONTS_CID_DAMAGED, "The FontFile can't be read"));
         }
     }
-
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java Thu Oct  9 05:15:25 2014
@@ -36,16 +36,19 @@ import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.pdmodel.common.PDStream;
 import org.apache.pdfbox.pdmodel.font.PDFont;
 import org.apache.pdfbox.pdmodel.font.PDFontDescriptor;
+import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
 import org.apache.pdfbox.preflight.PreflightContext;
 import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
 import org.apache.pdfbox.preflight.font.container.TrueTypeContainer;
 
 public class TrueTypeDescriptorHelper extends FontDescriptorHelper<TrueTypeContainer>
 {
+    private final PDTrueTypeFont pdTrueTypeFont;
 
-    public TrueTypeDescriptorHelper(PreflightContext context, PDFont font, TrueTypeContainer fontContainer)
+    public TrueTypeDescriptorHelper(PreflightContext context, PDTrueTypeFont font, TrueTypeContainer fontContainer)
     {
         super(context, font, fontContainer);
+        pdTrueTypeFont = font;
     }
 
     @Override
@@ -74,36 +77,29 @@ public class TrueTypeDescriptorHelper ex
     @Override
     protected void processFontFile(PDFontDescriptor fontDescriptor, PDStream fontFile)
     {
-        /*
-         * Try to load the font using the TTFParser object. If the font is invalid, an exception will be thrown. Because
-         * of it is a Embedded Font Program, some tables are required and other are optional see PDF Reference (§5.8)
-         */
-        ByteArrayInputStream bis = null;
-        try
+        if (font.isDamaged())
         {
-
-            bis = new ByteArrayInputStream(fontFile.getByteArray());
-            TrueTypeFont ttf = new TTFParser(true).parse(bis);
-
-            if (fontDescriptor.isSymbolic() && ttf.getCmap().getCmaps().length != 1)
+            this.fContainer.push(new ValidationError(ERROR_FONTS_TRUETYPE_DAMAGED,
+                    "The FontFile can't be read for " + this.font.getName()));
+        }
+        else
+        {
+            // there must be exactly one encoding in the "cmap" table if the font is symbolic
+            TrueTypeFont ttf = pdTrueTypeFont.getTrueTypeFont();
+            try
             {
-                this.fContainer.push(new ValidationError(ERROR_FONTS_ENCODING,
-                        "The Encoding should be missing for the Symbolic TTF"));
+                if (pdTrueTypeFont.isSymbolic() && ttf.getCmap().getCmaps().length != 1)
+                {
+                    this.fContainer.push(new ValidationError(ERROR_FONTS_ENCODING,
+                            "Symbolic TrueType font has more than one 'cmap' entry for " +
+                            this.font.getName()));
+                }
             }
-            else
+            catch (IOException e)
             {
-                ((TrueTypeContainer) this.fContainer).setTrueTypeFont(ttf);
-                // TODO check the WIdth consistency too
+                this.fContainer.push(new ValidationError(ERROR_FONTS_TRUETYPE_DAMAGED,
+                        "The TTF 'cmap' could not be read for " + this.font.getName()));
             }
         }
-        catch (IOException e)
-        {
-            this.fContainer.push(new ValidationError(ERROR_FONTS_TRUETYPE_DAMAGED, "The FontFile can't be read for "
-                    + this.font.getName()));
-        }
-        finally
-        {
-            IOUtils.closeQuietly(bis);
-        }
     }
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java Thu Oct  9 05:15:25 2014
@@ -22,40 +22,27 @@
 package org.apache.pdfbox.preflight.font.descriptor;
 
 import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_CHARSET_MISSING_FOR_SUBSET;
-import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_CID_DAMAGED;
 import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_FONT_FILEX_INVALID;
+import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_TRUETYPE_DAMAGED;
 import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_TYPE1_DAMAGED;
 import static org.apache.pdfbox.preflight.PreflightConstants.FONT_DICTIONARY_KEY_LENGTH2;
 import static org.apache.pdfbox.preflight.PreflightConstants.FONT_DICTIONARY_KEY_LENGTH3;
 import static org.apache.pdfbox.preflight.font.FontValidator.isSubSet;
 
-import java.awt.Font;
-import java.awt.FontFormatException;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.List;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.fontbox.cff.CFFFont;
-import org.apache.fontbox.cff.CFFParser;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.pdmodel.common.PDStream;
 import org.apache.pdfbox.pdmodel.font.PDFont;
 import org.apache.pdfbox.pdmodel.font.PDFontDescriptor;
-import org.apache.pdfbox.pdmodel.font.PDSimpleFont;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
 import org.apache.pdfbox.preflight.PreflightContext;
 import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
 import org.apache.pdfbox.preflight.font.container.Type1Container;
-import org.apache.pdfbox.preflight.font.util.Type1;
-import org.apache.pdfbox.preflight.font.util.Type1Parser;
 
 public class Type1DescriptorHelper extends FontDescriptorHelper<Type1Container>
 {
-    private boolean isFontFile1 = true;
-
-    public Type1DescriptorHelper(PreflightContext context, PDFont font, Type1Container fontContainer)
+    public Type1DescriptorHelper(PreflightContext context, PDType1Font font, Type1Container fontContainer)
     {
         super(context, font, fontContainer);
     }
@@ -111,8 +98,6 @@ public class Type1DescriptorHelper exten
         }
         else
         {
-            this.isFontFile1 = false;
-            this.fContainer.setFontFile1(isFontFile1);
             return ff3;
         }
     }
@@ -120,80 +105,10 @@ public class Type1DescriptorHelper exten
     @Override
     protected void processFontFile(PDFontDescriptor fontDescriptor, PDStream fontFile)
     {
-        if (isFontFile1)
-        {
-            processFontFile1(fontDescriptor, fontFile);
-        }
-        else
-        {
-            processFontFile3(fontDescriptor, fontFile);
-        }
-    }
-
-    /**
-     * Try to load the font using the java.awt.font object. If the font is
-     * invalid, an exception will be pushed in the font container
-     *
-     * @param fontDescriptor
-     * @param fontFile
-     */
-    protected void processFontFile1(PDFontDescriptor fontDescriptor, PDStream fontFile)
-    {
-        ByteArrayInputStream bis = null;
-        try
-        {
-            bis = new ByteArrayInputStream(fontFile.getByteArray());
-            Font.createFont(Font.TYPE1_FONT, bis);
-            IOUtils.closeQuietly(bis);
-
-            // Parse the Type1 Font program in order to extract Glyph Width
-            COSStream streamObj = fontFile.getStream();
-            int length1 = streamObj.getInt(COSName.LENGTH1);
-            int length2 = streamObj.getInt(COSName.LENGTH2);
-            bis = new ByteArrayInputStream(fontFile.getByteArray());
-            Type1Parser parserForMetrics = Type1Parser.createParserWithEncodingObject(bis, length1, length2,
-                    ((PDSimpleFont) font).getEncoding());
-            Type1 parsedData = parserForMetrics.parse();
-
-            this.fContainer.setType1Font(parsedData);
-        }
-        catch (IOException e)
-        {
-            this.fContainer.push(new ValidationError(ERROR_FONTS_TYPE1_DAMAGED, 
-                    "The FontFile can't be read for " + font.getName() + ": " + e.getMessage(), e));
-        }
-        catch (FontFormatException e)
-        {
-            this.fContainer.push(new ValidationError(ERROR_FONTS_TYPE1_DAMAGED, 
-                    "The FontFile is damaged for " + font.getName() + ": " + e.getMessage(), e));
-        }
-        finally
-        {
-            IOUtils.closeQuietly(bis);
-        }
-    }
-
-    /**
-     * Type1C is a CFF font format, extract all CFFFont objects from the stream
-     *
-     * @param fontDescriptor The font descriptor
-     * @param fontFile The font file
-     */
-    protected void processFontFile3(PDFontDescriptor fontDescriptor, PDStream fontFile)
-    {
-        try
-        {
-            CFFParser cffParser = new CFFParser();
-            List<CFFFont> lCFonts = cffParser.parse(fontFile.getByteArray());
-            if (lCFonts == null || lCFonts.isEmpty())
-            {
-                this.fContainer.push(new ValidationError(ERROR_FONTS_CID_DAMAGED, "The FontFile can't be read"));
-            }
-            this.fContainer.setCFFFontObjects(lCFonts);
-        }
-        catch (IOException e)
+        if (font.isDamaged())
         {
-            this.fContainer.push(new ValidationError(ERROR_FONTS_CID_DAMAGED, "The FontFile can't be read", e));
+            this.fContainer.push(new ValidationError(ERROR_FONTS_TYPE1_DAMAGED,
+                    "The FontFile can't be read for " + this.font.getName()));
         }
     }
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphDetail.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphDetail.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphDetail.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphDetail.java Thu Oct  9 05:15:25 2014
@@ -23,30 +23,41 @@ package org.apache.pdfbox.preflight.font
 
 public class GlyphDetail
 {
-    private GlyphException invalidGlyphError = null;
-    private int charecterIdentifier = 0;
+    private final int code;
+    private final GlyphException exception;
 
-    public GlyphDetail(int cid)
+    /**
+     * @param code character code
+     */
+    public GlyphDetail(int code)
     {
-        this.charecterIdentifier = cid;
+        this.code = code;
+        this.exception = null;
     }
 
-    public GlyphDetail(int cid, GlyphException error)
+    /**
+     * @param code character code
+     * @param error glyph exception
+     */
+    public GlyphDetail(int code, GlyphException error)
     {
-        this.charecterIdentifier = cid;
-        this.invalidGlyphError = error;
+        this.code = code;
+        this.exception = error;
     }
 
     public void throwExceptionIfNotValid() throws GlyphException
     {
-        if (this.invalidGlyphError != null)
+        if (this.exception != null)
         {
-            throw this.invalidGlyphError;
+            throw this.exception;
         }
     }
 
-    public int getCID()
+    /**
+     * Returns the character code.
+     */
+    public int getCode()
     {
-        return this.charecterIdentifier;
+        return this.code;
     }
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphException.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphException.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphException.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphException.java Thu Oct  9 05:15:25 2014
@@ -26,17 +26,17 @@ public class GlyphException extends Exce
     private String errorCode;
     private int invalidCid;
 
-    public GlyphException(String code, int cid)
+    public GlyphException(String errorCode, int cid)
     {
         super();
-        this.errorCode = code;
+        this.errorCode = errorCode;
         this.invalidCid = cid;
     }
 
-    public GlyphException(String code, int cid, String message)
+    public GlyphException(String errorCode, int cid, String message)
     {
         super(message);
-        this.errorCode = code;
+        this.errorCode = errorCode;
         this.invalidCid = cid;
     }
 

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/FontValidationProcess.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/FontValidationProcess.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/FontValidationProcess.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/FontValidationProcess.java Thu Oct  9 05:15:25 2014
@@ -34,6 +34,7 @@ import static org.apache.pdfbox.prefligh
 import org.apache.pdfbox.pdmodel.font.PDFont;
 import org.apache.pdfbox.pdmodel.font.PDSimpleFont;
 import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
 import org.apache.pdfbox.pdmodel.font.PDType3Font;
 import org.apache.pdfbox.preflight.PreflightConstants;
 import org.apache.pdfbox.preflight.PreflightContext;
@@ -89,7 +90,7 @@ public class FontValidationProcess exten
         }
         else if (FONT_DICTIONARY_VALUE_MMTYPE.equals(subtype) || FONT_DICTIONARY_VALUE_TYPE1.equals(subtype))
         {
-            return new Type1FontValidator(context, (PDSimpleFont)font);
+            return new Type1FontValidator(context, (PDType1Font)font);
         }
         else if (FONT_DICTIONARY_VALUE_TYPE3.equals(subtype))
         {

Modified: pdfbox/trunk/preflight/src/test/java/org/apache/pdfbox/preflight/TestIsartor.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/test/java/org/apache/pdfbox/preflight/TestIsartor.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/test/java/org/apache/pdfbox/preflight/TestIsartor.java (original)
+++ pdfbox/trunk/preflight/src/test/java/org/apache/pdfbox/preflight/TestIsartor.java Thu Oct  9 05:15:25 2014
@@ -124,7 +124,7 @@ public class TestIsartor
             {
                 result = e.getResult();
             }
-            assertFalse(path.getName() + " : Isartor file should be invalid", result.isValid());
+            assertFalse(path.getName() + " : Isartor file should be invalid (expected " + this.expectedError + ")", result.isValid());
             assertTrue(path.getName() + " : Should find at least one error", result.getErrorsList().size() > 0);
 
             // could contain more than one error