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/09/29 00:04:13 UTC
svn commit: r1705786 - in
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font:
PDType3CharProc.java PDType3Font.java
Author: jahewson
Date: Mon Sep 28 22:04:13 2015
New Revision: 1705786
URL: http://svn.apache.org/viewvc?rev=1705786&view=rev
Log:
PDFBOX-2943: move type 3 char proc parsing to PDType3CharProc
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3CharProc.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3CharProc.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3CharProc.java?rev=1705786&r1=1705785&r2=1705786&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3CharProc.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3CharProc.java Mon Sep 28 22:04:13 2015
@@ -19,8 +19,15 @@ package org.apache.pdfbox.pdmodel.font;
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
import org.apache.pdfbox.contentstream.PDContentStream;
+import org.apache.pdfbox.contentstream.operator.Operator;
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSNumber;
+import org.apache.pdfbox.cos.COSObject;
import org.apache.pdfbox.cos.COSStream;
+import org.apache.pdfbox.pdfparser.PDFStreamParser;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.COSObjectable;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
@@ -83,5 +90,57 @@ public final class PDType3CharProc imple
return font.getFontMatrix();
}
- // todo: add methods for getting the character's width from the stream
+ /**
+ * todo.
+ *
+ * @return
+ * @throws IOException
+ */
+ public float getWidth() throws IOException
+ {
+ List<COSBase> arguments = new ArrayList<COSBase>();
+ PDFStreamParser parser = new PDFStreamParser(this);
+ Object token = parser.parseNextToken();
+ while (token != null)
+ {
+ if (token instanceof COSObject)
+ {
+ arguments.add(((COSObject) token).getObject());
+ }
+ else if (token instanceof Operator)
+ {
+ return parseWidth((Operator) token, arguments);
+ }
+ else
+ {
+ arguments.add((COSBase) token);
+ }
+ token = parser.parseNextToken();
+ }
+ throw new IOException("Unexpected end of stream");
+ }
+
+ private float parseWidth(Operator operator, List arguments) throws IOException
+ {
+ if (operator.getName().equals("d0") || operator.getName().equals("d1"))
+ {
+ Object obj = arguments.get(0);
+ if (obj instanceof Number)
+ {
+ return ((Number) obj).floatValue();
+ }
+ else if (obj instanceof COSNumber)
+ {
+ return ((COSNumber) obj).floatValue();
+ }
+ else
+ {
+ throw new IOException("Unexpected argument type: " + obj.getClass().getName());
+ }
+ }
+ else
+ {
+ throw new IOException("First operator must be d0 or d1");
+ }
+ }
}
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=1705786&r1=1705785&r2=1705786&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 Sep 28 22:04:13 2015
@@ -19,22 +19,12 @@ package org.apache.pdfbox.pdmodel.font;
import java.awt.geom.GeneralPath;
import java.io.IOException;
import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.apache.fontbox.FontBoxFont;
import org.apache.fontbox.util.BoundingBox;
-import org.apache.pdfbox.contentstream.operator.Operator;
import org.apache.pdfbox.cos.COSArray;
-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.COSObject;
import org.apache.pdfbox.cos.COSStream;
-import org.apache.pdfbox.pdfparser.PDFStreamParser;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.encoding.DictionaryEncoding;
@@ -50,11 +40,6 @@ import org.apache.pdfbox.util.Vector;
*/
public class PDType3Font extends PDSimpleFont
{
- private static final Log LOG = LogFactory.getLog(PDType3Font.class);
-
- private static final String D0_OPERATOR = "d0";
- private static final String D1_OPERATOR = "d1";
-
private PDResources resources;
private COSDictionary charProcs;
private Matrix fontMatrix;
@@ -142,9 +127,7 @@ public class PDType3Font extends PDSimpl
}
else
{
- // todo: call getWidthFromFont?
- LOG.error("No width for glyph " + code + " in font " + getName());
- return 0;
+ return getWidthFromFont(code);
}
}
}
@@ -152,64 +135,7 @@ public class PDType3Font extends PDSimpl
@Override
public float getWidthFromFont(int code) throws IOException
{
- try
- {
- PDType3CharProc charProc = getCharProc(code);
- if (charProc == null)
- {
- throw new IOException("No CharProc for glyph " + code + " found");
- }
- List<COSBase> arguments = new ArrayList<COSBase>();
- PDFStreamParser parser = new PDFStreamParser(charProc);
- Object token = parser.parseNextToken();
- while (token != null)
- {
- if (token instanceof COSObject)
- {
- arguments.add(((COSObject) token).getObject());
- }
- else if (token instanceof Operator)
- {
- return parseType3WidthOperator((Operator) token, arguments);
- }
- else
- {
- arguments.add((COSBase) token);
- }
- token = parser.parseNextToken();
- }
- }
- catch (IOException e)
- {
- LOG.error("Error processing CharProc for glyph " + code);
- LOG.error(e);
- }
- return -1;
- }
-
- private float parseType3WidthOperator(Operator operator, List arguments) throws IOException
- {
- if (operator.getName().equals(D0_OPERATOR) || operator.getName().equals(D1_OPERATOR))
- {
- Object obj = arguments.get(0);
- if (obj instanceof Number)
- {
- return ((Number) obj).floatValue();
- }
- else if (obj instanceof COSNumber)
- {
- return ((COSNumber) obj).floatValue();
- }
- else
- {
- throw new IOException("Unexpected argument type. Expected : COSInteger or Number / Received : "
- + obj.getClass().getName());
- }
- }
- else
- {
- throw new IOException("Type3 CharProc : First operator must be d0 or d1");
- }
+ return getCharProc(code).getWidth();
}
@Override