Author: leleueri
Date: Sun Jan 20 15:54:29 2013
New Revision: 1435867
URL: http://svn.apache.org/viewvc?rev=1435867&view=rev
Log:
[PDFBOX-1484] Avoid NumberFormatException if the CharString doesn't have the
right number of elements + Fix an issue on XMPBox
Modified:
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/Type1Parser.java
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/xml/DomXmpParser.java
Modified:
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/Type1Parser.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/Type1Parser.java?rev=1435867&r1=1435866&r2=1435867&view=diff
==============================================================================
---
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/Type1Parser.java
(original)
+++
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/Type1Parser.java
Sun Jan 20 15:54:29 2013
@@ -37,6 +37,7 @@ import org.apache.commons.io.IOUtils;
import org.apache.fontbox.cff.IndexData;
import org.apache.fontbox.cff.Type1CharStringParser;
import org.apache.fontbox.cff.Type1FontUtil;
+import org.apache.log4j.Logger;
import org.apache.pdfbox.encoding.Encoding;
import org.apache.pdfbox.encoding.MacRomanEncoding;
import org.apache.pdfbox.encoding.PdfDocEncoding;
@@ -44,6 +45,9 @@ import org.apache.pdfbox.encoding.Standa
import org.apache.pdfbox.encoding.WinAnsiEncoding;
public final class Type1Parser {
+
+ public static final Logger LOGGER = Logger.getLogger(Type1Parser.class);
+
protected static final char NAME_START = '/';
protected static final String NOTDEF = NAME_START + ".notdef";
protected static final int DEFAULT_LEN_IV = 4;
@@ -256,7 +260,30 @@ public final class Type1Parser {
goToBeginOfCharStringElements(stream);
while (numberOfElements > 0) {
- readCharStringElement(stream, lenIV);
+ byte[] labelToken = readToken(stream);
+ String label = new String(labelToken, TOKEN_ENCODING);
+
+ if (label.equals("end")){
+ // TODO thrown exception ? add an error/warning
in the PreflightContext ??
+ LOGGER.warn("[Type 1] Invalid number of
elements in the CharString");
+ break;
+ }
+
+ byte[] sizeOfCharStringToken = readToken(stream);
+ int sizeOfCharString = Integer.parseInt(new
String(sizeOfCharStringToken,TOKEN_ENCODING));
+
+ readToken(stream); // skip "RD" or "-|" token
+ skipSingleBlankSeparator(stream); // "RD" or "-|" are
followed by a space
+
+ byte[] descBinary = new byte[sizeOfCharString];
+ stream.read(descBinary, 0, sizeOfCharString);
+ byte[] description =
Type1FontUtil.charstringDecrypt(descBinary, lenIV);
+ Type1CharStringParser t1p = new Type1CharStringParser();
+ // TODO provide the local subroutine indexes
+ List<Object> operations = t1p.parse(description, new
IndexData(0));
+ type1Font.addGlyphDescription(label, new
GlyphDescription(operations));
+
+ readToken(stream); // skip "ND" or "|-" token
--numberOfElements;
}
}
@@ -267,27 +294,6 @@ public final class Type1Parser {
token = readToken(stream);
} while(isNotBeginKeyWord(token));
}
-
- private void readCharStringElement(PeekInputStream stream, int lenIV)
throws IOException {
- byte[] labelToken = readToken(stream);
- String label = new String(labelToken, TOKEN_ENCODING);
-
- byte[] sizeOfCharStringToken = readToken(stream);
- int sizeOfCharString = Integer.parseInt(new
String(sizeOfCharStringToken,TOKEN_ENCODING));
-
- readToken(stream); // skip "RD" or "-|" token
- skipSingleBlankSeparator(stream); // "RD" or "-|" are followed
by a space
-
- byte[] descBinary = new byte[sizeOfCharString];
- stream.read(descBinary, 0, sizeOfCharString);
- byte[] description =
Type1FontUtil.charstringDecrypt(descBinary, lenIV);
- Type1CharStringParser t1p = new Type1CharStringParser();
- // TODO provide the local subroutine indexes
- List<Object> operations = t1p.parse(description, new
IndexData(0));
- type1Font.addGlyphDescription(label, new
GlyphDescription(operations));
-
- readToken(stream); // skip "ND" or "|-" token
- }
private boolean isNotBeginKeyWord(byte[] token) throws IOException {
String word = new String(token, TOKEN_ENCODING);
Modified:
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/xml/DomXmpParser.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/xml/DomXmpParser.java?rev=1435867&r1=1435866&r2=1435867&view=diff
==============================================================================
---
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/xml/DomXmpParser.java
(original)
+++
pdfbox/trunk/xmpbox/src/main/java/org/apache/padaf/xmpbox/xml/DomXmpParser.java
Sun Jan 20 15:54:29 2013
@@ -184,10 +184,7 @@ public class DomXmpParser {
if
(XMLConstants.XMLNS_ATTRIBUTE.equals(attr.getPrefix())) {
// do nothing
} else if
(XmpConstants.DEFAULT_RDF_PREFIX.equals(attr.getPrefix()) &&
XmpConstants.ABOUT_NAME.equals(attr.getLocalName())) {
-// // do nothing
-// if (schema instanceof XMPSchema) {
-//
((XMPSchema)sp).setAboutAsSimple(attr.getValue());
-// }
+ // do nothing
} else if (attr.getPrefix()==null &&
XmpConstants.ABOUT_NAME.equals(attr.getLocalName())) {
// do nothing
} else {
@@ -198,12 +195,13 @@ public class DomXmpParser {
loadAttributes(schema,
description);
}
ComplexPropertyContainer container =
schema.getContainer();
+ PropertyType type =
checkPropertyDefinition(xmp, new QName(attr.getNamespaceURI(),
attr.getLocalName()));
AbstractSimpleProperty sp =
tm.instanciateSimpleProperty(
namespace,
schema.getPrefix(),
attr.getLocalName(),
attr.getValue(),
- Types.Text);
+ type.type());
container.addProperty(sp);
}