You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2020/02/12 19:42:41 UTC

svn commit: r1873960 - /pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java

Author: tilman
Date: Wed Feb 12 19:42:41 2020
New Revision: 1873960

URL: http://svn.apache.org/viewvc?rev=1873960&view=rev
Log:
PDFBOX-4771: get the image only when needed, as suggested by Maruan Sahyoun

Modified:
    pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java

Modified: pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java?rev=1873960&r1=1873959&r2=1873960&view=diff
==============================================================================
--- pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java (original)
+++ pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java Wed Feb 12 19:42:41 2020
@@ -373,12 +373,7 @@ public final class ExtractImages
             suffix = "jp2";
         }
 
-        BufferedImage image = pdImage.getImage();
-        if (image == null)
-        {
-            return;
-        }
-        if (image.getColorModel().hasAlpha())
+        if (hasMasks(pdImage))
         {
             // TIKA-3040, PDFBOX-4771: can't save ARGB as JPEG
             suffix = "png";
@@ -401,7 +396,11 @@ public final class ExtractImages
                 else
                 {
                     // for CMYK and other "unusual" colorspaces, the JPEG will be converted
-                    ImageIOUtil.writeImage(image, suffix, out);
+                    BufferedImage image = pdImage.getImage();
+                    if (image != null)
+                    {
+                        ImageIOUtil.writeImage(image, suffix, out);
+                    }
                 }
             }
             else if ("jp2".equals(suffix))
@@ -420,11 +419,20 @@ public final class ExtractImages
                 else
                 {                        
                     // for CMYK and other "unusual" colorspaces, the image will be converted
-                    ImageIOUtil.writeImage(image, "jpeg2000", out);
+                    BufferedImage image = pdImage.getImage();
+                    if (image != null)
+                    {
+                        ImageIOUtil.writeImage(image, "jpeg2000", out);
+                    }
                 }
             }
             else if ("tiff".equals(suffix) && pdImage.getColorSpace().equals(PDDeviceGray.INSTANCE))
             {
+                BufferedImage image = pdImage.getImage();
+                if (image == null)
+                {
+                    return;
+                }
                 // CCITT compressed images can have a different colorspace, but this one is B/W
                 // This is a bitonal image, so copy to TYPE_BYTE_BINARY
                 // so that a G4 compressed TIFF image is created by ImageIOUtil.writeImage()
@@ -441,11 +449,25 @@ public final class ExtractImages
                 }
                 ImageIOUtil.writeImage(bitonalImage, suffix, out);
             }
-            else 
+            else
             {
-                ImageIOUtil.writeImage(image, suffix, out);
+                BufferedImage image = pdImage.getImage();
+                if (image != null)
+                {
+                    ImageIOUtil.writeImage(image, suffix, out);
+                }
             }
             out.flush();
         }
     }
+
+    private boolean hasMasks(PDImage pdImage) throws IOException
+    {
+        if (pdImage instanceof PDImageXObject)
+        {
+            PDImageXObject ximg = (PDImageXObject) pdImage;
+            return ximg.getMask() != null || ximg.getSoftMask() != null;
+        }
+        return false;
+    }
 }