Author: tilman Date: Wed Feb 7 18:45:15 2018 New Revision: 1823512 URL: http://svn.apache.org/viewvc?rev=1823512&view=rev Log: PDFBOX-4093: use /CIDToGIDMap as suggested by Jani Pehkonen; remove unused code
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java?rev=1823512&r1=1823511&r2=1823512&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java Wed Feb 7 18:45:15 2018 @@ -17,6 +17,7 @@ package org.apache.pdfbox.pdmodel.font; import java.io.IOException; +import java.io.InputStream; import java.util.HashMap; import java.util.Map; @@ -26,6 +27,8 @@ import org.apache.pdfbox.cos.COSBase; import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.cos.COSNumber; +import org.apache.pdfbox.cos.COSStream; +import org.apache.pdfbox.io.IOUtils; import org.apache.pdfbox.pdmodel.common.COSObjectable; import org.apache.pdfbox.util.Matrix; import org.apache.pdfbox.util.Vector; @@ -370,4 +373,28 @@ public abstract class PDCIDFont implemen * @throws IOException If the text could not be encoded. */ protected abstract byte[] encode(int unicode) throws IOException; + + int[] readCIDToGIDMap() throws IOException + { + int[] cid2gid = null; + COSBase map = dict.getDictionaryObject(COSName.CID_TO_GID_MAP); + if (map instanceof COSStream) + { + COSStream stream = (COSStream) map; + + InputStream is = stream.createInputStream(); + byte[] mapAsBytes = IOUtils.toByteArray(is); + IOUtils.closeQuietly(is); + int numberOfInts = mapAsBytes.length / 2; + cid2gid = new int[numberOfInts]; + int offset = 0; + for (int index = 0; index < numberOfInts; index++) + { + int gid = (mapAsBytes[offset] & 0xff) << 8 | mapAsBytes[offset + 1] & 0xff; + cid2gid[index] = gid; + offset += 2; + } + } + return cid2gid; + } } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java?rev=1823512&r1=1823511&r2=1823512&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java Wed Feb 7 18:45:15 2018 @@ -61,6 +61,7 @@ public class PDCIDFontType0 extends PDCI private Float avgWidth = null; private Matrix fontMatrix; private BoundingBox fontBBox; + private int[] cid2gid = null; /** * Constructor. @@ -118,6 +119,7 @@ public class PDCIDFontType0 extends PDCI cidFont = null; t1Font = cffFont; } + cid2gid = readCIDToGIDMap(); isEmbedded = true; isDamaged = false; } @@ -313,6 +315,11 @@ public class PDCIDFontType0 extends PDCI public GeneralPath getPath(int code) throws IOException { int cid = codeToCID(code); + if (cid2gid != null && isEmbedded) + { + // PDFBOX-4093: despite being a type 0 font, there is a CIDToGIDMap + cid = cid2gid[cid]; + } Type2CharString charstring = getType2CharString(cid); if (charstring != null) { 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=1823512&r1=1823511&r2=1823512&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 Wed Feb 7 18:45:15 2018 @@ -19,9 +19,6 @@ package org.apache.pdfbox.pdmodel.font; import java.awt.geom.AffineTransform; import java.awt.geom.GeneralPath; import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.fontbox.cff.Type2CharString; @@ -32,11 +29,7 @@ import org.apache.fontbox.ttf.OTFParser; import org.apache.fontbox.ttf.OpenTypeFont; import org.apache.fontbox.ttf.TrueTypeFont; import org.apache.fontbox.util.BoundingBox; -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.PDRectangle; import org.apache.pdfbox.pdmodel.common.PDStream; import org.apache.pdfbox.util.Matrix; @@ -208,44 +201,6 @@ public class PDCIDFontType2 extends PDCI return ttf.getFontBBox(); } - private int[] readCIDToGIDMap() throws IOException - { - int[] cid2gid = null; - COSBase map = dict.getDictionaryObject(COSName.CID_TO_GID_MAP); - if (map instanceof COSStream) - { - COSStream stream = (COSStream) map; - - InputStream is = stream.createInputStream(); - byte[] mapAsBytes = IOUtils.toByteArray(is); - IOUtils.closeQuietly(is); - int numberOfInts = mapAsBytes.length / 2; - cid2gid = new int[numberOfInts]; - int offset = 0; - for (int index = 0; index < numberOfInts; index++) - { - int gid = (mapAsBytes[offset] & 0xff) << 8 | mapAsBytes[offset + 1] & 0xff; - cid2gid[index] = gid; - offset += 2; - } - } - return cid2gid; - } - - private Map<Integer, Integer> invert(int[] cid2gid) - { - if (cid2gid == null) - { - return null; - } - Map<Integer, Integer> inverse = new HashMap<>(cid2gid.length); - for (int i = 0; i < cid2gid.length; i++) - { - inverse.put(cid2gid[i], i); - } - return inverse; - } - @Override public int codeToCID(int code) {