Author: tilman
Date: Mon Jul 27 09:07:59 2026
New Revision: 1936620
Log:
PDFBOX-6223: more refactoring to avoid calculating things twice
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
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
Mon Jul 27 09:07:55 2026 (r1936619)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
Mon Jul 27 09:07:59 2026 (r1936620)
@@ -242,20 +242,23 @@ class AppearanceGeneratorHelper
PDAppearanceEntry appearance =
appearanceDict.getNormalAppearance();
// TODO support appearances other than "normal"
-
+
+ PDAppearanceCharacteristicsDictionary appearanceCharacteristics =
+ widget.getAppearanceCharacteristics();
+ int widgetRotation = resolveRotation(appearanceCharacteristics);
+ PDRectangle newBBox = computeBBox(widget, widgetRotation);
PDAppearanceStream appearanceStream;
- if (isValidAppearanceStream(appearance))
+ // We're using the existing appearance if possible (since 2013 or
even earlier)
+ // However, except for the file from PDFBOX-2586 we could ignore it
+ if (isValidAppearanceStream(appearance, widgetRotation, newBBox))
{
appearanceStream = appearance.getAppearanceStream();
}
else
{
- appearanceStream = prepareNormalAppearanceStream(widget);
+ appearanceStream = prepareNormalAppearanceStream(widget,
newBBox, widgetRotation);
appearanceDict.setNormalAppearance(appearanceStream);
- // TODO support appearances other than "normal"
}
- PDAppearanceCharacteristicsDictionary appearanceCharacteristics =
- widget.getAppearanceCharacteristics();
/*
* Adobe Acrobat always recreates the complete appearance stream
if there is an appearance characteristics
@@ -299,7 +302,7 @@ class AppearanceGeneratorHelper
return apValue;
}
- private static boolean isValidAppearanceStream(PDAppearanceEntry
appearance)
+ private static boolean isValidAppearanceStream(PDAppearanceEntry
appearance, int widgetRotation, PDRectangle newBBox)
{
if (appearance == null)
{
@@ -317,16 +320,12 @@ class AppearanceGeneratorHelper
return Math.abs(bbox.getWidth()) > 0 && Math.abs(bbox.getHeight()) > 0;
}
- private PDAppearanceStream
prepareNormalAppearanceStream(PDAnnotationWidget widget)
+ private PDAppearanceStream
prepareNormalAppearanceStream(PDAnnotationWidget widget, PDRectangle bbox, int
widgetRotation)
{
PDAppearanceStream appearanceStream = new
PDAppearanceStream(field.getAcroForm().getDocument());
- // Calculate the entries for the bounding box and the transformation
matrix
- // settings for the appearance stream
- PDRectangle bbox = computeBBox(widget);
appearanceStream.setBBox(bbox);
- int rotation = resolveRotation(widget);
- AffineTransform at = calculateMatrix(bbox, rotation);
+ AffineTransform at = calculateMatrix(bbox, widgetRotation);
if (!at.isIdentity())
{
appearanceStream.setMatrix(at);
@@ -336,10 +335,10 @@ class AppearanceGeneratorHelper
return appearanceStream;
}
- private static PDRectangle computeBBox(PDAnnotationWidget widget)
+ private static PDRectangle computeBBox(PDAnnotationWidget widget, int
widgetRotation)
{
PDRectangle rect = widget.getRectangle();
- Matrix matrix =
Matrix.getRotateInstance(Math.toRadians(resolveRotation(widget)), 0, 0);
+ Matrix matrix =
Matrix.getRotateInstance(Math.toRadians(widgetRotation), 0, 0);
Point2D.Float point2D = matrix.transformPoint(rect.getWidth(),
rect.getHeight());
return new PDRectangle(Math.abs((float) point2D.getX()),
Math.abs((float) point2D.getY()));
}
@@ -351,9 +350,8 @@ class AppearanceGeneratorHelper
return new PDDefaultAppearanceString(da, dr);
}
- private static int resolveRotation(PDAnnotationWidget widget)
+ private static int resolveRotation(PDAppearanceCharacteristicsDictionary
characteristicsDictionary)
{
- PDAppearanceCharacteristicsDictionary characteristicsDictionary =
widget.getAppearanceCharacteristics();
if (characteristicsDictionary != null)
{
// 0 is the default value if the R key doesn't exist