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/06/19 03:56:45 UTC

svn commit: r1603698 - in /pdfbox/trunk: fontbox/src/main/java/org/apache/fontbox/ttf/ pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/font/ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/

Author: jahewson
Date: Thu Jun 19 01:56:44 2014
New Revision: 1603698

URL: http://svn.apache.org/r1603698
Log:
PDFBOX-2149: Fix regression in PDFont and PDTrueTypeFont

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/CMAPTable.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/font/TTFGlyph2D.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

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/CMAPTable.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/CMAPTable.java?rev=1603698&r1=1603697&r2=1603698&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/CMAPTable.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/CMAPTable.java Thu Jun 19 01:56:44 2014
@@ -21,8 +21,7 @@ import java.io.IOException;
 /**
  * The CMAP table of a true type font.
  * 
- * @author Ben Litchfield (ben@benlitchfield.com)
- * 
+ * @author Ben Litchfield
  */
 public class CMAPTable extends TTFTable
 {
@@ -31,49 +30,22 @@ public class CMAPTable extends TTFTable
      */
     public static final String TAG = "cmap";
 
-    /**
-     * A constant for the platform.
-     */
-    public static final int PLATFORM_MISC = 0;
-
-    /**
-     * A constant for the platform.
-     */
+    // platform
+    public static final int PLATFORM_UNICODE = 0;
     public static final int PLATFORM_MACINTOSH = 1;
-
-    /**
-     * A constant for the platform.
-     */
     public static final int PLATFORM_WINDOWS = 3;
 
-    /**
-     * An encoding constant.
-     */
-    public static final int ENCODING_SYMBOL = 0;
-    /**
-     * An encoding constant.
-     */
-    public static final int ENCODING_UNICODE = 1;
-    /**
-     * An encoding constant.
-     */
-    public static final int ENCODING_SHIFT_JIS = 2;
-    /**
-     * An encoding constant.
-     */
-    public static final int ENCODING_BIG5 = 3;
-    /**
-     * An encoding constant.
-     */
-    public static final int ENCODING_PRC = 4;
-    /**
-     * An encoding constant.
-     */
-    public static final int ENCODING_WANSUNG = 5;
-    /**
-     * An encoding constant.
-     */
-    public static final int ENCODING_JOHAB = 6;
+    // Mac encodings
+    public static final int ENCODING_MAC_ROMAN = 0;
+
+    // Windows encodings
+    public static final int ENCODING_WIN_SYMBOL = 0;
+    public static final int ENCODING_WIN_UNICODE = 1;
+    public static final int ENCODING_WIN_SHIFT_JIS = 2;
+    public static final int ENCODING_WIN_BIG5 = 3;
+    public static final int ENCODING_WIN_PRC = 4;
+    public static final int ENCODING_WIN_WANSUNG = 5;
+    public static final int ENCODING_JWIN_OHAB = 6;
 
     private CMAPEncodingEntry[] cmaps;
 

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/font/TTFGlyph2D.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/font/TTFGlyph2D.java?rev=1603698&r1=1603697&r2=1603698&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/font/TTFGlyph2D.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/font/TTFGlyph2D.java Thu Jun 19 01:56:44 2014
@@ -56,12 +56,7 @@ public class TTFGlyph2D implements Glyph
     private String name;
     private float scale = 1.0f;
     private boolean hasScaling = false;
-    private CMAPEncodingEntry cmapWinUnicode = null;
-    private CMAPEncodingEntry cmapWinSymbol = null;
-    private CMAPEncodingEntry cmapMacintoshSymbol = null;
-    private boolean isSymbol = false;
     private Map<Integer, GeneralPath> glyphs = new HashMap<Integer, GeneralPath>();
-    private Encoding fontEncoding = null;
     private CMap fontCMap = null;
     private boolean isCIDFont = false;
     private boolean hasIdentityCIDMapping = false;
@@ -103,55 +98,17 @@ public class TTFGlyph2D implements Glyph
             scale = 1000f / header.getUnitsPerEm();
             hasScaling = true;
         }
