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;
+ }
+ }
}