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 2014/01/19 12:39:15 UTC

svn commit: r1559486 - in /pdfbox/trunk/pdfbox: ./ src/main/java/org/apache/pdfbox/pdmodel/graphics/color/ src/main/resources/org/apache/pdfbox/resources/ src/main/resources/org/apache/pdfbox/resources/icc/ src/test/java/org/apache/pdfbox/pdmodel/edit/

Author: lehmi
Date: Sun Jan 19 11:39:15 2014
New Revision: 1559486

URL: http://svn.apache.org/r1559486
Log:
PDFBOX-1851: improved CMYK color space conversion as proposed by John Hewson

Added:
    pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/PDDeviceCMYK.properties   (with props)
    pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/icc/
    pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/icc/ISOcoated_v2_300_bas.icc   (with props)
Removed:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/ColorSpaceCMYK.java
Modified:
    pdfbox/trunk/pdfbox/pom.xml
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/edit/TestPDPageContentStream.java

Modified: pdfbox/trunk/pdfbox/pom.xml
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/pom.xml?rev=1559486&r1=1559485&r2=1559486&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/pom.xml (original)
+++ pdfbox/trunk/pdfbox/pom.xml Sun Jan 19 11:39:15 2014
@@ -78,6 +78,16 @@
       <resource>
         <directory>src/main/resources</directory>
         <filtering>true</filtering>
+        <includes>
+          <include>**/*.properties</include>
+        </includes>
+      </resource>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>false</filtering>
+        <excludes>
+          <exclude>**/*.properties</exclude>
+        </excludes>
       </resource>
     </resources>
     <plugins>
@@ -138,6 +148,7 @@
         <configuration>
           <excludes>
             <exclude>src/main/resources/org/apache/pdfbox/resources/cmap/*</exclude>
+            <exclude>src/main/resources/org/apache/pdfbox/resources/icc/*</exclude>
             <exclude>src/test/resources/input/rendering/*.ai</exclude>
             <exclude>src/test/resources/output/*</exclude>
             <exclude>release.properties</exclude>

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java?rev=1559486&r1=1559485&r2=1559486&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java Sun Jan 19 11:39:15 2014
@@ -211,24 +211,30 @@ public class PDColorState implements Clo
                     sMsg += "\nInterpretating as RGB";
                     break;
                 case 4: // CMYK
-                    // do a rough conversion to RGB as I'm not getting the CMYK to work.
-                    // http://www.codeproject.com/KB/applications/xcmyk.aspx
-                    float r,
-                    g,
-                    b,
-                    k;
-                    k = components[3];
-
-                    r = components[0] * (1f - k) + k;
-                    g = components[1] * (1f - k) + k;
-                    b = components[2] * (1f - k) + k;
-
-                    r = (1f - r);
-                    g = (1f - g);
-                    b = (1f - b);
-
-                    cGuess = new Color(r, g, b);
-                    sMsg += "\nInterpretating as CMYK";
+                    try
+                    {
+                        // try to use the default CMYK color profile
+                        float[] rgb = PDDeviceCMYK.INSTANCE.getJavaColorSpace().toRGB(components);
+                        cGuess = new Color(rgb[0], rgb[1], rgb[2]);
+                        sMsg += "\nInterpretating as CMYK using default ICC profile";
+                    }
+                    catch (Exception e1)
+                    {
+                        // fallback to naive conversion to RGB
+                        float r, g, b, k;
+                        k = components[3];
+
+                        r = components[0] * (1f - k) + k;
+                        g = components[1] * (1f - k) + k;
+                        b = components[2] * (1f - k) + k;
+
+                        r = (1f - r);
+                        g = (1f - g);
+                        b = (1f - b);
+
+                        cGuess = new Color(r, g, b);
+                        sMsg += "\nInterpretating as CMYK without ICC profile";
+                    }
                     break;
                 default:
 

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java?rev=1559486&r1=1559485&r2=1559486&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java Sun Jan 19 11:39:15 2014
@@ -16,20 +16,25 @@
  */
 package org.apache.pdfbox.pdmodel.graphics.color;
 
+import org.apache.pdfbox.io.IOUtils;
+import org.apache.pdfbox.util.ResourceLoader;
+
 import java.awt.color.ColorSpace;
+import java.awt.color.ICC_ColorSpace;
+import java.awt.color.ICC_Profile;
 import java.awt.image.ColorModel;
 import java.io.IOException;
 
 import java.awt.Transparency;
 import java.awt.image.ComponentColorModel;
 import java.awt.image.DataBuffer;
