Author: lehmi Date: Sat Feb 4 11:49:00 2012 New Revision: 1240494 URL: http://svn.apache.org/viewvc?rev=1240494&view=rev Log: PDFDBOX-1220: use ImageIOUtil instead of ImageIO directly, as the image wasn't written in some cases
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java?rev=1240494&r1=1240493&r2=1240494&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java Sat Feb 4 11:49:00 2012 @@ -62,6 +62,7 @@ import org.apache.pdfbox.pdmodel.graphic import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB; import org.apache.pdfbox.pdmodel.graphics.color.PDICCBased; import org.apache.pdfbox.pdmodel.graphics.color.PDSeparation; +import org.apache.pdfbox.util.ImageIOUtil; /** * An image class for JPegs. @@ -110,7 +111,7 @@ public class PDJpeg extends PDXObjectIma dic.setItem( COSName.SUBTYPE, COSName.IMAGE); dic.setItem( COSName.TYPE, COSName.XOBJECT ); - BufferedImage image = getRGBImage(); + getRGBImage(); if (image != null) { setBitsPerComponent( 8 ); @@ -177,7 +178,7 @@ public class PDJpeg extends PDXObjectIma } } } - BufferedImage image = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_USHORT_565_RGB); + image = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_USHORT_565_RGB); g = image.createGraphics(); g.drawImage(bi, 0, 0, null); bi = image; @@ -330,7 +331,7 @@ public class PDJpeg extends PDXObjectIma getRGBImage(); if (image != null) { - ImageIO.write(image, JPG, out); + ImageIOUtil.writeImage(image, JPG, out); } } @@ -346,11 +347,11 @@ public class PDJpeg extends PDXObjectIma } } - private int getHeaderEndPos(byte[] image) + private int getHeaderEndPos(byte[] imageAsBytes) { - for (int i = 0; i < image.length; i++) + for (int i = 0; i < imageAsBytes.length; i++) { - byte b = image[i]; + byte b = imageAsBytes[i]; if (b == (byte) 0xDB) { // TODO : check for ff db @@ -360,10 +361,10 @@ public class PDJpeg extends PDXObjectIma return 0; } - private byte[] replaceHeader(byte[] image) + private byte[] replaceHeader(byte[] imageAsBytes) { // get end position of wrong header respectively startposition of "real jpeg data" - int pos = getHeaderEndPos(image); + int pos = getHeaderEndPos(imageAsBytes); // simple correct header byte[] header = new byte[]{(byte) 0xFF, (byte) 0xD8, (byte) 0xFF, (byte) 0xE0, (byte) 0x00, @@ -371,9 +372,9 @@ public class PDJpeg extends PDXObjectIma (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x60, (byte) 0x00, (byte) 0x60, (byte) 0x00, (byte) 0x00}; // concat - byte[] newImage = new byte[image.length - pos + header.length - 1]; + byte[] newImage = new byte[imageAsBytes.length - pos + header.length - 1]; System.arraycopy(header, 0, newImage, 0, header.length); - System.arraycopy(image, pos + 1, newImage, header.length, image.length - pos - 1); + System.arraycopy(imageAsBytes, pos + 1, newImage, header.length, imageAsBytes.length - pos - 1); return newImage; } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java?rev=1240494&r1=1240493&r2=1240494&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java Sat Feb 4 11:49:00 2012 @@ -29,8 +29,6 @@ import java.awt.image.WritableRaster; import java.io.IOException; import java.io.OutputStream; -import javax.imageio.ImageIO; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.pdfbox.cos.COSArray; @@ -45,6 +43,7 @@ import org.apache.pdfbox.pdmodel.graphic import org.apache.pdfbox.pdmodel.graphics.color.PDICCBased; import org.apache.pdfbox.pdmodel.graphics.color.PDIndexed; import org.apache.pdfbox.pdmodel.graphics.color.PDSeparation; +import org.apache.pdfbox.util.ImageIOUtil; @@ -63,13 +62,15 @@ public class PDPixelMap extends PDXObjec private BufferedImage image = null; + private static final String PNG = "png"; + /** * Standard constructor. Basically does nothing. * @param pdStream The stream that holds the pixel map. */ public PDPixelMap(PDStream pdStream) { - super(pdStream, "png"); + super(pdStream, PNG); } /** @@ -366,7 +367,7 @@ public class PDPixelMap extends PDXObjec getRGBImage(); if (image != null) { - ImageIO.write(image, "png", out); + ImageIOUtil.writeImage(image, PNG, out); } } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java?rev=1240494&r1=1240493&r2=1240494&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java Sat Feb 4 11:49:00 2012 @@ -20,6 +20,7 @@ import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.File; import java.io.IOException; +import java.io.OutputStream; import java.util.Iterator; import javax.imageio.IIOException; @@ -45,13 +46,16 @@ import org.w3c.dom.NodeList; */ public class ImageIOUtil { + + private static final int DEFAULT_SCREEN_RESOLUTION = 72; + private ImageIOUtil() { // Default constructor } /** - * Converts a given page range of a PDF document to bitmap images. + * Writes a buffered image to a file using the given image format. * @param image the image to be written * @param imageFormat the target format (ex. "png") * @param filename used to construct the filename for the individual images @@ -64,13 +68,34 @@ public class ImageIOUtil int imageType, int resolution) throws IOException { + String fileName = filename + "." + imageFormat; + File file = new File( fileName ); + return writeImage(image, imageFormat, file, resolution); + } + + /** + * Writes a buffered image to a file using the given image format. + * @param image the image to be written + * @param imageFormat the target format (ex. "png") + * @param outputStream the output stream to be used for writing + * @return true if the images were produced, false if there was an error + * @throws IOException if an I/O error occurs + */ + public static boolean writeImage(BufferedImage image, String imageFormat, OutputStream outputStream) + throws IOException + { + return writeImage(image, imageFormat, outputStream, DEFAULT_SCREEN_RESOLUTION); + } + + private static boolean writeImage(BufferedImage image, String imageFormat, Object outputStream, int resolution) + throws IOException + { boolean bSuccess = true; ImageOutputStream output = null; ImageWriter imageWriter = null; try { - String fileName = filename + "." + imageFormat; - output = ImageIO.createImageOutputStream( new File( fileName ) ); + output = ImageIO.createImageOutputStream( outputStream ); boolean foundWriter = false; Iterator<ImageWriter> writerIter = ImageIO.getImageWritersByFormatName( imageFormat );