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()));
             }
         }
     }