Author: tilman
Date: Tue Aug 19 09:42:53 2025
New Revision: 1927876

Log:
PDFBOX-5660: optimize, as suggested by Valery Bokov; closes #217

Modified:
   
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
==============================================================================
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
  Tue Aug 19 09:37:31 2025        (r1927875)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
  Tue Aug 19 09:42:53 2025        (r1927876)
@@ -474,12 +474,15 @@ class AppearanceGeneratorHelper {
         }
         float padding = Math.max(1f, borderWidth);
         PDRectangle clipRect = applyPadding(bbox, padding);
+        float clipRectLowerLeftY = clipRect.getLowerLeftY();
+        float clipRectHeight = clipRect.getHeight();
+
         PDRectangle contentRect = applyPadding(clipRect, padding);
 
         contents.saveGraphicsState();
 
         // Acrobat always adds a clipping path
-        contents.addRect(clipRect.getLowerLeftX(), clipRect.getLowerLeftY(), 
clipRect.getWidth(), clipRect.getHeight());
+        contents.addRect(clipRect.getLowerLeftX(), clipRectLowerLeftY, 
clipRect.getWidth(), clipRectHeight);
         contents.clip();
 
         // get the font
@@ -538,22 +541,28 @@ class AppearanceGeneratorHelper {
             fontDescentAtSize = fontDescent * fontScaleY;
         }
 
-        if (field instanceof PDTextField && ((PDTextField) 
field).isMultiline()) {
+        if (field instanceof PDTextField && ((PDTextField) 
field).isMultiline())
+        {
             y = contentRect.getUpperRightY() - fontBoundingBoxAtSize;
-        } else {
-            // Adobe shows the text 'shifted up' in case the caps don't fit 
into the
-            // clipping area
-            if (fontCapAtSize > clipRect.getHeight()) {
-                y = clipRect.getLowerLeftY() + -fontDescentAtSize;
-            } else {
+        }
+        else
+        {
+            // Adobe shows the text 'shifted up' in case the caps don't fit 
into the clipping area
+            if (fontCapAtSize > clipRectHeight)
+            {
+                y = clipRectLowerLeftY + -fontDescentAtSize;
+            }
+            else
+            {
                 // calculate the position based on the content rectangle
-                y = clipRect.getLowerLeftY() + (clipRect.getHeight() - 
fontCapAtSize) / 2;
+                y = clipRectLowerLeftY + (clipRectHeight - fontCapAtSize) / 2;
 
                 // check to ensure that ascents and descents fit
-                if (y - clipRect.getLowerLeftY() < -fontDescentAtSize) {
-
-                    float fontDescentBased = -fontDescentAtSize + 
contentRect.getLowerLeftY();
-                    float fontCapBased = contentRect.getHeight() - 
contentRect.getLowerLeftY() - fontCapAtSize;
+                if (y - clipRectLowerLeftY < -fontDescentAtSize)
+                {
+                    float contentRectLowerLeftY = contentRect.getLowerLeftY();
+                    float fontDescentBased = -fontDescentAtSize + 
contentRectLowerLeftY;
+                    float fontCapBased = contentRect.getHeight() - 
contentRectLowerLeftY - fontCapAtSize;
 
                     y = Math.min(fontDescentBased, Math.max(y, fontCapBased));
                 }

Reply via email to