You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2012/02/20 17:49:14 UTC

svn commit: r1291359 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: cos/COSName.java pdmodel/font/PDCIDFontType2Font.java

Author: lehmi
Date: Mon Feb 20 16:49:14 2012
New Revision: 1291359

URL: http://svn.apache.org/viewvc?rev=1291359&view=rev
Log:
PDFBOX-1230: added support for CIDToGIDMap of CIDType2 fonts

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2Font.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java?rev=1291359&r1=1291358&r2=1291359&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java Mon Feb 20 16:49:14 2012
@@ -283,6 +283,10 @@ public final class COSName extends COSBa
     /**
      * A common COSName value.
      */
+    public static final COSName CID_TO_GID_MAP = new COSName( "CIDToGIDMap" );
+    /**
+     * A common COSName value.
+     */
     public static final COSName COLORANTS = new COSName( "Colorants" );
     /**
      * A common COSName value.

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2Font.java?rev=1291359&r1=1291358&r2=1291359&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2Font.java Mon Feb 20 16:49:14 2012
@@ -22,8 +22,11 @@ import java.io.IOException;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSStream;
+import org.apache.pdfbox.io.IOUtils;
 import org.apache.pdfbox.pdmodel.common.PDStream;
 
 /**
@@ -38,8 +41,11 @@ public class PDCIDFontType2Font extends 
     /**
      * Log instance.
      */
-    private static final Log log = LogFactory.getLog(PDCIDFontType2Font.class);
+    private static final Log LOG = LogFactory.getLog(PDCIDFontType2Font.class);
 
+    private Boolean hasCIDToGIDMap = null;
+    private int[] cid2gid = null;
+    
     /**
      * Constructor.
      */
@@ -76,14 +82,14 @@ public class PDCIDFontType2Font extends 
             }
             catch( FontFormatException f )
             {
-                log.info("Can't read the embedded font " + fd.getFontName() );
+                LOG.info("Can't read the embedded font " + fd.getFontName() );
             }
             if (awtFont == null)
             {
                 awtFont = FontManager.getAwtFont(fd.getFontName());
                 if (awtFont != null)
                 {
-                    log.info("Using font "+awtFont.getName()+ " instead");
+                    LOG.info("Using font "+awtFont.getName()+ " instead");
                 }
             }
         }
@@ -91,4 +97,79 @@ public class PDCIDFontType2Font extends 
         return awtFont;
     }
 
+    /**
+     * read the CIDToGID map.
+     */
+    private void readCIDToGIDMapping()
+    {
+        COSBase map = font.getDictionaryObject(COSName.CID_TO_GID_MAP);
+        if (map instanceof COSStream) 
+        {
+            COSStream stream = (COSStream)map;
+            try 
+            {
+                byte[] mapAsBytes = IOUtils.toByteArray(stream.getUnfilteredStream());
+                int numberOfInts = mapAsBytes.length / 2;
+                cid2gid = new int[numberOfInts];
+                int index = 0;
+                for(int offset = 0;offset < numberOfInts;offset++)
+                {
+                    cid2gid[index] = getCodeFromArray(mapAsBytes, offset, 2);
+                }
+            }
+            catch(IOException exception)
+            {
+                LOG.error("Can't read the CIDToGIDMap", exception);
+            }
+        }
+    }
+    
+    /**
+     * Indicates if this font has a CIDToGIDMap.
+     * 
+     * @return returns true if the font has a CIDToGIDMap.
+     */
+    public boolean hasCIDToGIDMap()
+    {
+        if (hasCIDToGIDMap == null)
+        {
+            COSBase map = font.getDictionaryObject(COSName.CID_TO_GID_MAP);
+            if (map != null && map instanceof COSStream)
+            {
+                hasCIDToGIDMap = Boolean.TRUE;
+            }
+            else
+            {
+                hasCIDToGIDMap = Boolean.FALSE;
+            }
+        }
+        return hasCIDToGIDMap.booleanValue();
+    }
+    
+    /**
+     * Maps the given CID to the correspondent GID.
+     * 
+     * @param cid the given CID
+     * @return the mapped GID, or -1 if something went wrong.
+     */
+    public int mapCIDToGID(int cid) 
+    {
+        if (hasCIDToGIDMap()) 
+        {
+            if (cid2gid == null)
+            {
+                readCIDToGIDMapping();
+            }
+            if (cid2gid != null && cid < cid2gid.length)
+            {
+                return cid2gid[cid];
+            }
+            return -1;
+        }
+        else
+        {
+            // identity is the default value
+            return cid;
+        }
+    }
 }