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 2018/03/20 18:58:11 UTC

svn commit: r1827345 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java

Author: tilman
Date: Tue Mar 20 18:58:11 2018
New Revision: 1827345

URL: http://svn.apache.org/viewvc?rev=1827345&view=rev
Log:
PDFBOX-4161: allow user to influence transform

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

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java?rev=1827345&r1=1827344&r2=1827345&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java Tue Mar 20 18:58:11 2018
@@ -435,20 +435,41 @@ public class Overlay
             throws IOException
     {
         // create a new content stream that executes the XObject content
-        PDRectangle pageMediaBox = page.getMediaBox();
-        float hShift = (pageMediaBox.getWidth() - layoutPage.overlayMediaBox.getWidth()) / 2.0f;
-        float vShift = (pageMediaBox.getHeight() - layoutPage.overlayMediaBox.getHeight()) / 2.0f;
         StringBuilder overlayStream = new StringBuilder();
-        overlayStream.append("q\nq 1 0 0 1 ");
-        overlayStream.append(float2String(hShift));
-        overlayStream.append(" ");
-        overlayStream.append(float2String(vShift) );
-        overlayStream.append(" cm /");
+        overlayStream.append("q\nq\n");
+        AffineTransform at = calculateAffineTransform(page, layoutPage.overlayMediaBox);
+        double[] flatmatrix = new double[6];
+        at.getMatrix(flatmatrix);
+        for (double v : flatmatrix)
+        {
+            overlayStream.append(float2String((float) v));
+            overlayStream.append(" ");
+        }
+        overlayStream.append(" cm\n/");
         overlayStream.append(xObjectId.getName());
         overlayStream.append(" Do Q\nQ\n");
         return createStream(overlayStream.toString());
     }
 
+    /**
+     * 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.
+     *
+     * @param page The page that will get the overlay.
+     * @param overlayMediaBox The overlay media box.
+     * @return The affine transform to be used.
+     */
+    protected AffineTransform calculateAffineTransform(PDPage page, PDRectangle overlayMediaBox)
+    {
+        AffineTransform at = new AffineTransform();
+        PDRectangle pageMediaBox = page.getMediaBox();
+        float hShift = (pageMediaBox.getWidth() - overlayMediaBox.getWidth()) / 2.0f;
+        float vShift = (pageMediaBox.getHeight() - overlayMediaBox.getHeight()) / 2.0f;
+        at.translate(hShift, vShift);
+        return at;
+    }
+
     private String float2String(float floatValue)
     {
         // use a BigDecimal as intermediate state to avoid