-        extractCmapTable();
         extractFontSpecifics(pdFont, descFont);
     }
 
     /**
-     * extract all useful "cmap" subtables.
-     */
-    private void extractCmapTable()
-    {
-        CMAPTable cmapTable = ttf.getCMAP();
-        if (cmapTable != null)
-        {
-            // get all relevant "cmap" subtables
-            CMAPEncodingEntry[] cmaps = cmapTable.getCmaps();
-            for (CMAPEncodingEntry cmap : cmaps)
-            {
-                if (CMAPTable.PLATFORM_WINDOWS == cmap.getPlatformId())
-                {
-                    if (CMAPTable.ENCODING_UNICODE == cmap.getPlatformEncodingId())
-                    {
-                        cmapWinUnicode = cmap;
-                    }
-                    else if (CMAPTable.ENCODING_SYMBOL == cmap.getPlatformEncodingId())
-                    {
-                        cmapWinSymbol = cmap;
-                    }
-                }
-                else if (CMAPTable.PLATFORM_MACINTOSH == cmap.getPlatformId())
-                {
-                    if (CMAPTable.ENCODING_SYMBOL == cmap.getPlatformEncodingId())
-                    {
-                        cmapMacintoshSymbol = cmap;
-                    }
-                }
-            }
-        }
-
-    }
-
-    /**
      * Extract all font specific information.
      * 
      * @param pdFont the given PDFont
      */
     private void extractFontSpecifics(PDFont pdFont, PDCIDFontType2Font descFont)
     {
-        isSymbol = pdFont.isSymbolicFont();
         name = pdFont.getBaseFont();
-        fontEncoding = pdFont.getFontEncoding();
         if (descFont != null)
         {
             isCIDFont = true;
@@ -520,13 +477,9 @@ public class TTFGlyph2D implements Glyph
     @Override
     public void dispose()
     {
-        cmapMacintoshSymbol = null;
-        cmapWinSymbol = null;
-        cmapWinUnicode = null;
         ttf = null;
         descendantFont = null;
         fontCMap = null;
-        fontEncoding = null;
         if (glyphs != null)
         {
             glyphs.clear();

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=1603698&r1=1603697&r2=1603698&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 Jun 19 01:56:44 2014
@@ -261,8 +261,7 @@ public class PDTrueTypeFont extends PDFo
         {
             if (cmap.getPlatformId() == CMAPTable.PLATFORM_WINDOWS)
             {
-                int platformEncoding = cmap.getPlatformEncodingId();
-                if (CMAPTable.ENCODING_UNICODE == platformEncoding)
+                if (CMAPTable.ENCODING_WIN_UNICODE == cmap.getPlatformEncodingId())
                 {
                     uniMap = cmap;
                     break;
@@ -438,6 +437,7 @@ public class PDTrueTypeFont extends PDFo
                 LOG.error("Caught an exception getGlyhcode: " + exception);
             }
         }
+
         if (getFontEncoding() == null || isSymbolicFont())
         {
             if (cmapWinSymbol != null)
@@ -470,6 +470,12 @@ public class PDTrueTypeFont extends PDFo
                 result = cmapMacintoshSymbol.getGlyphId(code);
             }
         }
+
+        if (result == 0)
+        {
+            LOG.warn("Can't map code " + code + " in font " + getBaseFont());
+        }
+
         return result;
     }
 
@@ -497,24 +503,24 @@ public class PDTrueTypeFont extends PDFo
         {
             // get all relevant "cmap" subtables
             CMAPEncodingEntry[] cmaps = cmapTable.getCmaps();
-            for (CMAPEncodingEntry cmap1 : cmaps)
+            for (CMAPEncodingEntry cmap : cmaps)
             {
-                if (CMAPTable.PLATFORM_WINDOWS == cmap1.getPlatformId())
+                if (CMAPTable.PLATFORM_WINDOWS == cmap.getPlatformId())
                 {
-                    if (CMAPTable.ENCODING_UNICODE == cmap1.getPlatformEncodingId())
+                    if (CMAPTable.ENCODING_WIN_UNICODE == cmap.getPlatformEncodingId())
                     {
-                        cmapWinUnicode = cmap1;
+                        cmapWinUnicode = cmap;
                     }
-                    else if (CMAPTable.ENCODING_SYMBOL == cmap1.getPlatformEncodingId())
+                    else if (CMAPTable.ENCODING_WIN_SYMBOL == cmap.getPlatformEncodingId())
                     {
-                        cmapWinSymbol = cmap1;
+                        cmapWinSymbol = cmap;
                     }
                 }
-                else if (CMAPTable.PLATFORM_MACINTOSH == cmap1.getPlatformId())
+                else if (CMAPTable.PLATFORM_MACINTOSH == cmap.getPlatformId())
                 {
-                    if (CMAPTable.ENCODING_SYMBOL == cmap1.getPlatformEncodingId())
+                    if (CMAPTable.ENCODING_MAC_ROMAN == cmap.getPlatformEncodingId())
                     {
-                        cmapMacintoshSymbol = cmap1;
+                        cmapMacintoshSymbol = cmap;
                     }
                 }
             }
@@ -529,6 +535,7 @@ public class PDTrueTypeFont extends PDFo
         cmapWinUnicode = null;
         cmapWinSymbol = null;
         cmapMacintoshSymbol = null;
+        cmapInitialized = false;
         ttf = null;
         if (advanceWidths != null)
         {

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=1603698&r1=1603697&r2=1603698&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 Jun 19 01:56:44 2014
@@ -41,8 +41,7 @@ public class PDType0Font extends PDFont
 {
     private static final Log LOG = LogFactory.getLog(PDType0Font.class);
 
-    private COSArray descendantFontArray;
-    private PDFont descendantFont;
+    private PDCIDFont descendantFont;
     private COSDictionary descendantFontDictionary;
 
     /**
@@ -53,12 +52,13 @@ public class PDType0Font extends PDFont
     public PDType0Font(COSDictionary fontDictionary)
     {
         super(fontDictionary);
-        descendantFontDictionary = (COSDictionary) getDescendantFonts().getObject(0);
+        COSArray descendantFonts = (COSArray)dict.getDictionaryObject(COSName.DESCENDANT_FONTS);
+        descendantFontDictionary = (COSDictionary)descendantFonts.getObject(0);
         if (descendantFontDictionary != null)
         {
             try
             {
-                descendantFont = PDFontFactory.createFont(descendantFontDictionary);
+                descendantFont = (PDCIDFont)PDFontFactory.createFont(descendantFontDictionary);
             }
             catch (IOException exception)
             {
@@ -67,13 +67,20 @@ public class PDType0Font extends PDFont
         }
     }
 
-    private COSArray getDescendantFonts()
+    /**
+     * Returns the descendant font.
+     *
+     * @return the descendant font.
+     */
+    public PDCIDFont getDescendantFont()
     {
-        if (descendantFontArray == null)
-        {
-            descendantFontArray = (COSArray) dict.getDictionaryObject(COSName.DESCENDANT_FONTS);
-        }
-        return descendantFontArray;
+        return descendantFont;
+    }
+
+    @Override
+    public PDFontDescriptor getFontDescriptor()
+    {
+        return descendantFont.getFontDescriptor();
     }
 
     @Override
@@ -226,21 +233,10 @@ public class PDType0Font extends PDFont
         return retval;
     }
 
-    /**
-     * Returns the descendant font.
-     *
-     * @return the descendant font.
-     */
-    public PDFont getDescendantFont()
-    {
-        return descendantFont;
-    }
-
     @Override
     public void clear()
     {
         super.clear();
-        descendantFontArray = null;
         if (descendantFont != null)
         {
             descendantFont.clear();