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()
{