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();