Index: src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java
===================================================================
--- src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java	(revision 1406610)
+++ src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java	(working copy)
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.SequenceInputStream;
 import java.util.Iterator;
 
 import javax.imageio.ImageIO;
@@ -30,6 +31,9 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSInteger;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSStream;
 
 /**
  * Modeled on the JBIG2Decode filter.
@@ -48,37 +52,65 @@
      *
      * {@inheritDoc}
      *
-     */
+     */    
+    @Override
     public void decode( InputStream compressedData, OutputStream result, COSDictionary options, int filterIndex )
-        throws IOException
+    		throws IOException
     {
-        BufferedImage bi = ImageIO.read(compressedData);
-        if ( bi != null )
-        {
+         Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("JBIG2");
+         if (!readers.hasNext())
+         {
+        	 log.error( "Can't find an ImageIO plugin to decode the JBIG2 encoded datastream.");
+             return;
+         }
+            
+         ImageReader reader = readers.next(); 
+         COSDictionary decodeP = (COSDictionary) options.getDictionaryObject(COSName.DECODE_PARMS);
+         COSInteger bits = (COSInteger) options.getDictionaryObject(COSName.BITS_PER_COMPONENT);
+         COSStream st = (COSStream) decodeP.getDictionaryObject(COSName.getPDFName("JBIG2Globals"));
+         if(st != null)
+         {
+        	 reader.setInput(ImageIO.createImageInputStream(new SequenceInputStream(st.getFilteredStream(),compressedData)));
+         }
+         else
+         {
+        	 reader.setInput(ImageIO.createImageInputStream(compressedData));
+         }
+         BufferedImage bi = reader.read(0);
+         reader.dispose();
+            
+         if ( bi != null )
+         {
+        	 if(bi.getColorModel().getPixelSize() != bits.intValue()) // I am assuming since JBIG2 is always black and white depending on your renderer this might or might be needed
+        	 {
+        		if(bits.intValue()!=1)
+        		{
+            		log.error("Do not know how to deal with JBIG2 with more than 1 bit");
+            		return;
+            	}
+            	BufferedImage packedImage = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
+            	packedImage.getGraphics().drawImage(bi, 0, 0, null);	
+            	bi=packedImage;
+            }
+        	 
+        	
             DataBuffer dBuf = bi.getData().getDataBuffer();
             if ( dBuf.getDataType() == DataBuffer.TYPE_BYTE )
             {
-                result.write( ( ( DataBufferByte ) dBuf ).getData() );
-            }
-            else
-            {
-                log.error( "Image data buffer not of type byte but type " + dBuf.getDataType() );
-            }
-        }
-        else
-        {
-            Iterator<ImageReader> reader = ImageIO.getImageReadersByFormatName("JBIG2");
-            if (!reader.hasNext())
-            {
-                log.error( "Can't find an ImageIO plugin to decode the JBIG2 encoded datastream.");
+            	result.write( ( ( DataBufferByte ) dBuf ).getData() );
             }
             else
             {
-                log.error( "Something went wrong when decoding the JBIG2 encoded datastream.");
+            	log.error( "Image data buffer not of type byte but type " + dBuf.getDataType() );
             }
-        }
+         }
+         else
+         {
+        	 log.error( "Something went wrong when decoding the JBIG2 encoded datastream.");
+         }        
     }
 
+  
      /**
      * {@inheritDoc}
      */
