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;
}