You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ms...@apache.org on 2018/02/02 16:46:52 UTC

svn commit: r1822987 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers: PDAbstractAppearanceHandler.java PDSquareAppearanceHandler.java

Author: msahyoun
Date: Fri Feb  2 16:46:52 2018
New Revision: 1822987

URL: http://svn.apache.org/viewvc?rev=1822987&view=rev
Log:
PDFBOX-3353: correct calculations for annotation /Rect, /RD and borderBox; align handling for empty /RD with Adobe Reader

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDAbstractAppearanceHandler.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDSquareAppearanceHandler.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDAbstractAppearanceHandler.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDAbstractAppearanceHandler.java?rev=1822987&r1=1822986&r2=1822987&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDAbstractAppearanceHandler.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDAbstractAppearanceHandler.java Fri Feb  2 16:46:52 2018
@@ -185,6 +185,49 @@ public abstract class PDAbstractAppearan
         return new PDRectangle(rectangle.getLowerLeftX() + padding, rectangle.getLowerLeftY() + padding,
                 rectangle.getWidth() - 2 * padding, rectangle.getHeight() - 2 * padding);
     }
+    
+    /**
+     * Get a rectangle enlarged by the differences.
+     * 
+     * <p>Creates a new rectangle with differences added to each side.
+     * .
+     * @param rectangle the rectangle.
+     * @param diifferences the differences to apply.
+     * @return the padded rectangle.
+     */
+    PDRectangle addRectDifferences(PDRectangle rectangle, float[] differences)
+    {
+        if (differences == null || differences.length != 4)
+        {
+            return rectangle;
+        }
+        
+        return new PDRectangle(rectangle.getLowerLeftX() - differences[0],
+                rectangle.getLowerLeftY() - differences[1],
+                rectangle.getWidth() + differences[0] + differences[2],
+                rectangle.getHeight() + differences[1] + differences[3]);
+    }
+    
+    /**
+     * Get a rectangle with the differences applied to each side.
+     * 
+     * <p>Creates a new rectangle with differences added to each side.
+     * .
+     * @param rectangle the rectangle.
+     * @param diifferences the differences to apply.
+     * @return the padded rectangle.
+     */
+    PDRectangle applyRectDifferences(PDRectangle rectangle, float[] differences)
+    {
+        if (differences == null || differences.length != 4)
+        {
+            return rectangle;
+        }
+        return new PDRectangle(rectangle.getLowerLeftX() + differences[0],
+                rectangle.getLowerLeftY() + differences[1],
+                rectangle.getWidth() - differences[0] - differences[2],
+                rectangle.getHeight() - differences[1] - differences[3]);
+    }
 
     void handleOpacity(float opacity) throws IOException
     {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDSquareAppearanceHandler.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDSquareAppearanceHandler.java?rev=1822987&r1=1822986&r2=1822987&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDSquareAppearanceHandler.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDSquareAppearanceHandler.java Fri Feb  2 16:46:52 2018
@@ -68,15 +68,34 @@ public class PDSquareAppearanceHandler e
                 
                 contentStream.setBorderLine(lineWidth, annotation.getBorderStyle());
                 
-                // the differences rectangle
-                // TODO: this only works for border effect solid. Cloudy needs a different approach.
-                setRectDifference(lineWidth);
+                // handle the border box
+                // 
+                // There are two options. The handling is not part of the PDF specification but
+                // implementation specific to Adobe Reader
+                // - if /RD is set the border box is the /Rect entry inset by the respective
+                //   border difference.
+                // - if /RD is not set the border box is defined by the /Rect entry. The /RD entry will
+                //   be set to be the line width and the /Rect is enlarged by the /RD amount
+
+                PDRectangle borderBox = null;
+                float[] rectDifferences = annotation.getRectDifferences();
                 
-                // Acrobat applies a padding to each side of the bbox so the line is completely within
-                // the bbox.
-                PDRectangle borderEdge = getPaddedRectangle(getRectangle(),lineWidth);
-                contentStream.addRect(borderEdge.getLowerLeftX(), borderEdge.getLowerLeftY(),
-                        borderEdge.getWidth(), borderEdge.getHeight());
+                if (rectDifferences.length == 0)
+                {
+                    borderBox = getPaddedRectangle(getRectangle(), lineWidth/2);
+                    // the differences rectangle
+                    // TODO: this only works for border effect solid. Cloudy needs a different approach.
+                    annotation.setRectDifferences(lineWidth/2);
+                    annotation.setRectangle(addRectDifferences(getRectangle(), annotation.getRectDifferences()));
+                }
+                else
+                {
+                    borderBox = applyRectDifferences(getRectangle(), rectDifferences);
+                    borderBox = getPaddedRectangle(borderBox, lineWidth/2);
+                }
+                
+                contentStream.addRect(borderBox.getLowerLeftX(), borderBox.getLowerLeftY(),
+                        borderBox.getWidth(), borderBox.getHeight());
                 
                 contentStream.drawShape(lineWidth, hasStroke, hasBackground);
             }