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 2017/10/29 19:56:02 UTC

svn commit: r1813702 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter: Filter.java FlateFilter.java

Author: tilman
Date: Sun Oct 29 19:56:02 2017
New Revision: 1813702

URL: http://svn.apache.org/viewvc?rev=1813702&view=rev
Log:
PDFBOX-3982: configure compression level for /Flate filter, as proposed by Emmeran Seehuber

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/FlateFilter.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java?rev=1813702&r1=1813701&r2=1813702&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/Filter.java Sun Oct 29 19:56:02 2017
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Iterator;
+import java.util.zip.Deflater;
 
 import javax.imageio.ImageIO;
 import javax.imageio.ImageReader;
@@ -42,6 +43,14 @@ public abstract class Filter
     private static final Log LOG = LogFactory.getLog(Filter.class);
 
     /**
+     * Compression Level System Property. Set this to a value from 0 to 9 to change the zlib deflate
+     * compression level used to compress /Flate streams. The default value is -1 with is
+     * {@link Deflater#DEFAULT_COMPRESSION}. To set maximum compression, use
+     * {@code System.setProperty(Filter.SYSPROP_DEFLATELEVEL, "9");}
+     */
+    public static final String SYSPROP_DEFLATELEVEL = "org.apache.pdfbox.filter.deflatelevel";
+
+    /**
      * Constructor.
      */
     protected Filter()

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/FlateFilter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/FlateFilter.java?rev=1813702&r1=1813701&r2=1813702&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/FlateFilter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/FlateFilter.java Sun Oct 29 19:56:02 2017
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.zip.DataFormatException;
+import java.util.zip.Deflater;
 import java.util.zip.DeflaterOutputStream;
 import java.util.zip.Inflater;
 import org.apache.commons.logging.Log;
@@ -142,7 +143,18 @@ final class FlateFilter extends Filter
     protected void encode(InputStream input, OutputStream encoded, COSDictionary parameters)
             throws IOException
     {
-        try (DeflaterOutputStream out = new DeflaterOutputStream(encoded))
+        int compressionLevel = Deflater.DEFAULT_COMPRESSION;
+        try
+        {
+            compressionLevel = Integer.parseInt(System.getProperty(Filter.SYSPROP_DEFLATELEVEL, "-1"));
+        }
+        catch (NumberFormatException ex)
+        {
+            LOG.warn(ex.getMessage(), ex);
+        }
+        compressionLevel = Math.max(-1, Math.min(Deflater.BEST_COMPRESSION, compressionLevel));
+        Deflater deflater = new Deflater(compressionLevel);
+        try (DeflaterOutputStream out = new DeflaterOutputStream(encoded,deflater))
         {
             int amountRead;
             int mayRead = input.available();