Author: tilman
Date: Wed Aug  6 10:55:54 2025
New Revision: 1927640

Log:
PDFBOX-6048: calculate overlay position to lower left of the media box instead 
of from (0,0)

Modified:
   pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java   
Wed Aug  6 10:48:21 2025        (r1927639)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java   
Wed Aug  6 10:55:54 2025        (r1927640)
@@ -31,6 +31,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.cos.COSArray;
@@ -54,6 +56,8 @@ import org.apache.pdfbox.pdmodel.graphic
  */
 public class Overlay implements Closeable
 {
+    private static final Logger LOG = LogManager.getLogger(Overlay.class);
+
     /**
      * Possible location of the overlaid pages: foreground or background.
      */
@@ -565,8 +569,9 @@ public class Overlay implements Closeabl
 
     /**
      * Calculate the transform to be used when positioning the overlay. The 
default implementation
-     * centers on the destination. Override this method to do your own, e.g. 
move to a corner, or
-     * rotate.
+     * centers on the destination, and this is calculated from the lower left 
of the media box of
+     * the destination (this has been changed from 3.0 and 2.0, see 
PDFBOX-6048 for details).
+     * Override this method to do your own, e.g. move to a corner, rotate, or 
zoom.
      *
      * @param page The page that will get the overlay.
      * @param overlayMediaBox The overlay media box.
@@ -576,8 +581,9 @@ public class Overlay implements Closeabl
     {
         AffineTransform at = new AffineTransform();
         PDRectangle pageMediaBox = page.getMediaBox();
-        float hShift = (pageMediaBox.getWidth() - overlayMediaBox.getWidth()) 
/ 2.0f;
-        float vShift = (pageMediaBox.getHeight() - 
overlayMediaBox.getHeight()) / 2.0f;
+        float hShift = pageMediaBox.getLowerLeftX() + (pageMediaBox.getWidth() 
- overlayMediaBox.getWidth()) / 2.0f;
+        float vShift = pageMediaBox.getLowerLeftY() + 
(pageMediaBox.getHeight() - overlayMediaBox.getHeight()) / 2.0f;
+        LOG.debug("Overlay position: ({},{})", hShift, vShift);
         at.translate(hShift, vShift);
         return at;
     }

Reply via email to