Author: tilman
Date: Sun Sep 16 11:25:47 2018
New Revision: 1840996
URL: http://svn.apache.org/viewvc?rev=1840996&view=rev
Log:
PDFBOX-3353: underline is not at bottom, but at bottom + delta / 7
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDUnderlineAppearanceHandler.java
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDUnderlineAppearanceHandler.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDUnderlineAppearanceHandler.java?rev=1840996&r1=1840995&r2=1840996&view=diff
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDUnderlineAppearanceHandler.java
(original)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDUnderlineAppearanceHandler.java
Sun Sep 16 11:25:47 2018
@@ -105,9 +105,31 @@ public class PDUnderlineAppearanceHandle
//
https://stackoverflow.com/questions/9855814/pdf-spec-vs-acrobat-creation-quadpoints
for (int i = 0; i < pathsArray.length / 8; ++i)
{
- // only lower coords are used
- cs.moveTo(pathsArray[i * 8 + 4], pathsArray[i * 8 + 5]);
- cs.lineTo(pathsArray[i * 8 + 6], pathsArray[i * 8 + 7]);
+ // Adobe deoesn't use the lower coordinate for the line, it
uses lower + delta / 7.
+ // do the math for diagonal annotations with this weird old
trick:
+ //
https://stackoverflow.com/questions/7740507/extend-a-line-segment-a-specific-distance
+ float len0 = (float) (Math.sqrt(Math.pow(pathsArray[i * 8] -
pathsArray[i * 8 + 4], 2) +
+ Math.pow(pathsArray[i * 8 + 1] -
pathsArray[i * 8 + 5], 2)));
+ float x0 = pathsArray[i * 8 + 4];
+ float y0 = pathsArray[i * 8 + 5];
+ if (Float.compare(len0, 0) != 0)
+ {
+ // only if both coordinates are not identical to avoid
divide by zero
+ x0 += (pathsArray[i * 8] - pathsArray[i * 8 + 4]) / len0 *
len0 / 7;
+ y0 += (pathsArray[i * 8 + 1] - pathsArray[i * 8 + 5]) /
len0 * (len0 / 7);
+ }
+ float len1 = (float) (Math.sqrt(Math.pow(pathsArray[i * 8 + 2]
- pathsArray[i * 8 + 6], 2) +
+ Math.pow(pathsArray[i * 8 + 3] -
pathsArray[i * 8 + 7], 2)));
+ float x1 = pathsArray[i * 8 + 6];
+ float y1 = pathsArray[i * 8 + 7];
+ if (Float.compare(len1, 0) != 0)
+ {
+ // only if both coordinates are not identical to avoid
divide by zero
+ x1 += (pathsArray[i * 8 + 2] - pathsArray[i * 8 + 6]) /
len1 * len1 / 7;
+ y1 += (pathsArray[i * 8 + 3] - pathsArray[i * 8 + 7]) /
len1 * len1 / 7;
+ }
+ cs.moveTo(x0, y0);
+ cs.lineTo(x1, y1);
}
cs.stroke();
}