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/12/13 05:48:56 UTC

svn commit: r1645109 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font: PDCIDFontType2.java PDType0Font.java

Author: jahewson
Date: Sat Dec 13 04:48:56 2014
New Revision: 1645109

URL: http://svn.apache.org/r1645109
Log:
PDFBOX-2524: Don't assume that embedded TTFs have a cmap table

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java

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=1645109&r1=1645108&r2=1645109&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 Sat Dec 13 04:48:56 2014
@@ -56,7 +56,7 @@ public class PDCIDFontType2 extends PDCI
     private final boolean hasIdentityCid2Gid;
     private final boolean isEmbedded;
     private final boolean isDamaged;
-    private final CmapSubtable cmap;
+    private final CmapSubtable cmap; // may be null
     private Matrix fontMatrix;
 
     /**
@@ -291,6 +291,8 @@ public class PDCIDFontType2 extends PDCI
             {
                 LOG.warn("trying to map a multi-byte character using 'cmap', result will be poor");
             }
+
+            // a non-embedded font always has a cmap (otherwise ExternalFonts won't load it)
             return cmap.getGlyphId(unicode.codePointAt(0));
         }
         else
@@ -334,6 +336,11 @@ public class PDCIDFontType2 extends PDCI
      */
     private CmapSubtable getUnicodeCmap(CmapTable cmapTable)
     {
+        if (cmapTable == null)
+        {
+            return null;
+        }
+
         CmapSubtable cmap = cmapTable.getSubtable(CmapTable.PLATFORM_UNICODE,
                                                   CmapTable.ENCODING_UNICODE_2_0_FULL);
         if (cmap == null)
@@ -386,23 +393,43 @@ public class PDCIDFontType2 extends PDCI
     @Override
     public byte[] encode(int unicode)
     {
-        int gid = cmap.getGlyphId(unicode);
-
-        if (gid == 0)
+        int cid = -1;
+        if (isEmbedded)
         {
-            throw new IllegalArgumentException(
-                    String.format("No glyph for U+%04X in font %s", unicode, getName()));
-        }
+            // embedded fonts always use CIDToGIDMap, with Identity as the default
+            if (parent.getCMap().getName().startsWith("Identity-"))
+            {
+                if (cmap != null)
+                {
+                    cid = cmap.getGlyphId(unicode);
+                }
+            }
+            else
+            {
+                // if the CMap is predefined then there will be a UCS-2 CMap
+                if (parent.getCMapUCS2() != null)
+                {
+                    cid = parent.getCMapUCS2().toCID(unicode);
+                }
+            }
 
-        // inverted CIDToGIDMap
-        int cid;
-        if (cid2gid != null)
-        {
-            cid = gid2cid.get(gid);
+            // otherwise we require an explicit ToUnicode CMap
+            if (cid == -1)
+            {
+                // todo: invert the ToUnicode CMap?
+                cid = 0;
+            }
         }
         else
         {
-            cid = gid;
+            // a non-embedded font always has a cmap (otherwise it we wouldn't load it)
+            cid = cmap.getGlyphId(unicode);
+        }
+
+        if (cid == 0)
+        {
+            throw new IllegalArgumentException(
+                    String.format("No glyph for U+%04X in font %s", unicode, getName()));
         }
 
         // CID is always 2-bytes (16-bit) for TrueType

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=1645109&r1=1645108&r2=1645109&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 Sat Dec 13 04:48:56 2014
@@ -109,6 +109,8 @@ public class PDType0Font extends PDFont
         PDCIDFontType2Embedder embedder =
                 new PDCIDFontType2Embedder(document, dict, ttfStream, this);
         descendantFont = embedder.getCIDFont();
+        readEncoding();
+        fetchCMapUCS2();
     }
 
     /**
@@ -215,6 +217,14 @@ public class PDType0Font extends PDFont
         return cMap;
     }
 
+    /**
+     * Returns the font's UCS2 CMap, only present this font uses a predefined CMap.
+     */
+    public CMap getCMapUCS2()
+    {
+        return cMapUCS2;
+    }
+
     @Override
     public PDFontDescriptor getFontDescriptor()
     {