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/03/13 16:00:53 UTC

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

Author: msahyoun
Date: Fri Mar 13 15:00:52 2015
New Revision: 1666472

URL: http://svn.apache.org/r1666472
Log:
PDFBOX-1402 adjust calculation for line spacing and first line offset

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainTextFormatter.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=1666472&r1=1666471&r2=1666472&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 Fri Mar 13 15:00:52 2015
@@ -302,19 +302,21 @@ class AppearanceGeneratorHelper
         }
         else
         {
-            composer.newLineAtOffset(leftOffset, verticalOffset);
-
             PlainText textContent = new PlainText(value);
             AppearanceStyle appearanceStyle = new AppearanceStyle();
             appearanceStyle.setFont(font);
             appearanceStyle.setFontSize(fontSize);
             
+            //Adobe Acrobat uses the font's bounding box for the leading between the lines
+            appearanceStyle.setLeading(font.getBoundingBox().getHeight() / GLYPH_TO_PDF_SCALE * fontSize);
+            
             PlainTextFormatter formatter = new PlainTextFormatter
                                                 .Builder(composer)
                                                     .style(appearanceStyle)
                                                     .text(textContent)
                                                     .width(contentEdge.getWidth())
                                                     .wrapLines(true)
+                                                    .initialOffset(leftOffset, verticalOffset)
                                                     .textAlign(parent.getQ())
                                                     .build();
             formatter.format();
@@ -513,11 +515,11 @@ class AppearanceGeneratorHelper
     {
         float verticalOffset;
         float capHeight = getCapHeight(pdFont, fontSize);
-        float descent = getDescent(pdFont, fontSize);
+        float fontHeight = pdFont.getBoundingBox().getHeight()  / GLYPH_TO_PDF_SCALE * fontSize;
         
         if (parent instanceof PDTextField && ((PDTextField) parent).isMultiline())
         {
-            verticalOffset = contentEdge.getUpperRightY() + descent;
+            verticalOffset = contentEdge.getUpperRightY() - fontHeight;
         }
         else
         {
@@ -621,27 +623,6 @@ class AppearanceGeneratorHelper
     }
     
     /**
-     * Get the descent for a font.
-     * @throws IOException in case the font information can not be retrieved.
-     */
-    private float getDescent(PDFont pdFont, float fontSize) throws IOException
-    {
-        final PDFontDescriptor fontDescriptor = pdFont.getFontDescriptor();
-        
-        // as the font descriptor might be null or the cap height might be 0 
-        // alternate calculation for the cap height
-        if (fontDescriptor == null || fontDescriptor.getDescent() == 0)
-        {
-            // TODO: refine the calculation if needed
-            return -pdFont.getBoundingBox().getHeight() / GLYPH_TO_PDF_SCALE * fontSize * 0.3f;
-        }
-        else
-        {
-            return pdFont.getFontDescriptor().getDescent() / GLYPH_TO_PDF_SCALE * fontSize;
-        }
-    }
-       
-    /**
      * Apply padding to a box.
      * 
      * @param original box

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainTextFormatter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainTextFormatter.java?rev=1666472&r1=1666471&r2=1666472&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainTextFormatter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainTextFormatter.java Fri Mar 13 15:00:52 2015
@@ -72,6 +72,9 @@ class PlainTextFormatter
     private final PlainText textContent;
     private final TextAlign textAlignment;
     
+    private final float horizontalOffset;
+    private final float verticalOffset;
+    
     static class Builder
     {
 
@@ -85,6 +88,11 @@ class PlainTextFormatter
         private PlainText textContent;
         private TextAlign textAlignment = TextAlign.LEFT;
         
+       
+        // initial offset from where to start the position of the first line
+        private float horizontalOffset = 0f;
+        private float verticalOffset = 0f;
+        
         public Builder(AppearancePrimitivesComposer composer)
         {
             this.composer = composer;
@@ -127,6 +135,13 @@ class PlainTextFormatter
             return this;
         }
         
+        Builder initialOffset(float horizontalOffset, float verticalOffset)
+        {
+            this.horizontalOffset = horizontalOffset;
+            this.verticalOffset = verticalOffset;
+            return this;
+        }
+        
         PlainTextFormatter build()
         {
             return new PlainTextFormatter(this);
@@ -141,6 +156,8 @@ class PlainTextFormatter
         composer = builder.composer;
         textContent = builder.textContent;
         textAlignment = builder.textAlignment;
+        horizontalOffset = builder.horizontalOffset;
+        verticalOffset = builder.verticalOffset;
     }
     
     /**
@@ -210,7 +227,15 @@ class PlainTextFormatter
             }
             
             float offset = -lastPos + startOffset;
-            composer.newLineAtOffset(offset, -appearanceStyle.getLeading());
+            
+            if (lines.indexOf(line) == 0)
+            {
+                composer.newLineAtOffset(offset + horizontalOffset, verticalOffset);
+            }
+            else
+            {
+                composer.newLineAtOffset(offset, -appearanceStyle.getLeading());
+            }
             lastPos = startOffset; 
 
             List<Word> words = line.getWords();