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/08/05 21:24:58 UTC

svn commit: r1615983 - in /pdfbox/trunk: fontbox/src/main/java/org/apache/fontbox/ttf/CMAPTable.java pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java

Author: jahewson
Date: Tue Aug  5 19:24:57 2014
New Revision: 1615983

URL: http://svn.apache.org/r1615983
Log:
PDFBOX-2215: Search for symbol cmap too, in priority order

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/CMAPTable.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.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=1615983&r1=1615982&r2=1615983&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 Tue Aug  5 19:24:57 2014
@@ -39,7 +39,7 @@ public class CMAPTable extends TTFTable
     public static final int ENCODING_MAC_ROMAN = 0;
 
     // Windows encodings
-    public static final int ENCODING_WIN_SYMBOL = 0;
+    public static final int ENCODING_WIN_SYMBOL = 0; // Unicode, non-standard character set
     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;

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=1615983&r1=1615982&r2=1615983&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 Tue Aug  5 19:24:57 2014
@@ -276,19 +276,26 @@ public class PDTrueTypeFont extends PDFo
 
         CMAPTable cmapTable = ttf.getCMAP();
         CMAPEncodingEntry[] cmaps = cmapTable.getCmaps();
-        CMAPEncodingEntry uniMap = null;
 
-        for (CMAPEncodingEntry cmap : cmaps)
+        CMAPEncodingEntry uniMap = getCmapSubtable(cmaps, CMAPTable.PLATFORM_UNICODE,
+                                                   CMAPTable.ENCODING_UNICODE_2_0_FULL);
+        if (uniMap == null)
         {
-            if (cmap.getPlatformId() == CMAPTable.PLATFORM_UNICODE &&
-                    (cmap.getPlatformEncodingId() == CMAPTable.ENCODING_UNICODE_2_0_BMP ||
-                     cmap.getPlatformEncodingId() == CMAPTable.ENCODING_UNICODE_2_0_FULL))
-            {
-                uniMap = cmap;
-                break;
-            }
+            uniMap = getCmapSubtable(cmaps, CMAPTable.PLATFORM_UNICODE,
+                                     CMAPTable.ENCODING_UNICODE_2_0_BMP);
+        }
+        if (uniMap == null)
+        {
+            uniMap = getCmapSubtable(cmaps, CMAPTable.PLATFORM_WINDOWS,
+                                     CMAPTable.ENCODING_WIN_UNICODE);
+        }
+        if (uniMap == null)
+        {
+            // Microsoft's "Recommendations for OpenType Fonts" says that "Symbol" encoding
+            // actually means "Unicode, non-standard character set"
+            uniMap = getCmapSubtable(cmaps, CMAPTable.PLATFORM_WINDOWS,
+                                     CMAPTable.ENCODING_WIN_SYMBOL);
         }
-
         if (uniMap == null)
         {
             // there should always be a usable cmap, if this happens we haven't tried hard enough
@@ -366,6 +373,23 @@ public class PDTrueTypeFont extends PDFo
     }
 
     /**
+     * Returns the "cmap" subtable for the given platform and encoding, or null.
+     */
+    private CMAPEncodingEntry getCmapSubtable(CMAPEncodingEntry[] cmaps,
+                                              int platformId, int platformEncodingId)
+    {
+        for (CMAPEncodingEntry cmap : cmaps)
+        {
+            if (cmap.getPlatformId() == platformId &&
+                cmap.getPlatformEncodingId() == platformEncodingId)
+            {
+                return cmap;
+            }
+        }
+        return null;
+    }
+
+    /**
      * Return the TTF font as TrueTypeFont.
      * 
      * @return the TTF font