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 2015/07/20 18:17:54 UTC

svn commit: r1691972 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java

Author: msahyoun
Date: Mon Jul 20 16:17:53 2015
New Revision: 1691972

URL: http://svn.apache.org/r1691972
Log:
PDFBOX-2877: adjust vertical text alignment

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

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java?rev=1691972&r1=1691971&r2=1691972&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java Mon Jul 20 16:17:53 2015
@@ -231,21 +231,32 @@ class AppearanceGeneratorHelper
         // calculate the y-position of the baseline
         float y;
         
-        // calculate the Y fontScale at fontSize
-        float fontScaleY = font.getFontMatrix().getScaleY() * fontSize;
-        
+        // calculate font metrics at font size
+        float fontScaleY = fontSize / 1000f;
+        float fontBoundingBoxAtSize = font.getBoundingBox().getHeight() * fontScaleY;
+        float fontCapAtSize = font.getFontDescriptor().getCapHeight() * fontScaleY;
+        float fontDescentAtSize = font.getFontDescriptor().getDescent() * fontScaleY;
         
         if (field instanceof PDTextField && ((PDTextField) field).isMultiline())
         {
-            float height = font.getBoundingBox().getHeight() * fontScaleY;
-            y = contentRect.getUpperRightY() - height;
+            y = contentRect.getUpperRightY() - fontBoundingBoxAtSize;
         }
         else
         {
-            float capHeigth = font.getFontDescriptor().getCapHeight() * fontScaleY;
-            y = Math.max((bbox.getHeight() - capHeigth) / 2f, 0);
-        }
+            // calculate the position based on the content rectangle
+            y = clipRect.getLowerLeftY() + (clipRect.getHeight() - 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;
+
+                y = Math.min(fontDescentBased, Math.max(y, fontCapBased));
+            }
+            
+        }
+        
         // show the text
         float x = contentRect.getLowerLeftX();