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/12/09 10:39:54 UTC

svn commit: r1884240 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering: PDFRenderer.java PageDrawer.java PageDrawerParameters.java

Author: tilman
Date: Wed Dec  9 10:39:54 2020
New Revision: 1884240

URL: http://svn.apache.org/viewvc?rev=1884240&view=rev
Log:
PDFBOX-4928: add fine tuning for quality-optimized downscaling, as suggested by Christian Appl

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawerParameters.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java?rev=1884240&r1=1884239&r2=1884240&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java Wed Dec  9 10:39:54 2020
@@ -67,6 +67,8 @@ public class PDFRenderer
 
     private static boolean kcmsLogged = false;
 
+    private float imageDownscalingOptimizationThreshhold = 0.5f;
+
     /**
      * Creates a new PDFRenderer.
      * @param document the document to render
@@ -171,6 +173,29 @@ public class PDFRenderer
     }
 
     /**
+     *
+     * @return get the image downscaling optimization threshhold. See
+     * {@link #getImageDownscalingOptimizationThreshhold()} for details.
+     */
+    public float getImageDownscalingOptimizationThreshhold()
+    {
+        return imageDownscalingOptimizationThreshhold;
+    }
+
+    /**
+     * Set the image downscaling optimization threshhold. This must be a value between 0 and 1. When
+     * rendering downscaled images and rendering hints are set to bicubic+quality and the scaling is
+     * smaller than the threshhold, a more quality-optimized but slower method will be used. The
+     * default is 0.5 which is a good compromise.
+     *
+     * @param imageDownscalingOptimizationThreshhold
+     */
+    public void setImageDownscalingOptimizationThreshhold(float imageDownscalingOptimizationThreshhold)
+    {
+        this.imageDownscalingOptimizationThreshhold = imageDownscalingOptimizationThreshhold;
+    }
+
+    /**
      * Returns the given page as an RGB image at 72 DPI
      * @param pageIndex the zero-based index of the page to be converted.
      * @return the rendered page image
@@ -306,8 +331,9 @@ public class PDFRenderer
         // the end-user may provide a custom PageDrawer
         RenderingHints actualRenderingHints =
                 renderingHints == null ? createDefaultRenderingHints(g) : renderingHints;
-        PageDrawerParameters parameters = new PageDrawerParameters(this, page, subsamplingAllowed,
-                                                                   destination, actualRenderingHints);
+        PageDrawerParameters parameters =
+                new PageDrawerParameters(this, page, subsamplingAllowed, destination,
+                        actualRenderingHints, imageDownscalingOptimizationThreshhold);
         PageDrawer drawer = createPageDrawer(parameters);
         drawer.drawPage(g, page.getCropBox());       
         
@@ -416,8 +442,9 @@ public class PDFRenderer
         // the end-user may provide a custom PageDrawer
         RenderingHints actualRenderingHints =
                 renderingHints == null ? createDefaultRenderingHints(graphics) : renderingHints;
-        PageDrawerParameters parameters = new PageDrawerParameters(this, page, subsamplingAllowed,
-                                                                   destination, actualRenderingHints);
+        PageDrawerParameters parameters =
+                new PageDrawerParameters(this, page, subsamplingAllowed, destination,
+                        actualRenderingHints, imageDownscalingOptimizationThreshhold);
         PageDrawer drawer = createPageDrawer(parameters);
         drawer.drawPage(graphics, cropBox);
     }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1884240&r1=1884239&r2=1884240&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java Wed Dec  9 10:39:54 2020
@@ -158,6 +158,7 @@ public class PageDrawer extends PDFGraph
 
     private final RenderDestination destination;
     private final RenderingHints renderingHints;
+    private final float imageDownscalingOptimizationThreshhold;
 
     static final int JAVA_VERSION = PageDrawer.getJavaVersion();
 
@@ -179,6 +180,8 @@ public class PageDrawer extends PDFGraph
         this.subsamplingAllowed = parameters.isSubsamplingAllowed();
         this.destination = parameters.getDestination();
         this.renderingHints = parameters.getRenderingHints();
+        this.imageDownscalingOptimizationThreshhold =
+                parameters.getImageDownscalingOptimizationThreshhold();
     }
 
     /**
@@ -1184,7 +1187,7 @@ public class PageDrawer extends PDFGraph
             float scaleX = Math.abs(imageTransformMatrix.getScalingFactorX() * graphicsTransformMatrix.getScalingFactorX());
             float scaleY = Math.abs(imageTransformMatrix.getScalingFactorY() * graphicsTransformMatrix.getScalingFactorY());
 
-            if ((scaleX < 0.5 || scaleY < 0.5) &&
+            if ((scaleX < imageDownscalingOptimizationThreshhold || scaleY < imageDownscalingOptimizationThreshhold) &&
                 RenderingHints.VALUE_RENDER_QUALITY.equals(graphics.getRenderingHint(RenderingHints.KEY_RENDERING)) &&
                 RenderingHints.VALUE_INTERPOLATION_BICUBIC.equals(graphics.getRenderingHint(RenderingHints.KEY_INTERPOLATION)))
             {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawerParameters.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawerParameters.java?rev=1884240&r1=1884239&r2=1884240&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawerParameters.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawerParameters.java Wed Dec  9 10:39:54 2020
@@ -35,18 +35,21 @@ public final class PageDrawerParameters
     private final boolean subsamplingAllowed;
     private final RenderDestination destination; 
     private final RenderingHints renderingHints;
+    private final float imageDownscalingOptimizationThreshhold;
 
     /**
      * Package-private constructor.
      */
     PageDrawerParameters(PDFRenderer renderer, PDPage page, boolean subsamplingAllowed,
-                         RenderDestination destination, RenderingHints renderingHints)
+                         RenderDestination destination, RenderingHints renderingHints,
+                         float imageDownscalingOptimizationThreshhold)
     {
         this.renderer = renderer;
         this.page = page;
         this.subsamplingAllowed = subsamplingAllowed;
         this.destination = destination;
         this.renderingHints = renderingHints;
+        this.imageDownscalingOptimizationThreshhold = imageDownscalingOptimizationThreshhold;
     }
 
     /**
@@ -88,4 +91,14 @@ public final class PageDrawerParameters
     {
         return renderingHints;
     }
+
+    /**
+     * 
+     * @return the imageDownscalingOptimizationThreshhold
+     */
+
+    public float getImageDownscalingOptimizationThreshhold()
+    {
+        return imageDownscalingOptimizationThreshhold;
+    }
 }