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 2019/09/21 11:50:43 UTC

svn commit: r1867268 - /pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/imageio/ImageIOUtil.java

Author: tilman
Date: Sat Sep 21 11:50:43 2019
New Revision: 1867268

URL: http://svn.apache.org/viewvc?rev=1867268&view=rev
Log:
PDFBOX-4655: set compressionQuality 0 for PNG because of large files on jdk11 / jdk12 / jdk13; refactor; add buffering to file output

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

Modified: pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/imageio/ImageIOUtil.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/imageio/ImageIOUtil.java?rev=1867268&r1=1867267&r2=1867268&view=diff
==============================================================================
--- pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/imageio/ImageIOUtil.java (original)
+++ pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/imageio/ImageIOUtil.java Sat Sep 21 11:50:43 2019
@@ -17,10 +17,11 @@
 package org.apache.pdfbox.tools.imageio;
 
 import java.awt.image.BufferedImage;
-import java.io.File;
+import java.io.BufferedOutputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.Arrays;
 import java.util.Iterator;
 
 import javax.imageio.IIOImage;
@@ -65,7 +66,14 @@ public final class ImageIOUtil
     public static boolean writeImage(BufferedImage image, String filename,
             int dpi) throws IOException
     {
-        return writeImage(image, filename, dpi, 1.0f);
+        float compressionQuality = 1f;
+        String formatName = filename.substring(filename.lastIndexOf('.') + 1);
+        if ("png".equals(formatName.toLowerCase()))
+        {
+            // PDFBOX-4655: prevent huge PNG files on jdk11 / jdk12 / jjdk13
+            compressionQuality = 0f;
+        }
+        return writeImage(image, filename, dpi, compressionQuality);
     }
 
     /**
@@ -86,8 +94,7 @@ public final class ImageIOUtil
     public static boolean writeImage(BufferedImage image, String filename,
             int dpi, float compressionQuality) throws IOException
     {
-        File file = new File(filename);
-        try (FileOutputStream output = new FileOutputStream(file))
+        try (OutputStream output = new BufferedOutputStream(new FileOutputStream(filename)))
         {
             String formatName = filename.substring(filename.lastIndexOf('.') + 1);
             return writeImage(image, formatName, output, dpi, compressionQuality);
@@ -115,8 +122,7 @@ public final class ImageIOUtil
     public static boolean writeImage(BufferedImage image, String formatName, String filename,
             int dpi) throws IOException
     {
-        File file = new File(filename + "." + formatName);
-        try (FileOutputStream output = new FileOutputStream(file))
+        try (OutputStream output = new BufferedOutputStream(new FileOutputStream(filename + "." + formatName)))
         {
             return writeImage(image, formatName, output, dpi);
         }
@@ -154,7 +160,13 @@ public final class ImageIOUtil
     public static boolean writeImage(BufferedImage image, String formatName, OutputStream output,
             int dpi) throws IOException
     {
-        return writeImage(image, formatName, output, dpi, 1.0f);
+        float compressionQuality = 1f;
+        if ("png".equals(formatName.toLowerCase()))
+        {
+            // PDFBOX-4655: prevent huge PNG files on jdk11 / jdk12 / jjdk13
+            compressionQuality = 0f;
+        }
+        return writeImage(image, formatName, output, dpi, compressionQuality);
     }
 
     /**
@@ -239,14 +251,7 @@ public final class ImageIOUtil
             if (writer == null)
             {
                 LOG.error("No ImageWriter found for '" + formatName + "' format");
-                StringBuilder sb = new StringBuilder();
-                String[] writerFormatNames = ImageIO.getWriterFormatNames();
-                for (String fmt : writerFormatNames)
-                {
-                    sb.append(fmt);
-                    sb.append(' ');
-                }
-                LOG.error("Supported formats: " + sb);
+                LOG.error("Supported formats: " + Arrays.toString(ImageIO.getWriterFormatNames()));
                 return false;
             }