You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2015/02/25 20:50:56 UTC
svn commit: r1662297 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java
Author: jahewson
Date: Wed Feb 25 19:50:55 2015
New Revision: 1662297
URL: http://svn.apache.org/r1662297
Log:
PDFBOX-2128: Workaround CMYK bug in Sun's JPEG reader
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java?rev=1662297&r1=1662296&r2=1662297&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java Wed Feb 25 19:50:55 2015
@@ -23,17 +23,16 @@ import java.awt.image.WritableRaster;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.pdfbox.cos.COSDictionary;
-import org.w3c.dom.Element;
-
+import java.lang.reflect.Field;
import javax.imageio.IIOException;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageInputStream;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.w3c.dom.Element;
/**
* Decompresses data encoded using a DCT (discrete cosine transform)
@@ -91,9 +90,34 @@ final class DCTFilter extends Filter
catch (IIOException e)
{
// catches the error "Inconsistent metadata read from stream"
- // which seems to be present indicate a YCCK image, but who knows?
- LOG.warn("Inconsistent metadata read from JPEG stream");
- transform = 2; // YCCK
+ // if we're using the Sun decoder then can be caused by either a YCCK
+ // image or by a CMYK image which the decoder has problems reading
+ try
+ {
+ // if this is Sun's decoder, use reflection to determine if the
+ // color space is CMYK or YCCK
+ Field field = reader.getClass().getDeclaredField("colorSpaceCode");
+ field.setAccessible(true);
+ int colorSpaceCode = field.getInt(reader);
+
+ if (colorSpaceCode == 7 || colorSpaceCode == 8 || colorSpaceCode == 9) {
+ transform = 2; // YCCK
+ } else if (colorSpaceCode == 4) {
+ transform = 0; // CMYK
+ } else {
+ throw new IOException("Unexpected color space: " + colorSpaceCode);
+ }
+ }
+ catch (NoSuchFieldException e1)
+ {
+ // error from non-Sun JPEG decoder
+ throw e;
+ }
+ catch (IllegalAccessException e1)
+ {
+ // error from non-Sun JPEG decoder
+ throw e;
+ }
}
int colorTransform = transform != null ? transform : 0;