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 2012/12/22 15:59:43 UTC

svn commit: r1425292 - in /pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight: content/ font/descriptor/

Author: leleueri
Date: Sat Dec 22 14:59:43 2012
New Revision: 1425292

URL: http://svn.apache.org/viewvc?rev=1425292&view=rev
Log:
[https://issues.apache.org/jira/browse/PDFBOX-1449] When an error is found in a ContentStream, the process continue to display as much errors as possible

Modified:
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamWrapper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/FontDescriptorHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java Sat Dec 22 14:59:43 2012
@@ -50,6 +50,7 @@ import org.apache.pdfbox.pdmodel.graphic
 import org.apache.pdfbox.pdmodel.graphics.color.PDLab;
 import org.apache.pdfbox.preflight.PreflightConfiguration;
 import org.apache.pdfbox.preflight.PreflightContext;
+import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
 import org.apache.pdfbox.preflight.exception.ValidationException;
 import org.apache.pdfbox.preflight.graphic.ColorSpaceHelper;
 import org.apache.pdfbox.preflight.graphic.ColorSpaceHelperFactory;
@@ -242,8 +243,9 @@ public abstract class ContentStreamEngin
 			}
 
 			if (!RenderingIntents.contains(riArgument0)) {
-				throwContentStreamException("Unexpected value '" + arguments.get(0)
+				registerError("Unexpected value '" + arguments.get(0)
 						+ "' for ri operand. ", ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+				return;
 			}
 		}
 	}
@@ -257,7 +259,8 @@ public abstract class ContentStreamEngin
 		if ("q".equals(operator.getOperation())) {
 			int numberOfGraphicStates = this.getGraphicsStack().size();
 			if (numberOfGraphicStates > MAX_GRAPHIC_STATES) {
-				throwContentStreamException("Too many graphic states", ERROR_GRAPHIC_TOO_MANY_GRAPHIC_STATES);
+				registerError("Too many graphic states", ERROR_GRAPHIC_TOO_MANY_GRAPHIC_STATES);
+				return;
 			}
 		}
 	}
