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/07/26 18:34:06 UTC

svn commit: r1366075 - in /pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight: ./ annotation/ content/ font/ font/descriptor/ font/util/ graphic/ metadata/ process/ utils/

Author: leleueri
Date: Thu Jul 26 16:34:05 2012
New Revision: 1366075

URL: http://svn.apache.org/viewvc?rev=1366075&view=rev
Log:
[https://issues.apache.org/jira/browse/PDFBOX-1312] 
- Adapt the FilterHelper behaviour according to the DOcument specification
- Initialize the ICCProfileWrapper if the PreflightContext doesn't know it.

Modified:
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightContext.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightDocument.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/AnnotationValidator.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/LineAnnotationValidator.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/SquareCircleAnnotationValidator.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/FontValidator.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/util/Type1Parser.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/DeviceColorSpaceHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/ICCProfileWrapper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/StandardColorSpaceHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/metadata/PDFAIdentificationValidation.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/metadata/SynchronizedMetaDataValidation.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/CatalogValidationProcess.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/StreamValidationProcess.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/COSUtils.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/FilterHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/PdfElementParser.java

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightContext.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightContext.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightContext.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightContext.java Thu Jul 26 16:34:05 2012
@@ -62,6 +62,11 @@ public class PreflightContext {
 	 */
 	protected ICCProfileWrapper iccProfileWrapper = null;
 	/**
+	 * 
+	 */
+	protected boolean iccProfileAlreadySearched = false;
+	
+	/**
 	 * MetaData of the current pdf file. 
 	 */
 	protected XMPMetadata metadata = null;
@@ -220,6 +225,14 @@ public class PreflightContext {
 	public void setValidationPath(PreflightPath validationPath) {
 		this.validationPath = validationPath;
 	}
+
+	public boolean isIccProfileAlreadySearched() {
+		return iccProfileAlreadySearched;
+	}
+
+	public void setIccProfileAlreadySearched(boolean iccProfileAlreadySearched) {
+		this.iccProfileAlreadySearched = iccProfileAlreadySearched;
+	}
 	
 	
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightDocument.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightDocument.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightDocument.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightDocument.java Thu Jul 26 16:34:05 2012
@@ -96,7 +96,7 @@ public class PreflightDocument extends P
 		}
 	}
 	
-	protected void initConfiguration(Format format) {
+	private void initConfiguration(Format format) {
 		switch (format) {
 //		case PDF_A1A:
 //			
@@ -151,4 +151,9 @@ public class PreflightDocument extends P
 			ContextHelper.validateElement(context, name);
 		}
 	}
+
+	public Format getSpecification() {
+		return specification;
+	}
+	
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/AnnotationValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/AnnotationValidator.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/AnnotationValidator.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/AnnotationValidator.java Thu Jul 26 16:34:05 2012
@@ -119,7 +119,7 @@ public abstract class AnnotationValidato
 	 * 
 	 * @return
 	 */
-	protected boolean checkColors() {
+	protected boolean checkColors() throws ValidationException {
 		if (this.pdAnnot.getColour() != null) {
 			if (!searchRGBProfile()) {
 				ctx.addValidationError(new ValidationError(ERROR_ANNOT_FORBIDDEN_COLOR,"Annotation uses a Color profile which isn't the same than the profile contained by the OutputIntent"));
@@ -134,8 +134,8 @@ public abstract class AnnotationValidato
 	 * 
 	 * @return true if a rgb profile is found, false otherwise.
 	 */
-	protected boolean searchRGBProfile() {
-		ICCProfileWrapper iccpw = this.ctx.getIccProfileWrapper();
+	protected boolean searchRGBProfile() throws ValidationException{
+		ICCProfileWrapper iccpw = ICCProfileWrapper.getOrSearchICCProfile(ctx);
 		if (iccpw != null) {
 			return iccpw.isRGBColorSpace();
 		}

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/LineAnnotationValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/LineAnnotationValidator.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/LineAnnotationValidator.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/LineAnnotationValidator.java Thu Jul 26 16:34:05 2012
@@ -69,7 +69,7 @@ public class LineAnnotationValidator ext
    *          IC element is present
    * @return
    */
-  protected boolean checkIColors() {
+  protected boolean checkIColors() throws ValidationException {
     if (this.pdLine.getInteriorColour() != null) {
       if (!searchRGBProfile()) {
         ctx.addValidationError(new ValidationError(ERROR_ANNOT_FORBIDDEN_COLOR,"Annotation uses a Color profile which isn't the same than the profile contained by the OutputIntent"));

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/SquareCircleAnnotationValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/SquareCircleAnnotationValidator.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/SquareCircleAnnotationValidator.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/SquareCircleAnnotationValidator.java Thu Jul 26 16:34:05 2012
@@ -69,7 +69,7 @@ public class SquareCircleAnnotationValid
    *          IC element is present
    * @return
    */
-  protected boolean checkIColors() {
+  protected boolean checkIColors() throws ValidationException {
     if (this.pdSquareCircle.getInteriorColour() != null) {
       if (!searchRGBProfile()) {
         ctx.addValidationError(new ValidationError(ERROR_ANNOT_FORBIDDEN_COLOR,"Annotation uses a Color profile which isn't the same than the profile contained by the OutputIntent"));

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=1366075&r1=1366074&r2=1366075&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 Thu Jul 26 16:34:05 2012
@@ -26,8 +26,6 @@ import static org.apache.pdfbox.prefligh
 import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_GRAPHIC_INVALID_COLOR_SPACE_RGB;
 import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_GRAPHIC_TOO_MANY_GRAPHIC_STATES;
 import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY;
-import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_SYNTAX_STREAM_INVALID_FILTER;
-import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_SYNTAX_STREAM_UNDEFINED_FILTER;
 import static org.apache.pdfbox.preflight.PreflightConstants.MAX_GRAPHIC_STATES;
 
 import java.awt.color.ColorSpace;
@@ -52,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.exception.ValidationException;
 import org.apache.pdfbox.preflight.graphic.ColorSpaceHelper;
 import org.apache.pdfbox.preflight.graphic.ColorSpaceHelperFactory;
 import org.apache.pdfbox.preflight.graphic.ColorSpaceHelperFactory.ColorSpaceRestriction;
@@ -107,12 +106,13 @@ public abstract class ContentStreamEngin
 	protected PreflightContext context = null;
 
 	protected COSDocument cosDocument = null;
-	
+
 	protected PDPage processeedPage = null;
-	
+
 	protected Map<String,OperatorProcessor> contentStreamEngineOperators = new HashMap<String,OperatorProcessor>();
 
 	public ContentStreamEngine(PreflightContext _context, PDPage _page) {
+		super();
 		this.context = _context;
 		this.cosDocument = _context.getDocument().getDocument();
 		this.processeedPage = _page;
@@ -276,15 +276,7 @@ public abstract class ContentStreamEngin
 		 * The LZWDecode Filter is forbidden.
 		 */
 		COSBase filter = dict.getDictionaryObject(COSName.F, COSName.FILTER);
-		String errorCode = FilterHelper.isAuthorizedFilter(COSUtils.getAsString(filter, this.context.getDocument().getDocument()));
-		if (errorCode != null) {
-			// LZW is forbidden.
-			if ( ERROR_SYNTAX_STREAM_INVALID_FILTER.equals(errorCode) ) {
-				throwContentStreamException("LZW filter can't be used in a PDF/A File", ERROR_SYNTAX_STREAM_INVALID_FILTER);
-			} else {
-				throwContentStreamException("This filter isn't defined in the PDF Reference Third Edition.", ERROR_SYNTAX_STREAM_UNDEFINED_FILTER);
-			}
-		}
+		FilterHelper.isAuthorizedFilter(context, COSUtils.getAsString(filter, this.context.getDocument().getDocument()));
 	}
 
 	/**
@@ -391,7 +383,8 @@ public abstract class ContentStreamEngin
 		}
 	}
 
-	private boolean validColorSpace(PDColorState colorState, ColorSpaceType expectedType) {
+	private boolean validColorSpace(PDColorState colorState, ColorSpaceType expectedType)
+			throws ContentStreamException {
 		boolean result = true;
 		if (colorState == null) {
 			result = validColorSpaceDestOutputProfile(expectedType);
@@ -413,25 +406,30 @@ public abstract class ContentStreamEngin
 	 * @param expectedType
 	 * @return
 	 */
-	private boolean validColorSpaceDestOutputProfile(ColorSpaceType expectedType) {
+	private boolean validColorSpaceDestOutputProfile(ColorSpaceType expectedType) throws ContentStreamException {
 		boolean result = false;
-		ICCProfileWrapper profileWrapper = context.getIccProfileWrapper();
-		if (profileWrapper != null) {
-			switch (expectedType) {
-			case RGB:
-				result = profileWrapper.isRGBColorSpace();
-				break;
-			case CMYK:
-				result = profileWrapper.isCMYKColorSpace();
-				break;
-			default:
-				result = true;
-				break;
+		ICCProfileWrapper profileWrapper;
+		try {
+			profileWrapper = ICCProfileWrapper.getOrSearchICCProfile(context);
+			if (profileWrapper != null) {
+				switch (expectedType) {
+				case RGB:
+					result = profileWrapper.isRGBColorSpace();
+					break;
+				case CMYK:
+					result = profileWrapper.isCMYKColorSpace();
+					break;
+				default:
+					result = true;
+					break;
+				}
 			}
+		} catch (ValidationException e) {
+			throw new ContentStreamException(e);
 		}
 		return result;
 	}
-	
+
 	/**
 	 * Return true if the given ColorSpace is an independent device ColorSpace.
 	 * If the color space is an ICCBased, check the embedded profile color (RGB or CMYK)
@@ -493,7 +491,7 @@ public abstract class ContentStreamEngin
 	 * @throws IOException
 	 */
 	protected void checkSetColorSpaceOperators(PDFOperator operator, List<?> arguments) 
-	throws IOException {
+			throws IOException {
 		if (!("CS".equals(operator.getOperation()) || "cs".equals(operator.getOperation()))) {
 			return;
 		}

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/FontValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/FontValidator.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/FontValidator.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/FontValidator.java Thu Jul 26 16:34:05 2012
@@ -34,7 +34,7 @@ public abstract class FontValidator <T e
 	protected PDFont font;
 	protected FontDescriptorHelper<T> descriptorHelper;
 
-	private static final String subSetPattern = "^[A-Z]{6}\\+.*";
+	private static final String SUB_SET_PATTERN = "^[A-Z]{6}\\+.*";
 
 	public FontValidator(PreflightContext context, PDFont font, T fContainer) {
 		super();
@@ -45,7 +45,7 @@ public abstract class FontValidator <T e
 	}
 
   public static boolean isSubSet(String fontName) {
-    return fontName.matches(subSetPattern);
+    return fontName.matches(SUB_SET_PATTERN);
   }
 
   public static String getSubSetPatternDelimiter() {

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=1366075&r1=1366074&r2=1366075&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 Thu Jul 26 16:34:05 2012
@@ -48,7 +48,7 @@ public class TrueTypeDescriptorHelper ex
 
 	public PDStream extractFontFile(PDFontDescriptorDictionary fontDescriptor) {
 		PDStream fontFile = fontDescriptor.getFontFile2();
-		COSStream stream =  (fontFile != null ? fontFile.getStream() : null);
+		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.notEmbedded();

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=1366075&r1=1366074&r2=1366075&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 Thu Jul 26 16:34:05 2012
@@ -42,7 +42,7 @@ import org.apache.pdfbox.encoding.PdfDoc
 import org.apache.pdfbox.encoding.StandardEncoding;
 import org.apache.pdfbox.encoding.WinAnsiEncoding;
 
-public class Type1Parser {
+public final class Type1Parser {
 	protected static final char NAME_START = '/';
 	protected static final String NOTDEF = NAME_START + ".notdef";
 	protected static final int DEFAULT_LEN_IV = 4;

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/DeviceColorSpaceHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/DeviceColorSpaceHelper.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/DeviceColorSpaceHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/DeviceColorSpaceHelper.java Thu Jul 26 16:34:05 2012
@@ -68,12 +68,12 @@ public class DeviceColorSpaceHelper exte
 		PDIndexed indexed = (PDIndexed) pdcs;
 		try {
 			PDColorSpace based = indexed.getBaseColorSpace();
-			ColorSpaces cs = ColorSpaces.valueOf(based.getName());
-			switch (cs) {      
+			ColorSpaces colorSpace = ColorSpaces.valueOf(based.getName());
+			switch (colorSpace) {      
 			case Indexed:
 			case Indexed_SHORT:
 			case Pattern:
-				context.addValidationError(new ValidationError(ERROR_GRAPHIC_INVALID_COLOR_SPACE_FORBIDDEN, cs.getLabel() + " ColorSpace is forbidden"));
+				context.addValidationError(new ValidationError(ERROR_GRAPHIC_INVALID_COLOR_SPACE_FORBIDDEN, colorSpace.getLabel() + " ColorSpace is forbidden"));
 				break;
 			default:
 				processAllColorSpace(based);

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/ICCProfileWrapper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/ICCProfileWrapper.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/ICCProfileWrapper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/ICCProfileWrapper.java Thu Jul 26 16:34:05 2012
@@ -21,8 +21,23 @@
 
 package org.apache.pdfbox.preflight.graphic;
 
+import static org.apache.pdfbox.preflight.PreflightConstants.DOCUMENT_DICTIONARY_KEY_OUTPUT_INTENTS;
+import static org.apache.pdfbox.preflight.PreflightConstants.OUTPUT_INTENT_DICTIONARY_KEY_DEST_OUTPUT_PROFILE;
+
 import java.awt.color.ICC_ColorSpace;
 import java.awt.color.ICC_Profile;
+import java.io.IOException;
+
+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.pdmodel.PDDocumentCatalog;
+import org.apache.pdfbox.pdmodel.common.PDStream;
+import org.apache.pdfbox.preflight.PreflightContext;
+import org.apache.pdfbox.preflight.PreflightDocument;
+import org.apache.pdfbox.preflight.exception.ValidationException;
+import org.apache.pdfbox.preflight.utils.COSUtils;
 
 /**
  * This class embeds an instance of java.awt.color.ICC_Profile which represent
@@ -33,14 +48,14 @@ public class ICCProfileWrapper {
   /**
    * The ICCProfile extracted from DestOutputItents
    */
-  private ICC_Profile profile = null;
+  private final ICC_Profile profile;
 
   /**
    * The ICC ColorSpace created using the ICCProfile
    */
-  private ICC_ColorSpace colorSpace = null;
+  private final ICC_ColorSpace colorSpace;
 
-  public ICCProfileWrapper(ICC_Profile _profile) {
+  public ICCProfileWrapper(final ICC_Profile _profile) {
     this.profile = _profile;
     this.colorSpace = new ICC_ColorSpace(_profile);
   }
@@ -87,4 +102,47 @@ public class ICCProfileWrapper {
   public boolean isGrayColorSpace() {
     return ICC_ColorSpace.TYPE_GRAY == colorSpace.getType();
   }
+
+	/**
+	 * This method read all outputIntent dictionary until on of them have a destOutputProfile stream.
+	 * This stream is parsed and is used to create a IccProfileWrapper.
+	 *  
+	 * @param context
+	 * @return an instance of ICCProfileWrapper or null if there are no DestOutputProfile
+	 * @throws ValidationException if an IOException occurs during the DestOutputProfile parsing 
+	 */
+	private static ICCProfileWrapper searchFirstICCProfile(PreflightContext context) throws ValidationException {
+		PreflightDocument document = context.getDocument();
+		PDDocumentCatalog catalog = document.getDocumentCatalog();
+		COSBase cBase = catalog.getCOSDictionary().getItem(COSName.getPDFName(DOCUMENT_DICTIONARY_KEY_OUTPUT_INTENTS));
+		COSArray outputIntents = COSUtils.getAsArray(cBase, document.getDocument());
+
+		for (int i = 0; outputIntents != null && i < outputIntents.size(); ++i) {
+			COSDictionary outputIntentDict = COSUtils.getAsDictionary(outputIntents.get(i), document.getDocument());
+			COSBase destOutputProfile = outputIntentDict.getItem(OUTPUT_INTENT_DICTIONARY_KEY_DEST_OUTPUT_PROFILE);
+			if (destOutputProfile != null) {
+				try {
+					PDStream stream = PDStream.createFromCOS(COSUtils.getAsStream(destOutputProfile, document.getDocument()));
+					if (stream != null) {
+						ICC_Profile iccp = ICC_Profile.getInstance(stream.getByteArray());
+						return new ICCProfileWrapper(iccp);
+					}
+				} catch (IllegalArgumentException e) {
+					throw new ValidationException("DestOutputProfile isn't a ICCProfile", e);
+				} catch (IOException e) {
+					throw new ValidationException("Unable to parse the ICCProfile", e);
+				}
+			}
+		}
+		return null;
+	}
+	
+	public static ICCProfileWrapper getOrSearchICCProfile(PreflightContext context) throws ValidationException {
+		ICCProfileWrapper profileWrapper = context.getIccProfileWrapper();
+		if (profileWrapper == null && !context.isIccProfileAlreadySearched()) {
+			profileWrapper = searchFirstICCProfile(context);
+			context.setIccProfileAlreadySearched(true);
+		}
+		return profileWrapper;
+	}
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/StandardColorSpaceHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/StandardColorSpaceHelper.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/StandardColorSpaceHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/StandardColorSpaceHelper.java Thu Jul 26 16:34:05 2012
@@ -73,8 +73,6 @@ public class StandardColorSpaceHelper im
 	protected StandardColorSpaceHelper(PreflightContext _context, PDColorSpace _cs) {
 		this.context = _context;
 		this.pdcs = _cs;
-
-		this.iccpw = this.context.getIccProfileWrapper();
 	}
 
 	/*
@@ -89,6 +87,7 @@ public class StandardColorSpaceHelper im
 			throw new ValidationException("Unable to create a PDColorSpace with the value null");
 		}
 
+		this.iccpw = ICCProfileWrapper.getOrSearchICCProfile(context);
 		processAllColorSpace(pdcs);
 	}
 

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/metadata/PDFAIdentificationValidation.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/metadata/PDFAIdentificationValidation.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/metadata/PDFAIdentificationValidation.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/metadata/PDFAIdentificationValidation.java Thu Jul 26 16:34:05 2012
@@ -62,7 +62,7 @@ public class PDFAIdentificationValidatio
     // According to the PDF/A specification, the prefix must be pdfaid for this schema.
     if (!id.getPrefix().equals(PDFAIdentificationSchema.IDPREFIX)) {
       if (metadata.getSchema(PDFAIdentificationSchema.IDPREFIX, XMPBasicSchema.XMPBASICURI) == null) {
-        ve.add(UnexpectedPrefixFoundError(id.getPrefix(),
+        ve.add(unexpectedPrefixFoundError(id.getPrefix(),
             PDFAIdentificationSchema.IDPREFIX, PDFAIdentificationSchema.class.getName()));
       } else {
         id = (PDFAIdentificationSchema) metadata.getSchema(
@@ -83,7 +83,7 @@ public class PDFAIdentificationValidatio
    * @param schema
    * @return
    */
-  protected ValidationError UnexpectedPrefixFoundError(String prefFound, String prefExpected, String schema) {
+  protected ValidationError unexpectedPrefixFoundError(String prefFound, String prefExpected, String schema) {
     StringBuilder sb = new StringBuilder(80);
     sb.append(schema).append(" found but prefix used is '").append(prefFound)
         .append("', prefix '").append(prefExpected).append("' is expected.");

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/metadata/SynchronizedMetaDataValidation.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/metadata/SynchronizedMetaDataValidation.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/metadata/SynchronizedMetaDataValidation.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/metadata/SynchronizedMetaDataValidation.java Thu Jul 26 16:34:05 2012
@@ -425,7 +425,7 @@ public class SynchronizedMetaDataValidat
    * @param schema
    * @return
    */
-  protected ValidationError UnexpectedPrefixFoundError(String prefFound,
+  protected ValidationError unexpectedPrefixFoundError(String prefFound,
       String prefExpected, String schema) {
     StringBuilder sb = new StringBuilder(80);
     sb.append(schema).append(" found but prefix used is '").append(prefFound)

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/CatalogValidationProcess.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/CatalogValidationProcess.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/CatalogValidationProcess.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/CatalogValidationProcess.java Thu Jul 26 16:34:05 2012
@@ -249,7 +249,7 @@ public class CatalogValidationProcess ex
 			if (efs != null) {
 				addValidationError(ctx, 
 						new ValidationError(ERROR_SYNTAX_TRAILER_CATALOG_EMBEDDEDFILES,
-						"EmbeddedFile entry is present in the Names dictionary"));
+								"EmbeddedFile entry is present in the Names dictionary"));
 			}
 		}
 	}
@@ -264,7 +264,7 @@ public class CatalogValidationProcess ex
 		if (catalog.getOCProperties() != null) {
 			addValidationError(ctx, 
 					new ValidationError(ERROR_SYNTAX_TRAILER_CATALOG_OCPROPERTIES, 
-					"A Catalog shall not contain the OCPProperties entry."));
+							"A Catalog shall not contain the OCPProperties entry."));
 		}
 	}
 
@@ -294,14 +294,14 @@ public class CatalogValidationProcess ex
 			if (outputIntentDict == null) {
 				addValidationError(ctx, 
 						new ValidationError(ERROR_GRAPHIC_OUTPUT_INTENT_INVALID_ENTRY,
-						"OutputIntent object is null or isn't a dictionary"));
+								"OutputIntent object is null or isn't a dictionary"));
 			} else {
 				// S entry is mandatory and must be equals to GTS_PDFA1
 				String sValue = outputIntentDict.getNameAsString(OUTPUT_INTENT_DICTIONARY_KEY_S);
 				if (!OUTPUT_INTENT_DICTIONARY_VALUE_GTS_PDFA1.equals(sValue)) {
 					addValidationError(ctx, 
 							new ValidationError(ERROR_GRAPHIC_OUTPUT_INTENT_S_VALUE_INVALID,
-							"The S entry of the OutputIntent isn't GTS_PDFA1"));
+									"The S entry of the OutputIntent isn't GTS_PDFA1"));
 					continue;
 				}
 
@@ -310,7 +310,7 @@ public class CatalogValidationProcess ex
 				if (outputConditionIdentifier == null) {// empty string is authorized (it may be an application specific value)
 					addValidationError(ctx, 
 							new ValidationError(ERROR_GRAPHIC_OUTPUT_INTENT_INVALID_ENTRY,
-							"The OutputIntentCondition is missing"));
+									"The OutputIntentCondition is missing"));
 					continue;
 				}
 
@@ -324,7 +324,7 @@ public class CatalogValidationProcess ex
 				 */
 				COSBase destOutputProfile = outputIntentDict.getItem(OUTPUT_INTENT_DICTIONARY_KEY_DEST_OUTPUT_PROFILE);
 				validateICCProfile(destOutputProfile, tmpDestOutputProfile, ctx);
-				
+
 				PreflightConfiguration config = ctx.getConfig();
 				if (config.isLazyValidation() && !isStandardICCCharacterization(outputConditionIdentifier)) {
 					String info = outputIntentDict.getString(COSName.getPDFName(OUTPUT_INTENT_DICTIONARY_KEY_INFO));
@@ -339,6 +339,7 @@ public class CatalogValidationProcess ex
 		}
 	}
 
+
 	/**
 	 * This method checks the destOutputProfile which must be a valid ICCProfile.
 	 * 

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/StreamValidationProcess.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/StreamValidationProcess.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/StreamValidationProcess.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/StreamValidationProcess.java Thu Jul 26 16:34:05 2012
@@ -28,7 +28,6 @@ import static org.apache.pdfbox.prefligh
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.commons.io.IOUtils;
@@ -41,7 +40,6 @@ import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.persistence.util.COSObjectKey;
 import org.apache.pdfbox.preflight.PreflightContext;
-import org.apache.pdfbox.preflight.ValidationResult;
 import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
 import org.apache.pdfbox.preflight.exception.ValidationException;
 import org.apache.pdfbox.preflight.utils.COSUtils;
@@ -96,19 +94,11 @@ public class StreamValidationProcess ext
 			if (COSUtils.isArray(bFilter, cosDocument)) {
 				COSArray afName = (COSArray) bFilter;
 				for (int i = 0; i < afName.size(); ++i) {
-					List<ValidationError> errorFIlters = new ArrayList<ValidationResult.ValidationError>();
-					if (!FilterHelper.isAuthorizedFilter(afName.getString(i), errorFIlters)) {
-						addValidationErrors(context, errorFIlters);
-						return;
-					}
+					FilterHelper.isAuthorizedFilter(context, afName.getString(i));
 				}
 			} else if (bFilter instanceof COSName) {
 				String fName = ((COSName) bFilter).getName();
-				List<ValidationError> errorFIlters = new ArrayList<ValidationResult.ValidationError>();
-				if (!FilterHelper.isAuthorizedFilter(fName, errorFIlters)) {
-					addValidationErrors(context, errorFIlters);
-					return;
-				}
+				FilterHelper.isAuthorizedFilter(context, fName);
 			} else {
 				// ---- The filter type is invalid
 				addValidationError(context, new ValidationError(ERROR_SYNTAX_STREAM_INVALID_FILTER,	"Filter should be a Name or an Array"));

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/COSUtils.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/COSUtils.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/COSUtils.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/COSUtils.java Thu Jul 26 16:34:05 2012
@@ -39,7 +39,7 @@ import org.apache.pdfbox.persistence.uti
 
 public class COSUtils {
 
-	public static final Logger logger = Logger.getLogger(COSUtils.class);
+	public static final Logger LOGGER = Logger.getLogger(COSUtils.class);
 
 	  /**
 	   * return true if the elt is a COSDictionary or a reference to a COSDictionary
@@ -380,7 +380,7 @@ public class COSUtils {
 	        document.close();
 	      }
 	    } catch (IOException e) {
-	      logger.warn("Error occured during the close of a COSDocument : "
+	      LOGGER.warn("Error occured during the close of a COSDocument : "
 	          + e.getMessage());
 	    }
 	  }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/FilterHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/FilterHelper.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/FilterHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/FilterHelper.java Thu Jul 26 16:34:05 2012
@@ -39,36 +39,34 @@ import static org.apache.padaf.preflight
 import static org.apache.padaf.preflight.ValidationConstants.STREAM_DICTIONARY_VALUE_FILTER_LZW;
 import static org.apache.padaf.preflight.ValidationConstants.STREAM_DICTIONARY_VALUE_FILTER_RUN;
 
-import java.util.List;
-
+import org.apache.pdfbox.preflight.PreflightContext;
+import org.apache.pdfbox.preflight.PreflightDocument;
 import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
 
 
 public class FilterHelper {
 
 	/**
-	 * This method checks if the filter is authorized for a PDF/A file.
-	 * According to the PDF/A-1 specification, only the LZW filter is forbidden due to
+	 * This method checks if the filter is authorized for the PDF file according to the preflight document specification attribute.
+	 * For example according to the PDF/A-1 specification, only the LZW filter is forbidden due to
 	 * Copyright compatibility. Because of the PDF/A is based on the PDF1.4 specification, 
 	 * all filters that aren't declared in the PDF Reference Third Edition are rejected. 
 	 * 
+	 * @param context the preflight context
 	 * @param filter the filter to checks
-	 * @param errors the list of validation errors
-	 * @return true if the filter is authorized, false otherwise.
 	 */
-	public static boolean isAuthorizedFilter(String filter, List<ValidationError> errors) {
-		String errorCode = isAuthorizedFilter(filter);
-		if (errorCode != null) {
-			// --- LZW is forbidden.
-			if ( ERROR_SYNTAX_STREAM_INVALID_FILTER.equals(errorCode) ) {
-				errors.add(new ValidationError(ERROR_SYNTAX_STREAM_INVALID_FILTER, "LZWDecode is forbidden"));
-				return false;
-			} else {
-				errors.add(new ValidationError(ERROR_SYNTAX_STREAM_UNDEFINED_FILTER, "This filter isn't defined in the PDF Reference Third Edition : "+filter));
-				return false;				
-			}
+	public static void isAuthorizedFilter(PreflightContext context, String filter) {
+		PreflightDocument preflightDocument = context.getDocument();
+		switch (preflightDocument.getSpecification()) {
+		case PDF_A1A:
+			isAuthorizedFilterInPDFA(context, filter);		
+			break;
+
+		default:
+			// PDF/A-1b is the default format
+			isAuthorizedFilterInPDFA(context, filter);		
+			break;
 		}
-		return true;
 	}
 
 	/**
@@ -77,14 +75,14 @@ public class FilterHelper {
 	 * Copyright compatibility. Because of the PDF/A is based on the PDF1.4 specification, 
 	 * all filters that aren't declared in the PDF Reference Third Edition are rejected. 
 	 * 
+	 * @param context
 	 * @param filter
-	 * @return null if validation succeed, the errorCode if the validation failed
 	 */
-	public static String isAuthorizedFilter(String filter) {
+	public static void isAuthorizedFilterInPDFA(PreflightContext context, String filter) {
 		if (filter != null) {
 			// --- LZW is forbidden.
 			if (STREAM_DICTIONARY_VALUE_FILTER_LZW.equals(filter) || INLINE_DICTIONARY_VALUE_FILTER_LZW.equals(filter) ) {
-				return ERROR_SYNTAX_STREAM_INVALID_FILTER;
+				context.addValidationError(new ValidationError(ERROR_SYNTAX_STREAM_INVALID_FILTER, "LZWDecode is forbidden"));
 			}
 
 			// --- Filters declared in the PDF Reference for PDF 1.4
@@ -103,11 +101,10 @@ public class FilterHelper {
 			definedFilter = definedFilter || INLINE_DICTIONARY_VALUE_FILTER_CCITTFF.equals(filter);
 			definedFilter = definedFilter || INLINE_DICTIONARY_VALUE_FILTER_DCT.equals(filter);
 			definedFilter = definedFilter || INLINE_DICTIONARY_VALUE_FILTER_RUN.equals(filter);
-			
+
 			if (!definedFilter) {
-				return ERROR_SYNTAX_STREAM_UNDEFINED_FILTER;
+				context.addValidationError(new ValidationError(ERROR_SYNTAX_STREAM_UNDEFINED_FILTER, "This filter isn't defined in the PDF Reference Third Edition : "+filter));
 			}
 		}
-		return null;
 	}
 }

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/PdfElementParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/PdfElementParser.java?rev=1366075&r1=1366074&r2=1366075&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/PdfElementParser.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/utils/PdfElementParser.java Thu Jul 26 16:34:05 2012
@@ -35,15 +35,15 @@ public class PdfElementParser extends Ba
   /**
    * Create the PDFElementParser object.
    * 
-   * @param cd
+   * @param cosDocument
    *          a COSDocument which will be used to parse the byte array
    * @param input
    *          the byte array to parse
    * @throws IOException
    */
-  public PdfElementParser(COSDocument cd, byte[] input) throws IOException {
+  public PdfElementParser(COSDocument cosDocument, byte[] input) throws IOException {
     super(input);
-    this.document = cd;
+    this.document = cosDocument;
   }
 
   /**