You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2016/02/28 10:59:00 UTC
svn commit: r1732709 - in /pdfbox/branches/1.8:
pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/
pdfbox/src/main/java/org/apache/pdfbox/util/
preflight/src/main/java/org/apache/pdfbox/preflight/content/
preflight/src/main/java/org/apache/...
Author: tilman
Date: Sun Feb 28 09:59:00 2016
New Revision: 1732709
URL: http://svn.apache.org/viewvc?rev=1732709&view=rev
Log:
PDFBOX-3251: Improve parsing and validation of ColorSpace for inline images, as done by Petras
Modified:
pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java
pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/util/ImageParameters.java
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/ColorSpaces.java
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/DeviceColorSpaceHelper.java
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/StandardColorSpaceHelper.java
pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/xobject/XObjImageValidator.java
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java?rev=1732709&r1=1732708&r2=1732709&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java Sun Feb 28 09:59:00 2016
@@ -30,7 +30,6 @@ import org.apache.pdfbox.cos.COSObject;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.graphics.pattern.PDPatternResources;
import org.apache.pdfbox.pdmodel.common.PDStream;
-import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
/**
* This class represents a color space in a pdf document.
@@ -128,8 +127,7 @@ public final class PDColorSpaceFactory
{
retval = new PDDeviceN( array );
}
- else if( name.equals( PDIndexed.NAME ) ||
- name.equals( PDIndexed.ABBREVIATED_NAME ))
+ else if( name.equals( PDIndexed.NAME ) )
{
retval = new PDIndexed( array );
}
@@ -189,24 +187,21 @@ public final class PDColorSpaceFactory
throws IOException
{
PDColorSpace cs = null;
- if( colorSpaceName.equals( PDDeviceCMYK.NAME ) ||
- colorSpaceName.equals( PDDeviceCMYK.ABBREVIATED_NAME ) )
+ if( colorSpaceName.equals( PDDeviceCMYK.NAME ) )
{
cs = PDDeviceCMYK.INSTANCE;
}
- else if( colorSpaceName.equals( PDDeviceRGB.NAME ) ||
- colorSpaceName.equals( PDDeviceRGB.ABBREVIATED_NAME ) )
+ else if( colorSpaceName.equals( PDDeviceRGB.NAME ) )
{
cs = PDDeviceRGB.INSTANCE;
}
- else if( colorSpaceName.equals( PDDeviceGray.NAME ) ||
- colorSpaceName.equals( PDDeviceGray.ABBREVIATED_NAME ))
+ else if( colorSpaceName.equals( PDDeviceGray.NAME ) )
{
cs = new PDDeviceGray();
}
else if( colorSpaces != null && colorSpaces.get( colorSpaceName ) != null )
{
- cs = (PDColorSpace)colorSpaces.get( colorSpaceName );
+ cs = colorSpaces.get( colorSpaceName );
}
else if( colorSpaceName.equals( PDLab.NAME ) )
{
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/util/ImageParameters.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/util/ImageParameters.java?rev=1732709&r1=1732708&r2=1732709&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/util/ImageParameters.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/util/ImageParameters.java Sun Feb 28 09:59:00 2016
@@ -19,7 +19,7 @@ package org.apache.pdfbox.util;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
-import org.apache.pdfbox.cos.COSInteger;
+import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSNumber;
@@ -139,12 +139,72 @@ public class ImageParameters
PDColorSpace retval = null;
if( cs != null )
{
- retval = PDColorSpaceFactory.createColorSpace( cs, colorSpaces );
+ retval = createColorSpace( cs, colorSpaces );
}
return retval;
}
/**
+ * This will create the correct color space for the given name.
+ * This method is specific for parsing the color space specified within the content stream of inline image.
+ *
+ * @param cs the object denoting the color space (the name or array)
+ * @param colorSpaces The ColorSpace dictionary from the current resources, if any.
+ *
+ * @return The color space.
+ * @throws IOException If the color space name is unknown.
+ */
+ private PDColorSpace createColorSpace(COSBase cs, Map colorSpaces) throws IOException
+ {
+ if (cs instanceof COSName)
+ {
+ return PDColorSpaceFactory.createColorSpace( toLongName(cs), colorSpaces );
+ }
+
+ // In InlinedImage only DeviceGray/RGB/CMYK and restricted Indexed color spaces are allowed.
+ if (cs instanceof COSArray && ((COSArray) cs).size() == 4 && ((COSArray) cs).get(3) instanceof COSString)
+ {
+ COSArray srcArray = (COSArray) cs;
+ COSBase csType = srcArray.get(0);
+ if (COSName.I.equals(csType) || COSName.INDEXED.equals(csType))
+ {
+ COSArray dstArray = new COSArray();
+ dstArray.addAll(srcArray);
+ dstArray.set(0, COSName.INDEXED);
+ dstArray.set(1, toLongName(srcArray.get(1)));
+ return PDColorSpaceFactory.createColorSpace( dstArray, colorSpaces );
+ }
+
+ throw new IOException("Illegal type of inline image color space: " + csType);
+ }
+
+ throw new IOException("Illegal type of object for inline image color space: " + cs);
+ }
+
+ /**
+ * Deliver the long name of a device colorspace, or the parameter
+ *
+ * @param cs the color space name object
+ * @return
+ */
+ private COSBase toLongName(COSBase cs)
+ {
+ if (COSName.getPDFName("RGB").equals(cs))
+ {
+ return COSName.DEVICERGB;
+ }
+ if (COSName.getPDFName("CMYK").equals(cs))
+ {
+ return COSName.DEVICECMYK;
+ }
+ if (COSName.getPDFName("G").equals(cs))
+ {
+ return COSName.DEVICEGRAY;
+ }
+ return cs;
+ }
+
+ /**
* This will set the color space for this image.
*
* @param cs The color space for this image.
Modified: pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java?rev=1732709&r1=1732708&r2=1732709&view=diff
==============================================================================
--- pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java (original)
+++ pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java Sun Feb 28 09:59:00 2016
@@ -24,6 +24,7 @@ package org.apache.pdfbox.preflight.cont
import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_GRAPHIC_INVALID_COLOR_SPACE_CMYK;
import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_GRAPHIC_INVALID_COLOR_SPACE_MISSING;
import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_GRAPHIC_INVALID_COLOR_SPACE_RGB;
+import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_GRAPHIC_INVALID_UNKNOWN_COLOR_SPACE;
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.MAX_GRAPHIC_STATES;
@@ -299,60 +300,31 @@ public abstract class ContentStreamEngin
*
* @param operator
* the InlinedImage object (BI to EI)
- * @throws ContentStreamException
+ * @throws ValidationException
*/
- protected void validImageColorSpace(PDFOperator operator) throws ContentStreamException, IOException
+ protected void validImageColorSpace(PDFOperator operator) throws ValidationException
{
COSDictionary dict = operator.getImageParameters().getDictionary();
- COSBase csInlinedBase = dict.getItem(COSName.CS);
- ColorSpaceHelper csHelper = null;
+ COSBase csInlinedBase = dict.getDictionaryObject(COSName.CS, COSName.COLORSPACE);
+ ColorSpaceHelper csHelper;
if (csInlinedBase != null)
{
- if (COSUtils.isString(csInlinedBase, cosDocument))
+ try
{
/*
* In InlinedImage only DeviceGray/RGB/CMYK and restricted Indexed color spaces are allowed.
*/
- String colorSpace = COSUtils.getAsString(csInlinedBase, cosDocument);
- ColorSpaces cs = null;
-
- try
- {
- cs = ColorSpaces.valueOf(colorSpace);
- }
- catch (IllegalArgumentException e)
- {
- // The color space is unknown. Try to access the resources dictionary,
- // the color space can be a reference.
- Map<String, PDColorSpace> colorSpaces = this.getResources().getColorSpaces();
- if (colorSpaces != null)
- {
- PDColorSpace pdCS = colorSpaces.get(colorSpace);
- if (pdCS != null)
- {
- cs = ColorSpaces.valueOf(pdCS.getName());
- PreflightConfiguration cfg = context.getConfig();
- ColorSpaceHelperFactory csFact = cfg.getColorSpaceHelperFact();
- csHelper = csFact.getColorSpaceHelper(context, pdCS, ColorSpaceRestriction.ONLY_DEVICE);
- }
- }
- }
-
- if (cs == null)
- {
- registerError("The ColorSpace " + colorSpace + " is unknown", ERROR_GRAPHIC_UNEXPECTED_VALUE_FOR_KEY);
- return;
- }
- }
-
- if (csHelper == null)
- {
- PDColorSpace pdCS = PDColorSpaceFactory.createColorSpace(csInlinedBase);
+ PDColorSpace pdCS = operator.getImageParameters().getColorSpace(this.getResources().getColorSpaces());
PreflightConfiguration cfg = context.getConfig();
ColorSpaceHelperFactory csFact = cfg.getColorSpaceHelperFact();
csHelper = csFact.getColorSpaceHelper(context, pdCS, ColorSpaceRestriction.ONLY_DEVICE);
}
+ catch (IOException e)
+ {
+ registerError(e.getMessage(), ERROR_GRAPHIC_INVALID_UNKNOWN_COLOR_SPACE);
+ return;
+ }
csHelper.validate();
}
@@ -361,7 +333,7 @@ public abstract class ContentStreamEngin
/**
* This method validates if the ColorOperator can be used with the color space defined in OutputIntent dictionaries.
*
- * @param operator
+ * @param operation
* the color operator
* @throws ContentStreamException
*/
Modified: pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/ColorSpaces.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/ColorSpaces.java?rev=1732709&r1=1732708&r2=1732709&view=diff
==============================================================================
--- pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/ColorSpaces.java (original)
+++ pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/ColorSpaces.java Sun Feb 28 09:59:00 2016
@@ -23,15 +23,14 @@ package org.apache.pdfbox.preflight.grap
/**
* This enum makes ColorSpaces validation easier. Labels represent ColorSpace names as defined in the
- * "PDF Reference 1.4". Enum entries with the "_SHORT" suffix are used to represent color spaces (DeviceGray, DeviceRGB,
- * DeviceCMYK and Indexed) using the InlinedImage notation.
+ * "PDF Reference 1.4".
*/
public enum ColorSpaces
{
- Lab("Lab"), CalRGB("CalRGB"), CalGray("CalGray"), DeviceN("DeviceN"), Indexed("Indexed"), I("I"), Pattern(
- "Pattern"), ICCBased("ICCBased"), DeviceRGB("DeviceRGB"), RGB("RGB"), DeviceGray("DeviceGray"), G(
- "G"), DeviceCMYK("DeviceCMYK"), CMYK("CMYK"), Separation("Separation");
+ Lab("Lab"), CalRGB("CalRGB"), CalGray("CalGray"), DeviceN("DeviceN"), Indexed("Indexed"),
+ Pattern("Pattern"), ICCBased("ICCBased"), DeviceRGB("DeviceRGB"), DeviceGray("DeviceGray"),
+ DeviceCMYK("DeviceCMYK"), Separation("Separation");
/**
* Name of the ColorSpace
@@ -50,14 +49,4 @@ public enum ColorSpaces
{
return label;
}
-
- /**
- * @param label
- * the label to set
- */
- public void setLabel(String label)
- {
- this.label = label;
- }
-
}
Modified: pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/DeviceColorSpaceHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/DeviceColorSpaceHelper.java?rev=1732709&r1=1732708&r2=1732709&view=diff
==============================================================================
--- pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/DeviceColorSpaceHelper.java (original)
+++ pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/DeviceColorSpaceHelper.java Sun Feb 28 09:59:00 2016
@@ -79,7 +79,6 @@ public class DeviceColorSpaceHelper exte
switch (colorSpace)
{
case Indexed:
- case I:
case Pattern:
context.addValidationError(new ValidationError(ERROR_GRAPHIC_INVALID_COLOR_SPACE_FORBIDDEN, colorSpace
.getLabel() + " ColorSpace is forbidden"));
Modified: pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/StandardColorSpaceHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/StandardColorSpaceHelper.java?rev=1732709&r1=1732708&r2=1732709&view=diff
==============================================================================
--- pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/StandardColorSpaceHelper.java (original)
+++ pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/StandardColorSpaceHelper.java Sun Feb 28 09:59:00 2016
@@ -104,11 +104,9 @@ public class StandardColorSpaceHelper im
switch (cs)
{
case DeviceRGB:
- case RGB:
processRGBColorSpace(pdcs);
break;
case DeviceCMYK:
- case CMYK:
processCYMKColorSpace(pdcs);
break;
case CalRGB:
@@ -117,7 +115,6 @@ public class StandardColorSpaceHelper im
processCalibratedColorSpace(pdcs);
break;
case DeviceGray:
- case G:
processGrayColorSpace(pdcs);
break;
case ICCBased:
@@ -127,7 +124,6 @@ public class StandardColorSpaceHelper im
processDeviceNColorSpace(pdcs);
break;
case Indexed:
- case I:
processIndexedColorSpace(pdcs);
break;
case Separation:
@@ -350,7 +346,7 @@ public class StandardColorSpaceHelper im
{
PDColorSpace based = indexed.getBaseColorSpace();
ColorSpaces cs = ColorSpaces.valueOf(based.getName());
- if (cs == ColorSpaces.Indexed || cs == ColorSpaces.I)
+ if (cs == ColorSpaces.Indexed)
{
context.addValidationError(new ValidationError(ERROR_GRAPHIC_INVALID_COLOR_SPACE_INDEXED,
"Indexed color space can't be used as Base color space"));
@@ -395,7 +391,6 @@ public class StandardColorSpaceHelper im
case DeviceN:
case Pattern:
case Indexed:
- case I:
context.addValidationError(new ValidationError(ERROR_GRAPHIC_INVALID_COLOR_SPACE_ALTERNATE, acs
.getLabel() + " color space can't be used as alternate color space"));
break;
Modified: pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/xobject/XObjImageValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/xobject/XObjImageValidator.java?rev=1732709&r1=1732708&r2=1732709&view=diff
==============================================================================
--- pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/xobject/XObjImageValidator.java (original)
+++ pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/xobject/XObjImageValidator.java Sun Feb 28 09:59:00 2016
@@ -149,7 +149,7 @@ public class XObjImageValidator extends
}
catch (IOException e)
{
- context.addValidationError(new ValidationError(ERROR_GRAPHIC_INVALID_UNKNOWN_COLOR_SPACE));
+ context.addValidationError(new ValidationError(ERROR_GRAPHIC_INVALID_UNKNOWN_COLOR_SPACE, e.getMessage()));
}
}
}