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