@@ -318,8 +321,8 @@ public abstract class ContentStreamEngin
 				}
 
 				if (cs == null) {
-					throwContentStreamException("The ColorSpace is unknown",
-							ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+					registerError("The ColorSpace is unknown", ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+					return;
 				}
 			}
 
@@ -348,25 +351,28 @@ public abstract class ContentStreamEngin
 
 		if ("rg".equals(operation) || "RG".equals(operation)) {
 			if (!validColorSpace(cs, ColorSpaceType.RGB)) {
-				throwContentStreamException("The operator \"" + operation
+				registerError("The operator \"" + operation
 						+ "\" can't be used with CMYK Profile",
 						ERROR_GRAPHIC_INVALID_COLOR_SPACE_RGB);
+				return;
 			}
 		}
 
 		if ("k".equals(operation) || "K".equals(operation)) {
 			if (!validColorSpace(cs, ColorSpaceType.CMYK)) {
-				throwContentStreamException("The operator \"" + operation
+				registerError("The operator \"" + operation
 						+ "\" can't be used with RGB Profile",
 						ERROR_GRAPHIC_INVALID_COLOR_SPACE_CMYK);
+				return;
 			}
 		}
 
 		if ("g".equals(operation) || "G".equals(operation)) {
 			if (!validColorSpace(cs, ColorSpaceType.ALL)) {
-				throwContentStreamException("The operator \"" + operation
+				registerError("The operator \"" + operation
 						+ "\" can't be used without Color Profile",
 						ERROR_GRAPHIC_INVALID_COLOR_SPACE_MISSING);
+				return;
 			}
 		}
 
@@ -376,9 +382,10 @@ public abstract class ContentStreamEngin
 				|| "b*".equals(operation)) {
 			if (!validColorSpace(cs, ColorSpaceType.ALL)) {
 				// The default fill color needs an OutputIntent
-				throwContentStreamException("The operator \"" + operation
+				registerError("The operator \"" + operation
 						+ "\" can't be used without Color Profile",
 						ERROR_GRAPHIC_INVALID_COLOR_SPACE_MISSING);
+				return;
 			}
 		}
 	}
@@ -504,8 +511,8 @@ public abstract class ContentStreamEngin
 		} else if (arguments.get(0) instanceof COSName) {
 			colorSpaceName = ((COSName) arguments.get(0)).getName();
 		} else {
-			throwContentStreamException("The operand doesn't have the expected type",
-					ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+			registerError("The operand doesn't have the expected type",	ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+			return;
 		}
 
 		ColorSpaceHelper csHelper = null;
@@ -528,7 +535,8 @@ public abstract class ContentStreamEngin
 		}
 
 		if (cs == null) {
-			throwContentStreamException("The ColorSpace is unknown", ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+			registerError("The ColorSpace is unknown", ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+			return;
 		}
 
 		if (csHelper == null) {
@@ -542,17 +550,13 @@ public abstract class ContentStreamEngin
 	}
 
 	/**
-	 * Build a ContentStreamException using the given parameters
+	 * Add a validation error into the PreflightContext
 	 * 
-	 * @param msg
-	 *          exception details
-	 * @param errorCode
-	 *          the error code.
-	 * @throws ContentStreamException
+	 * @param msg exception details
+	 * @param errorCode the error code.
 	 */
-	protected void throwContentStreamException(String msg, String errorCode) throws ContentStreamException {
-		ContentStreamException cex = new ContentStreamException(msg);
-		cex.setErrorCode(errorCode);
-		throw cex;
+	protected void registerError(String msg, String errorCode) {
+			ValidationError error = new ValidationError(errorCode, msg);
+			this.context.addValidationError(error);
 	}
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamWrapper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamWrapper.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamWrapper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamWrapper.java Sat Dec 22 14:59:43 2012
@@ -144,8 +144,9 @@ public class ContentStreamWrapper extend
 			processor.setContext(this);
 			processor.process(operator, arguments);
 		} else {
-			throwContentStreamException("The operator \"" + operation
+			registerError("The operator \"" + operation
 					+ "\" isn't supported.", ERROR_SYNTAX_CONTENT_STREAM_UNSUPPORTED_OP);
+			return;
 		}
 
 		/*
@@ -207,35 +208,35 @@ public class ContentStreamWrapper extend
 		 */
 		if ("\"".equals(operator.getOperation())) {
 			if (arguments.size() != 3) {
-				throwContentStreamException("Invalid argument for the operator : "
-						+ operator.getOperation(),
-						ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+				registerError("Invalid argument for the operator : "
+						+ operator.getOperation(), ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+				return;
 			}
 			Object arg0 = arguments.get(0);
 			Object arg1 = arguments.get(1);
 			Object arg2 = arguments.get(2);
 			if (!(arg0 instanceof COSInteger || arg0 instanceof COSFloat) || 
 					!(arg1 instanceof COSInteger || arg1 instanceof COSFloat) ) {
-				throwContentStreamException("Invalid argument for the operator : "
-						+ operator.getOperation(),
-						ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);				
+				registerError("Invalid argument for the operator : "
+						+ operator.getOperation(), ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+				return;
 			}
 
 			if (arg2 instanceof COSString) {
 				validText(((COSString) arg2).getBytes());
 			} else {
-				throwContentStreamException("Invalid argument for the operator : "
-						+ operator.getOperation(),
-						ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+				registerError("Invalid argument for the operator : "
+						+ operator.getOperation(), ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+				return;
 			}
 		} else {
 			Object objStr = arguments.get(0);
 			if (objStr instanceof COSString) {
 				validText(((COSString) objStr).getBytes());
 			} else if (!(objStr instanceof COSInteger)) {
-				throwContentStreamException("Invalid argument for the operator : "
-						+ operator.getOperation(),
-						ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+				registerError("Invalid argument for the operator : "
+						+ operator.getOperation(), ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+				return;
 			}
 		}
 	}
@@ -259,8 +260,9 @@ public class ContentStreamWrapper extend
 			} else if (object instanceof COSString) {
 				validText(((COSString) object).getBytes());
 			} else if (!(object instanceof COSInteger || object instanceof COSFloat)) {
-				throwContentStreamException("Invalid argument for the operator : "
+				registerError("Invalid argument for the operator : "
 						+ operator.getOperation(),	ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+				return;
 			}
 		}
 	}
@@ -282,10 +284,10 @@ public class ContentStreamWrapper extend
 		PDTextState textState = getGraphicsState().getTextState();
 		final int renderingMode = textState.getRenderingMode();
 		final PDFont font = textState.getFont();
-
 		if (font == null) {
 			// Unable to decode the Text without Font
-			throwContentStreamException("Text operator can't be process without Font", ERROR_FONTS_UNKNOWN_FONT_REF);
+			registerError("Text operator can't be process without Font", ERROR_FONTS_UNKNOWN_FONT_REF);
+			return;
 		}
 
 		FontContainer fontContainer = context.getFontContainer(font.getCOSObject());
@@ -294,10 +296,15 @@ public class ContentStreamWrapper extend
 			return ;
 		} else if (fontContainer == null) {
 			// Font Must be embedded if the RenderingMode isn't 3
-			throwContentStreamException(font.getBaseFont() + " is unknown wasn't found by the FontHelperValdiator", ERROR_FONTS_UNKNOWN_FONT_REF);	
-		} else if (!fontContainer.isValid() && ! fontContainer.errorsAleadyMerged()) {
+			registerError(font.getBaseFont() + " is unknown wasn't found by the FontHelperValdiator", ERROR_FONTS_UNKNOWN_FONT_REF);
+			return;
+		} else if (!fontContainer.isValid() && !fontContainer.errorsAleadyMerged()) {
 			context.addValidationErrors(fontContainer.getAllErrors());
 			fontContainer.setErrorsAleadyMerged(true);
+			return;
+		} if (!fontContainer.isValid() && fontContainer.errorsAleadyMerged()) {
+			// font already computed
+			return;
 		}
 
 
@@ -314,15 +321,14 @@ public class ContentStreamWrapper extend
 					codeLength++;
 					cid = font.encodeToCID(string, i, codeLength);
 				}
-			} catch (IOException e) {
-				throwContentStreamException("Encoding can't interpret the character code", ERROR_FONTS_ENCODING_ERROR);
-			}
-
-			try {
 				fontContainer.checkGlyphWith(cid);
+			} catch (IOException e) {
+				registerError("Encoding can't interpret the character code", ERROR_FONTS_ENCODING_ERROR);
+				return;
 			} catch (GlyphException e) {
 				if (renderingMode != 3) {
-					throwContentStreamException(e.getMessage(), e.getErrorCode());
+					registerError(e.getMessage(), e.getErrorCode());
+					return;
 				}
 			}
 		}

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java Sat Dec 22 14:59:43 2012
@@ -63,7 +63,7 @@ public class CIDType0DescriptorHelper ex
 			 */
 			COSStream stream = ff3.getStream();
 			if (stream == null) {
-				this.fContainer.push(new ValidationError(	ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is missing"));
+				this.fContainer.push(new ValidationError(	ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is missing for " + fontDescriptor.getFontName()));
 				this.fContainer.notEmbedded();
 			} else {
 				/*
@@ -72,7 +72,7 @@ public class CIDType0DescriptorHelper ex
 				 */
 				String st = stream.getNameAsString(COSName.SUBTYPE);
 				if (!(FONT_DICTIONARY_VALUE_TYPE0C.equals(st) || FONT_DICTIONARY_VALUE_TYPE1C.equals(st))) {
-					this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID,	"The FontFile3 stream doesn't have the right Subtype"));
+					this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID,	"The FontFile3 stream doesn't have the right Subtype for " + fontDescriptor.getFontName()));
 				}
 
 				checkCIDSet(fontDescriptor);

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java Sat Dec 22 14:59:43 2012
@@ -77,7 +77,7 @@ public class CIDType2DescriptorHelper ex
 			 */
 			COSStream stream = ff2.getStream();
 			if (stream == null) {
-				this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is missing"));
+				this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is missing for " + fontDescriptor.getFontName()));
 				this.fContainer.notEmbedded();
 			}
 		}

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/FontDescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/FontDescriptorHelper.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/FontDescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/FontDescriptorHelper.java Sat Dec 22 14:59:43 2012
@@ -69,7 +69,7 @@ public abstract class FontDescriptorHelp
 	protected PDFont font;
 
 	protected PDFontDescriptorDictionary fontDescriptor;
-	
+
 	public FontDescriptorHelper(PreflightContext context, PDFont font, T fontContainer) {
 		super();
 		this.fContainer = fontContainer;
@@ -82,7 +82,7 @@ public abstract class FontDescriptorHelp
 		// Only a PDFontDescriptorDictionary provides a way to embedded the font program.
 		if(fd != null && fd instanceof PDFontDescriptorDictionary) {
 			fontDescriptor = (PDFontDescriptorDictionary)fd;
-			
+
 			if (checkMandatoryFields(fontDescriptor.getCOSDictionary())) {
 				if (hasOnlyOneFontFile(fontDescriptor)) {
 					PDStream fontFile = extractFontFile(fontDescriptor);
@@ -91,7 +91,12 @@ public abstract class FontDescriptorHelp
 						checkFontFileMetaData(fontDescriptor, fontFile);
 					}
 				} else {
-					this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID,	"They are more than one FontFile"));
+					if (fontFileNotEmbedded(fontDescriptor)) {
+						this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "FontFile entry is missing from FontDescriptor for " + fontDescriptor.getFontName()));
+						this.fContainer.notEmbedded();
+					} else {
+						this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID,	"They are more than one FontFile for " + fontDescriptor.getFontName()));
+					}
 				}
 			}
 		} else {
@@ -130,6 +135,13 @@ public abstract class FontDescriptorHelp
 		return (ff1 != null ^ ff2 != null ^ ff3 != null);
 	}
 
+	protected boolean fontFileNotEmbedded(PDFontDescriptorDictionary fontDescriptor) {
+		PDStream ff1 = fontDescriptor.getFontFile();
+		PDStream ff2 = fontDescriptor.getFontFile2();
+		PDStream ff3 = fontDescriptor.getFontFile3();
+		return (ff1 == null && ff2 == null && ff3 == null);
+	}
+
 	protected abstract void processFontFile(PDFontDescriptorDictionary fontDescriptor, PDStream fontFile);
 
 	/**
@@ -142,7 +154,7 @@ public abstract class FontDescriptorHelp
 		PDMetadata metadata = null;
 		try {
 			metadata = fontFile.getMetadata();
-			
+
 			if (metadata != null) {
 				// Filters are forbidden in a XMP stream
 				if (metadata.getFilters() != null && !metadata.getFilters().isEmpty()) {
@@ -177,7 +189,7 @@ public abstract class FontDescriptorHelp
 			this.fContainer.push(new ValidationError(ERROR_METADATA_FORMAT_UNKOWN,	"The Metadata entry doesn't reference a stream object"));
 		}
 	}
-	
+
 	protected final byte[] getMetaDataStreamAsBytes(PDMetadata metadata) {
 		byte[] result = null;
 		ByteArrayOutputStream bos = null;

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java Sat Dec 22 14:59:43 2012
@@ -50,13 +50,13 @@ public class TrueTypeDescriptorHelper ex
 		PDStream fontFile = fontDescriptor.getFontFile2();
 		COSStream stream =  (fontFile == null ? null : fontFile.getStream());
 		if (stream == null) {
-			this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile2 is missing"));
+			this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile2 is missing for " + fontDescriptor.getFontName()));
 			this.fContainer.notEmbedded();
 			return null;
 		}
 
 		if (stream.getInt(COSName.LENGTH1) <= 0) {
-			this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile entry /Length1 is invalid"));
+			this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile entry /Length1 is invalid for " + fontDescriptor.getFontName()));
 			return null;
 		}
 

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java Sat Dec 22 14:59:43 2012
@@ -82,7 +82,7 @@ public class Type1DescriptorHelper exten
 		if (ff1 != null) {
 			COSStream stream = ff1.getStream();
 			if (stream == null) {
-				this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is missing"));
+				this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is missing for " + fontDescriptor.getFontName()));
 				this.fContainer.notEmbedded();
 				return null;
 			}
@@ -91,7 +91,7 @@ public class Type1DescriptorHelper exten
 			boolean hasLength2 = stream.getInt(COSName.getPDFName(FONT_DICTIONARY_KEY_LENGTH2)) > 0;
 			boolean hasLength3 = stream.getInt(COSName.getPDFName(FONT_DICTIONARY_KEY_LENGTH3)) >= 0;
 			if (!(hasLength1 && hasLength2 && hasLength3)) {
-				this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is invalid"));
+				this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is invalid for " + fontDescriptor.getFontName()));
 				return null;
 			}