-
+import java.io.InputStream;
+import java.util.Properties;
 
 /**
  * This class represents a CMYK color space.
  *
  * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
- * @version $Revision: 1.6 $
  */
 public class PDDeviceCMYK extends PDColorSpace
 {
@@ -48,6 +53,28 @@ public class PDDeviceCMYK extends PDColo
      */
     public static final String ABBREVIATED_NAME = "CMYK";
 
+    /**
+     * The external resources
+     */
+    private static Properties defaultProfile = new Properties();
+
+    static
+    {
+        try
+        {
+            ResourceLoader.loadProperties(
+                    "org/apache/pdfbox/resources/PDDeviceCMYK.properties",
+                    defaultProfile);
+        }
+        catch (IOException io)
+        {
+            throw new RuntimeException("Error loading resources", io);
+        }
+    }
+
+    /**
+     * Constructs a new PDDeviceCMYK object.
+     */
     private PDDeviceCMYK()
     {
     }
@@ -79,9 +106,25 @@ public class PDDeviceCMYK extends PDColo
      *
      * @return A color space that can be used for Java AWT operations.
      */
-    protected ColorSpace createColorSpace()
+    protected ColorSpace createColorSpace() throws IOException
     {
-        return new ColorSpaceCMYK();
+        ColorSpace colorSpace;
+        InputStream profile = null;
+        try
+        {
+            profile = ResourceLoader.loadResource(defaultProfile.getProperty("DeviceCMYK"));
+            if (profile == null)
+            {
+                throw new IOException("Default CMYK color profile cannot be opened");
+            }
+            ICC_Profile iccProfile = ICC_Profile.getInstance(profile);
+            colorSpace = new ICC_ColorSpace(iccProfile);
+        }
+        finally
+        {
+            IOUtils.closeQuietly(profile);
+        }
+        return colorSpace;
     }
 
     /**
@@ -93,18 +136,18 @@ public class PDDeviceCMYK extends PDColo
      *
      * @throws IOException If there is an error creating the color model.
      */
-    public ColorModel createColorModel( int bpc ) throws IOException
+    public ColorModel createColorModel(int bpc) throws IOException
     {
 
         int[] nbBits = { bpc, bpc, bpc, bpc };
-        ComponentColorModel componentColorModel = 
-            new ComponentColorModel( getJavaColorSpace(), 
-                         nbBits, 
-                         false,                     
-                         false,              
-                         Transparency.OPAQUE,
-                         DataBuffer.TYPE_BYTE );
-           return componentColorModel;
+        ComponentColorModel componentColorModel =
+                new ComponentColorModel(getJavaColorSpace(),
+                        nbBits,
+                        false,
+                        false,
+                        Transparency.OPAQUE,
+                        DataBuffer.TYPE_BYTE);
+        return componentColorModel;
 
     }
 }

Added: pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/PDDeviceCMYK.properties
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/PDDeviceCMYK.properties?rev=1559486&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/PDDeviceCMYK.properties (added)
+++ pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/PDDeviceCMYK.properties Sun Jan 19 11:39:15 2014
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+###########################################################################
+
+# Adobe Acrobat uses "U.S. Web Coated (SWOP) v2" as the default
+# CMYK profile, however it is not available under an open license.
+# Instead, the "ISO Coated v2 300% (basICColor)" is used, which
+# is an open alternative to the "ISO Coated v2 300% (ECI)" profile.
+
+DeviceCMYK=org/apache/pdfbox/resources/icc/ISOcoated_v2_300_bas.icc

Propchange: pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/PDDeviceCMYK.properties
------------------------------------------------------------------------------
    svn:eol-style = native

Added: pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/icc/ISOcoated_v2_300_bas.icc
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/icc/ISOcoated_v2_300_bas.icc?rev=1559486&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/icc/ISOcoated_v2_300_bas.icc
------------------------------------------------------------------------------
    svn:mime-type = application/vnd.iccprofile

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/edit/TestPDPageContentStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/edit/TestPDPageContentStream.java?rev=1559486&r1=1559485&r2=1559486&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/edit/TestPDPageContentStream.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/edit/TestPDPageContentStream.java Sun Jan 19 11:39:15 2014
@@ -23,7 +23,7 @@ import org.apache.pdfbox.exceptions.COSV
 import org.apache.pdfbox.pdfparser.PDFStreamParser;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
-import org.apache.pdfbox.pdmodel.graphics.color.ColorSpaceCMYK;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceCMYK;
 import org.apache.pdfbox.util.PDFOperator;
 
 import java.awt.Color;
@@ -38,7 +38,7 @@ public class TestPDPageContentStream ext
     public void testSetCmykColors() throws IOException, COSVisitorException {
         PDDocument doc = new PDDocument();
 
-        ColorSpace colorSpace = new ColorSpaceCMYK();
+        ColorSpace colorSpace = PDDeviceCMYK.INSTANCE.getJavaColorSpace();
 
         PDPage page = new PDPage();
         doc.addPage(page);