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