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 2013/09/01 19:32:56 UTC

svn commit: r1519295 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: filter/JBIG2Filter.java pdmodel/graphics/xobject/PDXObjectImage.java

Author: lehmi
Date: Sun Sep  1 17:32:55 2013
New Revision: 1519295

URL: http://svn.apache.org/r1519295
Log:
PDFBOX-1707: added some graphics.dispose() calls as proposed by Tilmann Hausherr

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObjectImage.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=1519295&r1=1519294&r2=1519295&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 Sun Sep  1 17:32:55 2013
@@ -16,6 +16,7 @@
  */
 package org.apache.pdfbox.filter;
 
+import java.awt.Graphics;
 import java.awt.image.BufferedImage;
 import java.awt.image.DataBuffer;
 import java.awt.image.DataBufferByte;
@@ -53,8 +54,9 @@ public class JBIG2Filter implements Filt
      * {@inheritDoc}
      *
      */
-    public void decode( InputStream compressedData, OutputStream result, COSDictionary options, int filterIndex )
-        throws IOException
+    @Override
+    public void decode(InputStream compressedData, OutputStream result, COSDictionary options, int filterIndex)
+            throws IOException
     {
         /**
          *  A working JBIG2 ImageIO plugin is needed to decode JBIG2 encoded streams.
@@ -64,7 +66,7 @@ public class JBIG2Filter implements Filt
         Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("JBIG2");
         if (!readers.hasNext())
         {
-            LOG.error( "Can't find an ImageIO plugin to decode the JBIG2 encoded datastream.");
+            LOG.error("Can't find an ImageIO plugin to decode the JBIG2 encoded datastream.");
             return;
         }
         ImageReader reader = readers.next();
@@ -75,9 +77,10 @@ public class JBIG2Filter implements Filt
         {
             st = (COSStream) decodeP.getDictionaryObject(COSName.JBIG2_GLOBALS);
         }
-        if(st != null)
+        if (st != null)
         {
-            reader.setInput(ImageIO.createImageInputStream(new SequenceInputStream(st.getFilteredStream(),compressedData)));
+            reader.setInput(ImageIO.createImageInputStream(new SequenceInputStream(st.getFilteredStream(),
+                    compressedData)));
         }
         else
         {
@@ -85,45 +88,48 @@ public class JBIG2Filter implements Filt
         }
         BufferedImage bi = reader.read(0);
         reader.dispose();
-        if ( bi != null )
+        if (bi != null)
         {
-            // I am assuming since JBIG2 is always black and white 
+            // I am assuming since JBIG2 is always black and white
             // depending on your renderer this might or might be needed
-            if(bi.getColorModel().getPixelSize() != bits.intValue()) 
+            if (bi.getColorModel().getPixelSize() != bits.intValue())
             {
-                if(bits.intValue() != 1)
+                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);
+                BufferedImage packedImage = new BufferedImage(bi.getWidth(), bi.getHeight(),
+                        BufferedImage.TYPE_BYTE_BINARY);
+                Graphics graphics = packedImage.getGraphics();
+                graphics.drawImage(bi, 0, 0, null);
+                graphics.dispose();
                 bi = packedImage;
             }
             DataBuffer dBuf = bi.getData().getDataBuffer();
-            if ( dBuf.getDataType() == DataBuffer.TYPE_BYTE )
+            if (dBuf.getDataType() == DataBuffer.TYPE_BYTE)
             {
-                result.write( ( ( DataBufferByte ) dBuf ).getData() );
+                result.write(((DataBufferByte) dBuf).getData());
             }
             else
             {
-                LOG.error( "Image data buffer not of type byte but type " + dBuf.getDataType() );
+                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.");
+            LOG.error("Something went wrong when decoding the JBIG2 encoded datastream.");
         }
     }
 
     /**
      * {@inheritDoc}
      */
-    public void encode( InputStream rawData, OutputStream result, COSDictionary options, int filterIndex )
-        throws IOException
+    @Override
+    public void encode(InputStream rawData, OutputStream result, COSDictionary options, int filterIndex)
+            throws IOException
     {
-        System.err.println( "Warning: JBIG2.encode is not implemented yet, skipping this stream." );
+        System.err.println("Warning: JBIG2.encode is not implemented yet, skipping this stream.");
     }
-    
+
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObjectImage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObjectImage.java?rev=1519295&r1=1519294&r2=1519295&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObjectImage.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObjectImage.java Sun Sep  1 17:32:55 2013
@@ -20,10 +20,10 @@ import java.awt.AlphaComposite;
 import java.awt.Color;
 import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
+import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.io.File;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -43,7 +43,6 @@ import org.apache.pdfbox.pdmodel.graphic
  *
  * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
  * @author mathiak
- * @version $Revision: 1.9 $
  */
 public abstract class PDXObjectImage extends PDXObject
 {
@@ -64,7 +63,7 @@ public abstract class PDXObjectImage ext
     private String suffix;
 
     private PDColorState stencilColor;
-    
+
     /**
      * Standard constructor.
      *
@@ -73,20 +72,20 @@ public abstract class PDXObjectImage ext
      */
     public PDXObjectImage(PDStream imageStream, String fileSuffix)
     {
-        super( imageStream );
+        super(imageStream);
         suffix = fileSuffix;
     }
 
     /**
-     * Standard constuctor.
+     * Standard constructor.
      *
      * @param doc The document to store the stream in.
      * @param fileSuffix The file suffix, jpg/png.
      */
     public PDXObjectImage(PDDocument doc, String fileSuffix)
     {
-        super( doc );
-        getCOSStream().setName( COSName.SUBTYPE, SUB_TYPE );
+        super(doc);
+        getCOSStream().setName(COSName.SUBTYPE, SUB_TYPE);
         suffix = fileSuffix;
     }
 
@@ -98,12 +97,11 @@ public abstract class PDXObjectImage ext
      * @return a pdmodel xobject
      * @throws IOException If there is an error creating the xobject.
      */
-    public static PDXObject createThumbnailXObject( COSBase xobject ) throws IOException
+    public static PDXObject createThumbnailXObject(COSBase xobject) throws IOException
     {
-        PDXObject retval = commonXObjectCreation(xobject, true);
-        return retval;
+        return commonXObjectCreation(xobject, true);
     }
-    
+
     /**
      * Returns an java.awt.Image, that can be used for display etc.
      *
@@ -131,42 +129,55 @@ public abstract class PDXObjectImage ext
         }
         else
         {
-            return (PDXObjectImage)PDXObject.createXObject(smask);
+            return (PDXObjectImage) PDXObject.createXObject(smask);
         }
     }
-    
-    public BufferedImage applyMasks(BufferedImage baseImage) throws IOException
+
+    /**
+     * Add masked image to the given image.
+     * 
+     * @param baseImage the base image.
+     * @return the masked image.
+     * @throws IOException if something went wrong
+     */
+    protected BufferedImage applyMasks(BufferedImage baseImage) throws IOException
     {
-    	if (getImageMask())
-    	{
-    		return imageMask(baseImage);
-    	}
-    	if(getMask() != null)
-    	{
-    		return mask(baseImage);
-    	}
-    	PDXObjectImage smask = getSMaskImage();
-    	if(smask != null)
-    	{
-    		BufferedImage smaskBI = smask.getRGBImage();
-    		COSArray decodeArray = smask.getDecode();
-    		CompositeImage compositeImage = new CompositeImage(baseImage, smaskBI);
-    		BufferedImage rgbImage = compositeImage.createMaskedImage(decodeArray);
-        	return rgbImage;
-    	}
-    	return baseImage;
-    }
-    
-    public boolean hasMask() throws IOException
-    {
-    	return getImageMask() || getMask() != null || getSMaskImage() != null;
-    }
-    
-    
-    public BufferedImage imageMask(BufferedImage baseImage) throws IOException 
+        if (getImageMask())
+        {
+            return imageMask(baseImage);
+        }
+        if (getMask() != null)
+        {
+            return mask(baseImage);
+        }
+        PDXObjectImage smask = getSMaskImage();
+        if (smask != null)
+        {
+            BufferedImage smaskBI = smask.getRGBImage();
+            COSArray decodeArray = smask.getDecode();
+            CompositeImage compositeImage = new CompositeImage(baseImage, smaskBI);
+            BufferedImage rgbImage = compositeImage.createMaskedImage(decodeArray);
+            return rgbImage;
+        }
+        return baseImage;
+    }
+
+    /**
+     * Determines is the XObject has any mask.
+     * 
+     * @return true if the XObkject has any mask
+     * @throws IOException if something went wrong
+     */
+    protected boolean hasMask() throws IOException
+    {
+        return getImageMask() || getMask() != null || getSMaskImage() != null;
+    }
+
+    private BufferedImage imageMask(BufferedImage baseImage) throws IOException
     {
-    	BufferedImage stencilMask = new BufferedImage(baseImage.getWidth(), baseImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
-        Graphics2D graphics = (Graphics2D)stencilMask.getGraphics();
+        BufferedImage stencilMask = new BufferedImage(baseImage.getWidth(), baseImage.getHeight(),
+                BufferedImage.TYPE_INT_ARGB);
+        Graphics2D graphics = (Graphics2D) stencilMask.getGraphics();
         if (getStencilColor() != null)
         {
             graphics.setColor(getStencilColor().getJavaColor());
@@ -177,35 +188,38 @@ public abstract class PDXObjectImage ext
             LOG.debug("no stencil color for PixelMap found, using Color.BLACK instead.");
             graphics.setColor(Color.BLACK);
         }
-        
+
         graphics.fillRect(0, 0, baseImage.getWidth(), baseImage.getHeight());
         // assume default values ([0,1]) for the DecodeArray
         // TODO DecodeArray == [1,0]
         graphics.setComposite(AlphaComposite.DstIn);
         graphics.drawImage(baseImage, null, 0, 0);
+        graphics.dispose();
         return stencilMask;
     }
-    
-    public BufferedImage mask(BufferedImage baseImage) 
-    	throws IOException
+
+    private BufferedImage mask(BufferedImage baseImage) throws IOException
     {
         COSBase mask = getMask();
         if (mask instanceof COSStream)
         {
-        	PDXObjectImage maskImageRef = (PDXObjectImage)PDXObject.createXObject((COSStream)mask);
-        	BufferedImage maskImage = maskImageRef.getRGBImage();
-       	 	if(maskImage == null)
-       	 	{
-    	   		 LOG.warn("masking getRGBImage returned NULL");
-    	   		 return baseImage;
-       	 	}
-       	 
-    	   	 BufferedImage newImage = new BufferedImage( maskImage.getWidth(), maskImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
-    	   	 Graphics2D graphics = (Graphics2D)newImage.getGraphics();
-    	   	 graphics.drawImage(baseImage, 0, 0, maskImage.getWidth(), maskImage.getHeight(), 0, 0, baseImage.getWidth(), baseImage.getHeight(), null);   
-    	   	 graphics.setComposite(AlphaComposite.DstIn);
-    	   	 graphics.drawImage(maskImage, null, 0, 0);
-    	   	 return newImage;
+            PDXObjectImage maskImageRef = (PDXObjectImage) PDXObject.createXObject((COSStream) mask);
+            BufferedImage maskImage = maskImageRef.getRGBImage();
+            if (maskImage == null)
+            {
+                LOG.warn("masking getRGBImage returned NULL");
+                return baseImage;
+            }
+
+            BufferedImage newImage = new BufferedImage(maskImage.getWidth(), maskImage.getHeight(),
+                    BufferedImage.TYPE_INT_ARGB);
+            Graphics2D graphics = (Graphics2D) newImage.getGraphics();
+            graphics.drawImage(baseImage, 0, 0, maskImage.getWidth(), maskImage.getHeight(), 0, 0,
+                    baseImage.getWidth(), baseImage.getHeight(), null);
+            graphics.setComposite(AlphaComposite.DstIn);
+            graphics.drawImage(maskImage, null, 0, 0);
+            graphics.dispose();
+            return newImage;
         }
         else
         {
@@ -239,7 +253,7 @@ public abstract class PDXObjectImage ext
         }
         finally
         {
-            if( out != null )
+            if (out != null)
             {
                 out.close();
             }
@@ -264,7 +278,7 @@ public abstract class PDXObjectImage ext
         }
         finally
         {
-            if( out != null )
+            if (out != null)
             {
                 out.close();
             }
@@ -278,7 +292,7 @@ public abstract class PDXObjectImage ext
      */
     public int getHeight()
     {
-        return getCOSStream().getInt( COSName.HEIGHT, -1 );
+        return getCOSStream().getInt(COSName.HEIGHT, -1);
     }
 
     /**
@@ -286,9 +300,9 @@ public abstract class PDXObjectImage ext
      *
      * @param height The height of the image.
      */
-    public void setHeight( int height )
+    public void setHeight(int height)
     {
-        getCOSStream().setInt( COSName.HEIGHT, height );
+        getCOSStream().setInt(COSName.HEIGHT, height);
     }
 
     /**
@@ -298,7 +312,7 @@ public abstract class PDXObjectImage ext
      */
     public int getWidth()
     {
-        return getCOSStream().getInt( COSName.WIDTH, -1 );
+        return getCOSStream().getInt(COSName.WIDTH, -1);
     }
 
     /**
@@ -306,9 +320,9 @@ public abstract class PDXObjectImage ext
      *
      * @param width The width of the image.
      */
-    public void setWidth( int width )
+    public void setWidth(int width)
     {
-        getCOSStream().setInt( COSName.WIDTH, width );
+        getCOSStream().setInt(COSName.WIDTH, width);
     }
 
     /**
@@ -319,7 +333,7 @@ public abstract class PDXObjectImage ext
      */
     public int getBitsPerComponent()
     {
-        return getCOSStream().getInt( COSName.BITS_PER_COMPONENT, COSName.BPC, -1 );
+        return getCOSStream().getInt(COSName.BITS_PER_COMPONENT, COSName.BPC, -1);
     }
 
     /**
@@ -327,9 +341,9 @@ public abstract class PDXObjectImage ext
      *
      * @param bpc The number of bits per component.
      */
-    public void setBitsPerComponent( int bpc )
+    public void setBitsPerComponent(int bpc)
     {
-        getCOSStream().setInt( COSName.BITS_PER_COMPONENT, bpc );
+        getCOSStream().setInt(COSName.BITS_PER_COMPONENT, bpc);
     }
 
     /**
@@ -341,11 +355,11 @@ public abstract class PDXObjectImage ext
      */
     public PDColorSpace getColorSpace() throws IOException
     {
-        COSBase cs = getCOSStream().getDictionaryObject( COSName.COLORSPACE, COSName.CS );
+        COSBase cs = getCOSStream().getDictionaryObject(COSName.COLORSPACE, COSName.CS);
         PDColorSpace retval = null;
-        if( cs != null )
+        if (cs != null)
         {
-            retval = PDColorSpaceFactory.createColorSpace( cs );
+            retval = PDColorSpaceFactory.createColorSpace(cs);
             if (retval == null)
             {
                 LOG.info("About to return NULL from createColorSpace branch");
@@ -353,15 +367,14 @@ public abstract class PDXObjectImage ext
         }
         else
         {
-            //there are some cases where the 'required' CS value is not present
-            //but we know that it will be grayscale for a CCITT filter.
-            COSBase filter = getCOSStream().getDictionaryObject( COSName.FILTER );
-            if( COSName.CCITTFAX_DECODE.equals( filter ) ||
-                COSName.CCITTFAX_DECODE_ABBREVIATION.equals( filter ) )
+            // there are some cases where the 'required' CS value is not present
+            // but we know that it will be grayscale for a CCITT filter.
+            COSBase filter = getCOSStream().getDictionaryObject(COSName.FILTER);
+            if (COSName.CCITTFAX_DECODE.equals(filter) || COSName.CCITTFAX_DECODE_ABBREVIATION.equals(filter))
             {
                 retval = new PDDeviceGray();
             }
-            else if( COSName.JBIG2_DECODE.equals( filter ) )
+            else if (COSName.JBIG2_DECODE.equals(filter))
             {
                 retval = new PDDeviceGray();
             }
@@ -372,8 +385,7 @@ public abstract class PDXObjectImage ext
             }
             else
             {
-                LOG.info("About to return NULL from unhandled branch."
-                        + " filter = " + filter);
+                LOG.info("About to return NULL from unhandled branch." + " filter = " + filter);
             }
         }
         return retval;
@@ -384,14 +396,14 @@ public abstract class PDXObjectImage ext
      *
      * @param cs The color space for this image.
      */
-    public void setColorSpace( PDColorSpace cs )
+    public void setColorSpace(PDColorSpace cs)
     {
         COSBase base = null;
-        if( cs != null )
+        if (cs != null)
         {
             base = cs.getCOSObject();
         }
-        getCOSStream().setItem( COSName.COLORSPACE, base );
+        getCOSStream().setItem(COSName.COLORSPACE, base);
     }
 
     /**
@@ -411,7 +423,7 @@ public abstract class PDXObjectImage ext
      */
     public boolean getImageMask()
     {
-        return getCOSStream().getBoolean( COSName.IMAGE_MASK, false );
+        return getCOSStream().getBoolean(COSName.IMAGE_MASK, false);
     }
 
     /**
@@ -440,10 +452,10 @@ public abstract class PDXObjectImage ext
      */
     public COSArray getDecode()
     {
-        COSBase decode = getCOSStream().getDictionaryObject( COSName.DECODE );
+        COSBase decode = getCOSStream().getDictionaryObject(COSName.DECODE);
         if (decode != null && decode instanceof COSArray)
         {
-            return (COSArray)decode;
+            return (COSArray) decode;
         }
         return null;
     }