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