You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2012/12/22 15:59:43 UTC
svn commit: r1425292 - in
/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight: content/
font/descriptor/
Author: leleueri
Date: Sat Dec 22 14:59:43 2012
New Revision: 1425292
URL: http://svn.apache.org/viewvc?rev=1425292&view=rev
Log:
[https://issues.apache.org/jira/browse/PDFBOX-1449] When an error is found in a ContentStream, the process continue to display as much errors as possible
Modified:
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamWrapper.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/FontDescriptorHelper.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java Sat Dec 22 14:59:43 2012
@@ -50,6 +50,7 @@ import org.apache.pdfbox.pdmodel.graphic
import org.apache.pdfbox.pdmodel.graphics.color.PDLab;
import org.apache.pdfbox.preflight.PreflightConfiguration;
import org.apache.pdfbox.preflight.PreflightContext;
+import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
import org.apache.pdfbox.preflight.exception.ValidationException;
import org.apache.pdfbox.preflight.graphic.ColorSpaceHelper;
import org.apache.pdfbox.preflight.graphic.ColorSpaceHelperFactory;
@@ -242,8 +243,9 @@ public abstract class ContentStreamEngin
}
if (!RenderingIntents.contains(riArgument0)) {
- throwContentStreamException("Unexpected value '" + arguments.get(0)
+ registerError("Unexpected value '" + arguments.get(0)
+ "' for ri operand. ", ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+ return;
}
}
}
@@ -257,7 +259,8 @@ public abstract class ContentStreamEngin
if ("q".equals(operator.getOperation())) {
int numberOfGraphicStates = this.getGraphicsStack().size();
if (numberOfGraphicStates > MAX_GRAPHIC_STATES) {
- throwContentStreamException("Too many graphic states", ERROR_GRAPHIC_TOO_MANY_GRAPHIC_STATES);
+ registerError("Too many graphic states", ERROR_GRAPHIC_TOO_MANY_GRAPHIC_STATES);
+ return;
}
}
}
@@ -318,8 +321,8 @@ public abstract class ContentStreamEngin
}
if (cs == null) {
- throwContentStreamException("The ColorSpace is unknown",
- ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+ registerError("The ColorSpace is unknown", ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+ return;
}
}
@@ -348,25 +351,28 @@ public abstract class ContentStreamEngin
if ("rg".equals(operation) || "RG".equals(operation)) {
if (!validColorSpace(cs, ColorSpaceType.RGB)) {
- throwContentStreamException("The operator \"" + operation
+ registerError("The operator \"" + operation
+ "\" can't be used with CMYK Profile",
ERROR_GRAPHIC_INVALID_COLOR_SPACE_RGB);
+ return;
}
}
if ("k".equals(operation) || "K".equals(operation)) {
if (!validColorSpace(cs, ColorSpaceType.CMYK)) {
- throwContentStreamException("The operator \"" + operation
+ registerError("The operator \"" + operation
+ "\" can't be used with RGB Profile",
ERROR_GRAPHIC_INVALID_COLOR_SPACE_CMYK);
+ return;
}
}
if ("g".equals(operation) || "G".equals(operation)) {
if (!validColorSpace(cs, ColorSpaceType.ALL)) {
- throwContentStreamException("The operator \"" + operation
+ registerError("The operator \"" + operation
+ "\" can't be used without Color Profile",
ERROR_GRAPHIC_INVALID_COLOR_SPACE_MISSING);
+ return;
}
}
@@ -376,9 +382,10 @@ public abstract class ContentStreamEngin
|| "b*".equals(operation)) {
if (!validColorSpace(cs, ColorSpaceType.ALL)) {
// The default fill color needs an OutputIntent
- throwContentStreamException("The operator \"" + operation
+ registerError("The operator \"" + operation
+ "\" can't be used without Color Profile",
ERROR_GRAPHIC_INVALID_COLOR_SPACE_MISSING);
+ return;
}
}
}
@@ -504,8 +511,8 @@ public abstract class ContentStreamEngin
} else if (arguments.get(0) instanceof COSName) {
colorSpaceName = ((COSName) arguments.get(0)).getName();
} else {
- throwContentStreamException("The operand doesn't have the expected type",
- ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+ registerError("The operand doesn't have the expected type", ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+ return;
}
ColorSpaceHelper csHelper = null;
@@ -528,7 +535,8 @@ public abstract class ContentStreamEngin
}
if (cs == null) {
- throwContentStreamException("The ColorSpace is unknown", ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+ registerError("The ColorSpace is unknown", ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
+ return;
}
if (csHelper == null) {
@@ -542,17 +550,13 @@ public abstract class ContentStreamEngin
}
/**
- * Build a ContentStreamException using the given parameters
+ * Add a validation error into the PreflightContext
*
- * @param msg
- * exception details
- * @param errorCode
- * the error code.
- * @throws ContentStreamException
+ * @param msg exception details
+ * @param errorCode the error code.
*/
- protected void throwContentStreamException(String msg, String errorCode) throws ContentStreamException {
- ContentStreamException cex = new ContentStreamException(msg);
- cex.setErrorCode(errorCode);
- throw cex;
+ protected void registerError(String msg, String errorCode) {
+ ValidationError error = new ValidationError(errorCode, msg);
+ this.context.addValidationError(error);
}
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamWrapper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamWrapper.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamWrapper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamWrapper.java Sat Dec 22 14:59:43 2012
@@ -144,8 +144,9 @@ public class ContentStreamWrapper extend
processor.setContext(this);
processor.process(operator, arguments);
} else {
- throwContentStreamException("The operator \"" + operation
+ registerError("The operator \"" + operation
+ "\" isn't supported.", ERROR_SYNTAX_CONTENT_STREAM_UNSUPPORTED_OP);
+ return;
}
/*
@@ -207,35 +208,35 @@ public class ContentStreamWrapper extend
*/
if ("\"".equals(operator.getOperation())) {
if (arguments.size() != 3) {
- throwContentStreamException("Invalid argument for the operator : "
- + operator.getOperation(),
- ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+ registerError("Invalid argument for the operator : "
+ + operator.getOperation(), ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+ return;
}
Object arg0 = arguments.get(0);
Object arg1 = arguments.get(1);
Object arg2 = arguments.get(2);
if (!(arg0 instanceof COSInteger || arg0 instanceof COSFloat) ||
!(arg1 instanceof COSInteger || arg1 instanceof COSFloat) ) {
- throwContentStreamException("Invalid argument for the operator : "
- + operator.getOperation(),
- ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+ registerError("Invalid argument for the operator : "
+ + operator.getOperation(), ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+ return;
}
if (arg2 instanceof COSString) {
validText(((COSString) arg2).getBytes());
} else {
- throwContentStreamException("Invalid argument for the operator : "
- + operator.getOperation(),
- ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+ registerError("Invalid argument for the operator : "
+ + operator.getOperation(), ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+ return;
}
} else {
Object objStr = arguments.get(0);
if (objStr instanceof COSString) {
validText(((COSString) objStr).getBytes());
} else if (!(objStr instanceof COSInteger)) {
- throwContentStreamException("Invalid argument for the operator : "
- + operator.getOperation(),
- ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+ registerError("Invalid argument for the operator : "
+ + operator.getOperation(), ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+ return;
}
}
}
@@ -259,8 +260,9 @@ public class ContentStreamWrapper extend
} else if (object instanceof COSString) {
validText(((COSString) object).getBytes());
} else if (!(object instanceof COSInteger || object instanceof COSFloat)) {
- throwContentStreamException("Invalid argument for the operator : "
+ registerError("Invalid argument for the operator : "
+ operator.getOperation(), ERROR_SYNTAX_CONTENT_STREAM_INVALID_ARGUMENT);
+ return;
}
}
}
@@ -282,10 +284,10 @@ public class ContentStreamWrapper extend
PDTextState textState = getGraphicsState().getTextState();
final int renderingMode = textState.getRenderingMode();
final PDFont font = textState.getFont();
-
if (font == null) {
// Unable to decode the Text without Font
- throwContentStreamException("Text operator can't be process without Font", ERROR_FONTS_UNKNOWN_FONT_REF);
+ registerError("Text operator can't be process without Font", ERROR_FONTS_UNKNOWN_FONT_REF);
+ return;
}
FontContainer fontContainer = context.getFontContainer(font.getCOSObject());
@@ -294,10 +296,15 @@ public class ContentStreamWrapper extend
return ;
} else if (fontContainer == null) {
// Font Must be embedded if the RenderingMode isn't 3
- throwContentStreamException(font.getBaseFont() + " is unknown wasn't found by the FontHelperValdiator", ERROR_FONTS_UNKNOWN_FONT_REF);
- } else if (!fontContainer.isValid() && ! fontContainer.errorsAleadyMerged()) {
+ registerError(font.getBaseFont() + " is unknown wasn't found by the FontHelperValdiator", ERROR_FONTS_UNKNOWN_FONT_REF);
+ return;
+ } else if (!fontContainer.isValid() && !fontContainer.errorsAleadyMerged()) {
context.addValidationErrors(fontContainer.getAllErrors());
fontContainer.setErrorsAleadyMerged(true);
+ return;
+ } if (!fontContainer.isValid() && fontContainer.errorsAleadyMerged()) {
+ // font already computed
+ return;
}
@@ -314,15 +321,14 @@ public class ContentStreamWrapper extend
codeLength++;
cid = font.encodeToCID(string, i, codeLength);
}
- } catch (IOException e) {
- throwContentStreamException("Encoding can't interpret the character code", ERROR_FONTS_ENCODING_ERROR);
- }
-
- try {
fontContainer.checkGlyphWith(cid);
+ } catch (IOException e) {
+ registerError("Encoding can't interpret the character code", ERROR_FONTS_ENCODING_ERROR);
+ return;
} catch (GlyphException e) {
if (renderingMode != 3) {
- throwContentStreamException(e.getMessage(), e.getErrorCode());
+ registerError(e.getMessage(), e.getErrorCode());
+ return;
}
}
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java Sat Dec 22 14:59:43 2012
@@ -63,7 +63,7 @@ public class CIDType0DescriptorHelper ex
*/
COSStream stream = ff3.getStream();
if (stream == null) {
- this.fContainer.push(new ValidationError( ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is missing"));
+ this.fContainer.push(new ValidationError( ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is missing for " + fontDescriptor.getFontName()));
this.fContainer.notEmbedded();
} else {
/*
@@ -72,7 +72,7 @@ public class CIDType0DescriptorHelper ex
*/
String st = stream.getNameAsString(COSName.SUBTYPE);
if (!(FONT_DICTIONARY_VALUE_TYPE0C.equals(st) || FONT_DICTIONARY_VALUE_TYPE1C.equals(st))) {
- this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile3 stream doesn't have the right Subtype"));
+ this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile3 stream doesn't have the right Subtype for " + fontDescriptor.getFontName()));
}
checkCIDSet(fontDescriptor);
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java Sat Dec 22 14:59:43 2012
@@ -77,7 +77,7 @@ public class CIDType2DescriptorHelper ex
*/
COSStream stream = ff2.getStream();
if (stream == null) {
- this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is missing"));
+ this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is missing for " + fontDescriptor.getFontName()));
this.fContainer.notEmbedded();
}
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/FontDescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/FontDescriptorHelper.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/FontDescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/FontDescriptorHelper.java Sat Dec 22 14:59:43 2012
@@ -69,7 +69,7 @@ public abstract class FontDescriptorHelp
protected PDFont font;
protected PDFontDescriptorDictionary fontDescriptor;
-
+
public FontDescriptorHelper(PreflightContext context, PDFont font, T fontContainer) {
super();
this.fContainer = fontContainer;
@@ -82,7 +82,7 @@ public abstract class FontDescriptorHelp
// Only a PDFontDescriptorDictionary provides a way to embedded the font program.
if(fd != null && fd instanceof PDFontDescriptorDictionary) {
fontDescriptor = (PDFontDescriptorDictionary)fd;
-
+
if (checkMandatoryFields(fontDescriptor.getCOSDictionary())) {
if (hasOnlyOneFontFile(fontDescriptor)) {
PDStream fontFile = extractFontFile(fontDescriptor);
@@ -91,7 +91,12 @@ public abstract class FontDescriptorHelp
checkFontFileMetaData(fontDescriptor, fontFile);
}
} else {
- this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "They are more than one FontFile"));
+ if (fontFileNotEmbedded(fontDescriptor)) {
+ this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "FontFile entry is missing from FontDescriptor for " + fontDescriptor.getFontName()));
+ this.fContainer.notEmbedded();
+ } else {
+ this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "They are more than one FontFile for " + fontDescriptor.getFontName()));
+ }
}
}
} else {
@@ -130,6 +135,13 @@ public abstract class FontDescriptorHelp
return (ff1 != null ^ ff2 != null ^ ff3 != null);
}
+ protected boolean fontFileNotEmbedded(PDFontDescriptorDictionary fontDescriptor) {
+ PDStream ff1 = fontDescriptor.getFontFile();
+ PDStream ff2 = fontDescriptor.getFontFile2();
+ PDStream ff3 = fontDescriptor.getFontFile3();
+ return (ff1 == null && ff2 == null && ff3 == null);
+ }
+
protected abstract void processFontFile(PDFontDescriptorDictionary fontDescriptor, PDStream fontFile);
/**
@@ -142,7 +154,7 @@ public abstract class FontDescriptorHelp
PDMetadata metadata = null;
try {
metadata = fontFile.getMetadata();
-
+
if (metadata != null) {
// Filters are forbidden in a XMP stream
if (metadata.getFilters() != null && !metadata.getFilters().isEmpty()) {
@@ -177,7 +189,7 @@ public abstract class FontDescriptorHelp
this.fContainer.push(new ValidationError(ERROR_METADATA_FORMAT_UNKOWN, "The Metadata entry doesn't reference a stream object"));
}
}
-
+
protected final byte[] getMetaDataStreamAsBytes(PDMetadata metadata) {
byte[] result = null;
ByteArrayOutputStream bos = null;
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java Sat Dec 22 14:59:43 2012
@@ -50,13 +50,13 @@ public class TrueTypeDescriptorHelper ex
PDStream fontFile = fontDescriptor.getFontFile2();
COSStream stream = (fontFile == null ? null : fontFile.getStream());
if (stream == null) {
- this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile2 is missing"));
+ this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile2 is missing for " + fontDescriptor.getFontName()));
this.fContainer.notEmbedded();
return null;
}
if (stream.getInt(COSName.LENGTH1) <= 0) {
- this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile entry /Length1 is invalid"));
+ this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile entry /Length1 is invalid for " + fontDescriptor.getFontName()));
return null;
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java?rev=1425292&r1=1425291&r2=1425292&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java Sat Dec 22 14:59:43 2012
@@ -82,7 +82,7 @@ public class Type1DescriptorHelper exten
if (ff1 != null) {
COSStream stream = ff1.getStream();
if (stream == null) {
- this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is missing"));
+ this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is missing for " + fontDescriptor.getFontName()));
this.fContainer.notEmbedded();
return null;
}
@@ -91,7 +91,7 @@ public class Type1DescriptorHelper exten
boolean hasLength2 = stream.getInt(COSName.getPDFName(FONT_DICTIONARY_KEY_LENGTH2)) > 0;
boolean hasLength3 = stream.getInt(COSName.getPDFName(FONT_DICTIONARY_KEY_LENGTH3)) >= 0;
if (!(hasLength1 && hasLength2 && hasLength3)) {
- this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is invalid"));
+ this.fContainer.push(new ValidationError(ERROR_FONTS_FONT_FILEX_INVALID, "The FontFile is invalid for " + fontDescriptor.getFontName()));
return null;
}