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 2011/02/20 19:38:59 UTC

svn commit: r1072680 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java

Author: lehmi
Date: Sun Feb 20 18:38:59 2011
New Revision: 1072680

URL: http://svn.apache.org/viewvc?rev=1072680&view=rev
Log:
PDFBOX-947: use in-memory stream instead of temporary file as proposed by Martin Koegler

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.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=1072680&r1=1072679&r2=1072680&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 Sun Feb 20 18:38:59 2011
@@ -25,7 +25,7 @@ import java.io.OutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.ByteArrayInputStream;
-import java.io.FileOutputStream;
+import java.io.ByteArrayOutputStream;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -58,6 +58,8 @@ import org.apache.pdfbox.pdmodel.graphic
 public class PDJpeg extends PDXObjectImage
 {
 
+    private static final String JPG = "jpg";
+    
     private static final List<String> DCT_FILTERS = new ArrayList<String>();
 
     private final static float defaultCompressionLevel = 0.75f;
@@ -75,7 +77,7 @@ public class PDJpeg extends PDXObjectIma
      */
     public PDJpeg(PDStream jpeg)
     {
-        super(jpeg, "jpg");
+        super(jpeg, JPG);
     }
 
     /**
@@ -87,7 +89,7 @@ public class PDJpeg extends PDXObjectIma
      */
     public PDJpeg( PDDocument doc, InputStream is ) throws IOException
     {
-        super( new PDStream( doc, is, true ), "jpg" );
+        super( new PDStream( doc, is, true ), JPG);
         COSDictionary dic = getCOSStream();
         dic.setItem( COSName.FILTER, COSName.DCT_DECODE );
         dic.setItem( COSName.SUBTYPE, COSName.IMAGE);
@@ -114,7 +116,7 @@ public class PDJpeg extends PDXObjectIma
      */
     public PDJpeg( PDDocument doc, BufferedImage bi ) throws IOException
     {
-        super( new PDStream( doc ) , "jpg");
+        super( new PDStream( doc ) , JPG);
         createImageStream(doc, bi, defaultCompressionLevel);
     }
     
@@ -128,7 +130,7 @@ public class PDJpeg extends PDXObjectIma
      */
     public PDJpeg( PDDocument doc, BufferedImage bi, float compressionQuality ) throws IOException
     {
-        super( new PDStream( doc ), "jpg" );
+        super( new PDStream( doc ), JPG);
         createImageStream(doc, bi, compressionQuality);
     }
     
@@ -167,7 +169,7 @@ public class PDJpeg extends PDXObjectIma
         try
         {
             ImageWriter writer = null;
-            Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpg");
+            Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName(JPG);
             if (iter.hasNext()) 
             {
                 writer = iter.next();
@@ -226,18 +228,19 @@ public class PDJpeg extends PDXObjectIma
      */
     public BufferedImage getRGBImage() throws IOException
     {   //TODO PKOCH
-        File imgFile = null;
         BufferedImage bi = null;
         boolean readError = false;
         try 
         {
-            imgFile = File.createTempFile("pdjpeg", ".jpeg");
-            write2file(imgFile);
+            ByteArrayOutputStream os = new ByteArrayOutputStream();
+            write2OutputStream(os);
+            os.close();
+            byte[] img = os.toByteArray();
 
             // 1. try to read jpeg image
             try 
             {
-                bi = ImageIO.read(imgFile);
+                bi = ImageIO.read(new ByteArrayInputStream(img));
             } 
             catch (IIOException iioe) 
             {
@@ -253,32 +256,15 @@ public class PDJpeg extends PDXObjectIma
             // TODO : not sure if it works for all cases
             if (bi == null && readError) 
             {
-                byte[] newImage = replaceHeader(imgFile);
+                byte[] newImage = replaceHeader(img);
 
                 ByteArrayInputStream bai = new ByteArrayInputStream(newImage);
 
-                // persist file temporarely, because i was not able to manage
-                // to call the ImageIO.read(InputStream) successfully.
-                FileOutputStream o = new FileOutputStream(imgFile);
-                byte[] buffer = new byte[512];
-                int read;
-                while ((read=bai.read(buffer)) >0) 
-                {
-                   o.write(buffer, 0, read);
-                }
-
-                bai.close();
-                o.close();
-
-                bi = ImageIO.read(imgFile);
+                bi = ImageIO.read(bai);
             }
         } 
         finally 
         {
-            if (imgFile != null) 
-            {
-                imgFile.delete();
-            }
         }
         
         // If there is a 'soft mask' image then we use that as a transparency mask.
@@ -368,11 +354,8 @@ public class PDJpeg extends PDXObjectIma
         return 0;
     }
 
-    private byte[] replaceHeader(File jpegFile) throws IOException 
+    private byte[] replaceHeader(byte[] image)
     {
-        // read image into memory
-        byte[] image = getBytesFromFile(jpegFile);
-
         // get end position of wrong header respectively startposition of "real jpeg data"
         int pos = getHeaderEndPos(image);
 
@@ -389,3 +372,4 @@ public class PDJpeg extends PDXObjectIma
         return newImage;
     }
 }
+