Author: jahewson Date: Tue Aug 26 21:18:57 2014 New Revision: 1620737 URL: http://svn.apache.org/r1620737 Log: PDFBOX-2262: Use predefined symbolic flags for standard 14 fonts
Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/encoding/DictionaryEncoding.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/encoding/DictionaryEncoding.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/encoding/DictionaryEncoding.java?rev=1620737&r1=1620736&r2=1620737&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/encoding/DictionaryEncoding.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/encoding/DictionaryEncoding.java Tue Aug 26 21:18:57 2014 @@ -60,7 +60,7 @@ public class DictionaryEncoding extends * * @param fontEncoding The encoding dictionary. */ - public DictionaryEncoding(COSDictionary fontEncoding, boolean isSymbolic, Encoding builtIn) + public DictionaryEncoding(COSDictionary fontEncoding, boolean isNonSymbolic, Encoding builtIn) { encoding = fontEncoding; @@ -71,7 +71,7 @@ public class DictionaryEncoding extends baseEncoding = Encoding.getInstance(name); this.baseEncoding = name.getName(); } - else if (!isSymbolic) + else if (isNonSymbolic) { // Otherwise, for a nonsymbolic font, it is StandardEncoding baseEncoding = StandardEncoding.INSTANCE; Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java?rev=1620737&r1=1620736&r2=1620737&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java Tue Aug 26 21:18:57 2014 @@ -396,6 +396,15 @@ public abstract class PDFont implements */ protected Boolean isFontSymbolic() { + return getSymbolicFlag(); + } + + /** + * Returns the value of the symbolic flag, allowing for the fact that the result may be + * indeterminate. + */ + protected Boolean getSymbolicFlag() + { if (getFontDescriptor() != null) { // fixme: isSymbolic() defaults to false if the flag is missing so we can't trust this Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java?rev=1620737&r1=1620736&r2=1620737&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java Tue Aug 26 21:18:57 2014 @@ -29,6 +29,7 @@ import org.apache.pdfbox.encoding.Standa import org.apache.pdfbox.encoding.WinAnsiEncoding; import java.io.IOException; +import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -41,6 +42,23 @@ public abstract class PDSimpleFont exten { private static final Log LOG = LogFactory.getLog(PDSimpleFont.class); + private static Set<String> STANDARD_14 = new HashSet<String>(); + static + { + // standard 14 names + STANDARD_14.addAll(Arrays.asList( + "Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique", "Helvetica", + "Helvetica-Bold", "Helvetica-Oblique", "Helvetica-BoldOblique", "Times-Roman", + "Times-Bold", "Times-Italic","Times-BoldItalic", "Symbol", "ZapfDingbats" + )); + // alternative names from Adobe Supplement to the ISO 32000 + STANDARD_14.addAll(Arrays.asList( + "CourierCourierNew", "CourierNew", "CourierNew,Italic", "CourierNew,Bold", + "CourierNew,BoldItalic", "Arial", "Arial,Italic", "Arial,Bold", "Arial,BoldItalic", + "TimesNewRoman", "TimesNewRoman,Italic", "TimesNewRoman,Bold", "TimesNewRoman,BoldItalic" + )); + } + protected Encoding encoding; private final Set<Integer> noUnicode = new HashSet<Integer>(); @@ -91,7 +109,12 @@ public abstract class PDSimpleFont exten { builtIn = readEncodingFromFont(); } - this.encoding = new DictionaryEncoding(encodingDict, isSymbolic(), builtIn); + Boolean symbolic = getSymbolicFlag(); + if (symbolic == null) + { + symbolic = builtIn != null; + } + this.encoding = new DictionaryEncoding(encodingDict, !symbolic, builtIn); } } else @@ -118,27 +141,39 @@ public abstract class PDSimpleFont exten @Override protected Boolean isFontSymbolic() { - Boolean result = super.isFontSymbolic(); + Boolean result = getSymbolicFlag(); if (result != null) { return result; } + else if (isStandard14()) + { + return getBaseFont().equals("Symbol") || getBaseFont().equals("ZapfDingbats"); + } else { - if (encoding instanceof WinAnsiEncoding ||encoding instanceof MacRomanEncoding || + if (encoding == null) + { + // sanity check, should never happen + throw new IllegalStateException("recursive definition"); + } + else if (encoding instanceof WinAnsiEncoding ||encoding instanceof MacRomanEncoding || encoding instanceof StandardEncoding) { return false; } else if (encoding instanceof DictionaryEncoding) { - // each name in Differences array must also be in the latin character se - DictionaryEncoding enc = (DictionaryEncoding)encoding; - for (String name : enc.getDifferences().values()) + // each name in Differences array must also be in the latin character set + for (String name : ((DictionaryEncoding)encoding).getDifferences().values()) { - if (!(WinAnsiEncoding.INSTANCE.contains(name) && - MacRomanEncoding.INSTANCE.contains(name) && - StandardEncoding.INSTANCE.contains(name))) + if (name.equals(".notdef")) + { + // skip + } + else if (!(WinAnsiEncoding.INSTANCE.contains(name) && + MacRomanEncoding.INSTANCE.contains(name) && + StandardEncoding.INSTANCE.contains(name))) { return true; } @@ -200,4 +235,12 @@ public abstract class PDSimpleFont exten return null; } + + /** + * Returns true if this font is one of the "standard 14" fonts. + */ + public boolean isStandard14() + { + return !isEmbedded() && STANDARD_14.contains(getBaseFont()); + } } Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java?rev=1620737&r1=1620736&r2=1620737&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java Tue Aug 26 21:18:57 2014 @@ -179,7 +179,8 @@ public class PDTrueTypeFont extends PDSi { extractCmapTable(); int gid = 0; - if (getEncoding() != null && !isSymbolic()) + + if (getEncoding() != null && !isSymbolic()) // non-symbolic { String name = getEncoding().getName(code); if (name.equals(".notdef")) @@ -223,8 +224,7 @@ public class PDTrueTypeFont extends PDSi } } } - - if (getEncoding() == null || isSymbolic()) + else // symbolic { if (cmapWinSymbol != null) {