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 2014/02/21 00:10:06 UTC

svn commit: r1570386 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java

Author: jahewson
Date: Thu Feb 20 23:10:06 2014
New Revision: 1570386

URL: http://svn.apache.org/r1570386
Log:
Fixed missing JBIG2 file in PDFBOX-1893

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java?rev=1570386&r1=1570385&r2=1570386&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java Thu Feb 20 23:10:06 2014
@@ -28,6 +28,7 @@ import java.util.Iterator;
 
 import javax.imageio.ImageIO;
 import javax.imageio.ImageReader;
+import javax.imageio.stream.ImageInputStream;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -59,6 +60,22 @@ public class JBIG2Filter implements Filt
     public void decode(InputStream compressedData, OutputStream result, COSDictionary options,
                        int filterIndex) throws IOException
     {
+        // find suitable image reader
+        Iterator readers = ImageIO.getImageReadersByFormatName("JBIG2");
+        ImageReader reader = null;
+        while(readers.hasNext()) {
+            reader = (ImageReader)readers.next();
+            if(reader.canReadRaster()) {
+                break;
+            }
+        }
+
+        if (reader == null)
+        {
+            throw new MissingImageReaderException("Cannot read JBIG2 image: " +
+                    "jbig2-imageio is not installed");
+        }
+
         COSInteger bits = (COSInteger) options.getDictionaryObject(COSName.BITS_PER_COMPONENT);
         COSDictionary params = (COSDictionary) options.getDictionaryObject(COSName.DECODE_PARMS);
 
@@ -68,21 +85,28 @@ public class JBIG2Filter implements Filt
             globals = (COSStream) params.getDictionaryObject(COSName.JBIG2_GLOBALS);
         }
 
-        BufferedImage image;
         if (globals != null)
         {
-            image = ImageIO.read(new SequenceInputStream(globals.getFilteredStream(),
-                    compressedData));
+            ImageInputStream iis = ImageIO.createImageInputStream(
+                    new SequenceInputStream(globals.getFilteredStream(),
+                                            compressedData));
+            reader.setInput(iis);
         }
         else
         {
-            image = ImageIO.read(compressedData);
+            ImageInputStream iis = ImageIO.createImageInputStream(compressedData);
+            reader.setInput(iis);
         }
 
-        if (image == null)
+        BufferedImage image;
+        try
         {
-            throw new MissingImageReaderException("Cannot read JBIG2 image: " +
-                    "jbig2-imageio is not installed");
+            image = reader.read(0);
+        }
+        catch (Exception e)
+        {
+            // wrap and rethrow any exceptions
+            throw new IOException("Could not read JBIG2 image", e);
         }
 
         // I am assuming since JBIG2 is always black and white