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;
   }
 
   /**


Reply via email to