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 2015/05/11 23:05:23 UTC
svn commit: r1678825 - in
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font:
PDSimpleFont.java PDType3Font.java encoding/DictionaryEncoding.java
Author: jahewson
Date: Mon May 11 21:05:22 2015
New Revision: 1678825
URL: http://svn.apache.org/r1678825
Log:
PDFBOX-2794: Type 3 font Encoding is defined by Differences array
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/DictionaryEncoding.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java?rev=1678825&r1=1678824&r2=1678825&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java Mon May 11 21:05:22 2015
@@ -92,7 +92,7 @@ public abstract class PDSimpleFont exten
*
* @throws IOException if the font file could not be read
*/
- protected final void readEncoding() throws IOException
+ protected void readEncoding() throws IOException
{
COSBase encoding = dict.getDictionaryObject(COSName.ENCODING);
if (encoding != null)
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java?rev=1678825&r1=1678824&r2=1678825&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java Mon May 11 21:05:22 2015
@@ -18,7 +18,6 @@ package org.apache.pdfbox.pdmodel.font;
import java.io.IOException;
import java.io.InputStream;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fontbox.util.BoundingBox;
@@ -26,9 +25,11 @@ import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSStream;
-import org.apache.pdfbox.pdmodel.font.encoding.Encoding;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.pdmodel.font.encoding.DictionaryEncoding;
+import org.apache.pdfbox.pdmodel.font.encoding.Encoding;
+import org.apache.pdfbox.pdmodel.font.encoding.GlyphList;
import org.apache.pdfbox.util.Matrix;
import org.apache.pdfbox.util.Vector;
@@ -63,8 +64,17 @@ public class PDType3Font extends PDSimpl
}
@Override
+ protected final void readEncoding() throws IOException
+ {
+ COSDictionary encodingDict = (COSDictionary)dict.getDictionaryObject(COSName.ENCODING);
+ encoding = new DictionaryEncoding(encodingDict);
+ glyphList = GlyphList.getZapfDingbats();
+ }
+
+ @Override
protected Encoding readEncodingFromFont() throws IOException
{
+ // Type 3 fonts do not have a built-in encoding
throw new UnsupportedOperationException("not supported for Type 3 fonts");
}
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/DictionaryEncoding.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/DictionaryEncoding.java?rev=1678825&r1=1678824&r2=1678825&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/DictionaryEncoding.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/DictionaryEncoding.java Mon May 11 21:05:22 2015
@@ -19,9 +19,6 @@ package org.apache.pdfbox.pdmodel.font.e
import java.util.HashMap;
import java.util.Map;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
@@ -35,8 +32,6 @@ import org.apache.pdfbox.cos.COSNumber;
*/
public class DictionaryEncoding extends Encoding
{
- private static final Log LOG = LogFactory.getLog(DictionaryEncoding.class);
-
private final COSDictionary encoding;
private final Encoding baseEncoding;
private final Map<Integer, String> differences = new HashMap<Integer, String>();
@@ -66,9 +61,23 @@ public class DictionaryEncoding extends
}
/**
+ * Creates a new DictionaryEncoding for a Type 3 font from a PDF.
+ *
+ * @param fontEncoding The Type 3 encoding dictionary.
+ */
+ public DictionaryEncoding(COSDictionary fontEncoding)
+ {
+ encoding = fontEncoding;
+ baseEncoding = null;
+ applyDifferences();
+ }
+
+ /**
* Creates a new DictionaryEncoding from a PDF.
*
* @param fontEncoding The encoding dictionary.
+ * @param isNonSymbolic True if the font is non-symbolic. False for Type 3 fonts.
+ * @param builtIn The font's built-in encoding. Null for Type 3 fonts.
*/
public DictionaryEncoding(COSDictionary fontEncoding, boolean isNonSymbolic, Encoding builtIn)
{
@@ -97,10 +106,8 @@ public class DictionaryEncoding extends
}
else
{
- base = StandardEncoding.INSTANCE;
- LOG.warn("Built-in encoding required for symbolic font, using standard encoding");
- //FIXME, see PDFBOX-2299, happens with Type3 fonts of the isartor test suite
- // throw new IllegalArgumentException("Built-in Encoding required for symbolic font");
+ throw new IllegalArgumentException("Symbolic fonts must have a built-in " +
+ "encoding");
}
}
}
@@ -108,14 +115,18 @@ public class DictionaryEncoding extends
codeToName.putAll( baseEncoding.codeToName );
names.addAll( baseEncoding.names );
+ applyDifferences();
+ }
+ private void applyDifferences()
+ {
// now replace with the differences
COSArray differences = (COSArray)encoding.getDictionaryObject( COSName.DIFFERENCES );
int currentIndex = -1;
for( int i=0; differences != null && i<differences.size(); i++ )
{
COSBase next = differences.getObject( i );
- if( next instanceof COSNumber )
+ if( next instanceof COSNumber)
{
currentIndex = ((COSNumber)next).intValue();
}
@@ -130,7 +141,7 @@ public class DictionaryEncoding extends
}
/**
- * Returns the base encoding.
+ * Returns the base encoding. Will be null for Type 3 fonts.
*/
public Encoding getBaseEncoding()
{