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/03/25 15:40:05 UTC
svn commit: r1305032 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java
Author: lehmi
Date: Sun Mar 25 13:40:05 2012
New Revision: 1305032
URL: http://svn.apache.org/viewvc?rev=1305032&view=rev
Log:
PDFBOX-817: use alternate colorspace if the icc profile can't be read
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java?rev=1305032&r1=1305031&r2=1305032&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java Sun Mar 25 13:40:05 2012
@@ -16,18 +16,19 @@
*/
package org.apache.pdfbox.pdmodel.graphics.color;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
-import org.apache.pdfbox.cos.COSInteger;
import org.apache.pdfbox.cos.COSFloat;
import org.apache.pdfbox.cos.COSName;
-import org.apache.pdfbox.cos.COSNumber;
import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.common.COSArrayList;
import org.apache.pdfbox.pdmodel.common.PDRange;
import org.apache.pdfbox.pdmodel.common.PDStream;
+import org.apache.pdfbox.util.operator.pagedrawer.Invoke;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
@@ -51,6 +52,13 @@ import java.util.List;
*/
public class PDICCBased extends PDColorSpace
{
+
+
+ /**
+ * Log instance.
+ */
+ private static final Log LOG = LogFactory.getLog(PDICCBased.class);
+
/**
* The name of this color space.
*/
@@ -60,6 +68,11 @@ public class PDICCBased extends PDColorS
private PDStream stream;
/**
+ * Number of color components.
+ */
+ private int numberOfComponents = -1;
+
+ /**
* Default constructor, creates empty stream.
*
* @param doc The document to store the icc data.
@@ -129,6 +142,24 @@ public class PDICCBased extends PDColorS
ICC_Profile iccProfile = ICC_Profile.getInstance( profile );
cSpace = new ICC_ColorSpace( iccProfile );
}
+ catch(IllegalArgumentException excpetion)
+ {
+ LOG.debug("Can't read ICC-profile, using alterbnate colorspace instead");
+ List colorspacesList = getAlternateColorSpaces();
+ if (colorspacesList != null && colorspacesList.size() > 0)
+ {
+ Object[] colorspaces = colorspacesList.toArray();
+ int numOfComponents = getNumberOfComponents();
+ for (int i=0;i<colorspaces.length;i++)
+ {
+ if (numberOfComponents == ((PDColorSpace)colorspaces[i]).getNumberOfComponents())
+ {
+ cSpace = ((PDColorSpace)colorspaces[i]).createColorSpace();
+ break;
+ }
+ }
+ }
+ }
finally
{
if( profile != null )
@@ -151,7 +182,25 @@ public class PDICCBased extends PDColorS
public ColorModel createColorModel( int bpc ) throws IOException
{
- int[] nbBits = { bpc, bpc, bpc, bpc }; //added 4th bpc to handle CMYK
+ int[] nbBits;
+ int numOfComponents = getNumberOfComponents();
+ switch (numOfComponents)
+ {
+ case 1:
+ // DeviceGray
+ nbBits = new int[]{ bpc };
+ break;
+ case 3:
+ // DeviceRGB
+ nbBits = new int[]{ bpc, bpc, bpc };
+ break;
+ case 4:
+ // DeviceCMYK
+ nbBits = new int[]{ bpc, bpc, bpc, bpc };
+ break;
+ default:
+ throw new IOException( "Unknown colorspace number of components:" + numOfComponents );
+ }
ComponentColorModel componentColorModel =
new ComponentColorModel( getJavaColorSpace(),
nbBits,
@@ -159,7 +208,6 @@ public class PDICCBased extends PDColorS
false,
Transparency.OPAQUE,
DataBuffer.TYPE_BYTE );
-
return componentColorModel;
}
@@ -174,8 +222,11 @@ public class PDICCBased extends PDColorS
*/
public int getNumberOfComponents() throws IOException
{
- COSNumber n = (COSNumber)stream.getStream().getDictionaryObject( COSName.N );
- return n.intValue();
+ if (numberOfComponents < 0)
+ {
+ numberOfComponents = stream.getStream().getInt(COSName.N);
+ }
+ return numberOfComponents;
}
/**
@@ -185,6 +236,7 @@ public class PDICCBased extends PDColorS
*/
public void setNumberOfComponents( int n )
{
+ numberOfComponents = n;
stream.getStream().setInt( COSName.N, n );
}