You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2013/01/20 16:54:29 UTC

svn commit: r1435867 - in /pdfbox/trunk: preflight/src/main/java/org/apache/pdfbox/preflight/font/util/Type1Parser.java xmpbox/src/main/java/org/apache/padaf/xmpbox/xml/DomXmpParser.java

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);
 				}