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


Reply via email to