Skip to content

Commit ecf88c8

Browse files
committed
Pass signature appearance properties to the newly created field
DEVSIX-8037
1 parent d89c0a8 commit ecf88c8

File tree

11 files changed

+214
-110
lines changed

11 files changed

+214
-110
lines changed

forms/src/main/java/com/itextpdf/forms/form/renderer/AbstractFormFieldRenderer.java

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,16 @@ This file is part of the iText (R) project.
2222
*/
2323
package com.itextpdf.forms.form.renderer;
2424

25-
import com.itextpdf.forms.fields.PdfFormAnnotation;
2625
import com.itextpdf.forms.form.FormProperty;
2726
import com.itextpdf.forms.form.element.IFormField;
2827
import com.itextpdf.forms.logs.FormsLogMessageConstants;
2928
import com.itextpdf.kernel.geom.Rectangle;
3029
import com.itextpdf.kernel.pdf.PdfAConformanceLevel;
31-
import com.itextpdf.kernel.pdf.PdfDictionary;
3230
import com.itextpdf.kernel.pdf.PdfDocument;
33-
import com.itextpdf.kernel.pdf.PdfName;
34-
import com.itextpdf.kernel.pdf.annot.PdfAnnotation;
3531
import com.itextpdf.kernel.pdf.tagging.StandardRoles;
3632
import com.itextpdf.kernel.pdf.tagutils.AccessibilityProperties;
3733
import com.itextpdf.kernel.pdf.tagutils.TagTreePointer;
3834
import com.itextpdf.layout.IPropertyContainer;
39-
import com.itextpdf.layout.borders.Border;
4035
import com.itextpdf.layout.layout.LayoutArea;
4136
import com.itextpdf.layout.layout.LayoutContext;
4237
import com.itextpdf.layout.layout.LayoutResult;
@@ -355,61 +350,6 @@ void applyProperties(Map<Integer, Object> properties) {
355350
}
356351
}
357352

358-
/**
359-
* Applies the border property.
360-
*
361-
* @param annotation the annotation to set border characteristics to.
362-
*/
363-
void applyBorderProperty(PdfFormAnnotation annotation) {
364-
applyBorderProperty(this, annotation);
365-
}
366-
367-
/**
368-
* Applies the border property to the renderer.
369-
*
370-
* @param renderer renderer to apply border properties to.
371-
* @param annotation the annotation to set border characteristics to.
372-
*/
373-
static void applyBorderProperty(IRenderer renderer, PdfFormAnnotation annotation) {
374-
Border border = renderer.<Border>getProperty(Property.BORDER);
375-
if (border == null) {
376-
// For now, we set left border to an annotation, but appropriate borders for an element will be drawn.
377-
border = renderer.<Border>getProperty(Property.BORDER_LEFT);
378-
}
379-
if (border != null) {
380-
annotation.setBorderStyle(transformBorderTypeToBorderStyleDictionary(border.getType()));
381-
annotation.setBorderColor(border.getColor());
382-
annotation.setBorderWidth(border.getWidth());
383-
}
384-
}
385-
386-
static private PdfDictionary transformBorderTypeToBorderStyleDictionary(int borderType) {
387-
PdfDictionary bs = new PdfDictionary();
388-
PdfName style;
389-
switch (borderType) {
390-
case 1001:
391-
style = PdfAnnotation.STYLE_UNDERLINE;
392-
break;
393-
case 1002:
394-
style = PdfAnnotation.STYLE_BEVELED;
395-
break;
396-
case 1003:
397-
style = PdfAnnotation.STYLE_INSET;
398-
break;
399-
case Border.DASHED_FIXED:
400-
case Border.DASHED:
401-
case Border.DOTTED:
402-
// Default dash array will be used.
403-
style = PdfAnnotation.STYLE_DASHED;
404-
break;
405-
default:
406-
style = PdfAnnotation.STYLE_SOLID;
407-
break;
408-
}
409-
bs.put(PdfName.S, style);
410-
return bs;
411-
}
412-
413353
private void processLangAttribute() {
414354
IPropertyContainer propertyContainer = flatRenderer.getModelElement();
415355
String lang = getLang();

forms/src/main/java/com/itextpdf/forms/form/renderer/AbstractTextFieldRenderer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ This file is part of the iText (R) project.
2525
import com.itextpdf.forms.fields.AbstractPdfFormField;
2626
import com.itextpdf.forms.fields.PdfFormField;
2727
import com.itextpdf.forms.form.element.IFormField;
28+
import com.itextpdf.forms.util.BorderStyleUtil;
2829
import com.itextpdf.kernel.font.PdfFont;
2930
import com.itextpdf.kernel.geom.Rectangle;
3031
import com.itextpdf.kernel.pdf.annot.PdfAnnotation;
@@ -95,7 +96,7 @@ void applyDefaultFieldProperties(PdfFormField inputField) {
9596
inputField.setColor(color.getColor());
9697
}
9798
inputField.setJustification(this.<TextAlignment>getProperty(Property.TEXT_ALIGNMENT));
98-
applyBorderProperty(inputField.getFirstFormAnnotation());
99+
BorderStyleUtil.applyBorderProperty(this, inputField.getFirstFormAnnotation());
99100
Background background = this.<Background>getProperty(Property.BACKGROUND);
100101
if (background != null) {
101102
inputField.getFirstFormAnnotation().setBackgroundColor(background.getColor());

forms/src/main/java/com/itextpdf/forms/form/renderer/CheckBoxRenderer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ This file is part of the iText (R) project.
3333
import com.itextpdf.forms.form.renderer.checkboximpl.ICheckBoxRenderingStrategy;
3434
import com.itextpdf.forms.form.renderer.checkboximpl.PdfACheckBoxRenderingStrategy;
3535
import com.itextpdf.forms.form.renderer.checkboximpl.PdfCheckBoxRenderingStrategy;
36+
import com.itextpdf.forms.util.BorderStyleUtil;
3637
import com.itextpdf.kernel.geom.Rectangle;
3738
import com.itextpdf.kernel.pdf.PdfAConformanceLevel;
3839
import com.itextpdf.kernel.pdf.PdfDocument;
@@ -242,7 +243,7 @@ protected void applyAcroField(DrawContext drawContext) {
242243
}
243244
final PdfButtonFormField checkBox = builder.createCheckBox();
244245
checkBox.disableFieldRegeneration();
245-
applyBorderProperty(checkBox.getFirstFormAnnotation());
246+
BorderStyleUtil.applyBorderProperty(this, checkBox.getFirstFormAnnotation());
246247
final Background background = this.modelElement.<Background>getProperty(Property.BACKGROUND);
247248
if (background != null) {
248249
checkBox.getFirstFormAnnotation().setBackgroundColor(background.getColor());

forms/src/main/java/com/itextpdf/forms/form/renderer/RadioRenderer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ This file is part of the iText (R) project.
3030
import com.itextpdf.forms.fields.RadioFormFieldBuilder;
3131
import com.itextpdf.forms.form.FormProperty;
3232
import com.itextpdf.forms.form.element.Radio;
33+
import com.itextpdf.forms.util.BorderStyleUtil;
3334
import com.itextpdf.forms.util.DrawingUtil;
3435
import com.itextpdf.kernel.colors.Color;
3536
import com.itextpdf.kernel.colors.ColorConstants;
@@ -201,7 +202,7 @@ protected void applyAcroField(DrawContext drawContext) {
201202
if (background != null) {
202203
radio.setBackgroundColor(background.getColor());
203204
}
204-
applyBorderProperty(radio);
205+
BorderStyleUtil.applyBorderProperty(this, radio);
205206
radio.setFormFieldElement((Radio) modelElement);
206207

207208
radioGroup.addKid(radio);

forms/src/main/java/com/itextpdf/forms/form/renderer/SelectFieldComboBoxRenderer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ This file is part of the iText (R) project.
3030
import com.itextpdf.forms.form.element.AbstractSelectField;
3131
import com.itextpdf.forms.form.element.ComboBoxField;
3232
import com.itextpdf.forms.form.element.SelectFieldItem;
33+
import com.itextpdf.forms.util.BorderStyleUtil;
3334
import com.itextpdf.io.logs.IoLogMessageConstant;
3435
import com.itextpdf.kernel.font.PdfFont;
3536
import com.itextpdf.kernel.geom.Rectangle;
@@ -126,7 +127,7 @@ protected void applyAcroField(DrawContext drawContext) {
126127
if (background != null) {
127128
comboBoxField.getFirstFormAnnotation().setBackgroundColor(background.getColor());
128129
}
129-
AbstractFormFieldRenderer.applyBorderProperty(this, comboBoxField.getFirstFormAnnotation());
130+
BorderStyleUtil.applyBorderProperty(this, comboBoxField.getFirstFormAnnotation());
130131

131132
UnitValue fontSize = getFontSize();
132133
if (fontSize != null) {

forms/src/main/java/com/itextpdf/forms/form/renderer/SelectFieldListBoxRenderer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ This file is part of the iText (R) project.
2929
import com.itextpdf.forms.form.FormProperty;
3030
import com.itextpdf.forms.form.element.AbstractSelectField;
3131
import com.itextpdf.forms.form.element.ListBoxField;
32+
import com.itextpdf.forms.util.BorderStyleUtil;
3233
import com.itextpdf.io.logs.IoLogMessageConstant;
3334
import com.itextpdf.kernel.colors.ColorConstants;
3435
import com.itextpdf.kernel.colors.DeviceRgb;
@@ -218,7 +219,7 @@ protected void applyAcroField(DrawContext drawContext) {
218219
}
219220
choiceField.setJustification(this.<TextAlignment>getProperty(Property.TEXT_ALIGNMENT));
220221

221-
AbstractFormFieldRenderer.applyBorderProperty(this, choiceField.getFirstFormAnnotation());
222+
BorderStyleUtil.applyBorderProperty(this, choiceField.getFirstFormAnnotation());
222223

223224
Background background = this.<Background>getProperty(Property.BACKGROUND);
224225
if (background != null) {
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
This file is part of the iText (R) project.
3+
Copyright (c) 1998-2024 Apryse Group NV
4+
Authors: Apryse Software.
5+
6+
This program is offered under a commercial and under the AGPL license.
7+
For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below.
8+
9+
AGPL licensing:
10+
This program is free software: you can redistribute it and/or modify
11+
it under the terms of the GNU Affero General Public License as published by
12+
the Free Software Foundation, either version 3 of the License, or
13+
(at your option) any later version.
14+
15+
This program is distributed in the hope that it will be useful,
16+
but WITHOUT ANY WARRANTY; without even the implied warranty of
17+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18+
GNU Affero General Public License for more details.
19+
20+
You should have received a copy of the GNU Affero General Public License
21+
along with this program. If not, see <https://www.gnu.org/licenses/>.
22+
*/
23+
package com.itextpdf.forms.util;
24+
25+
import com.itextpdf.forms.fields.PdfFormAnnotation;
26+
import com.itextpdf.kernel.pdf.PdfDictionary;
27+
import com.itextpdf.kernel.pdf.PdfName;
28+
import com.itextpdf.kernel.pdf.annot.PdfAnnotation;
29+
import com.itextpdf.layout.IPropertyContainer;
30+
import com.itextpdf.layout.borders.Border;
31+
import com.itextpdf.layout.properties.Property;
32+
33+
/**
34+
* This file is a helper class for the internal usage only.
35+
* Be aware that its API and functionality may be changed in the future.
36+
*/
37+
public final class BorderStyleUtil {
38+
39+
/**
40+
* Applies the border property to the annotation.
41+
*
42+
* @param container property container to apply border properties from.
43+
* @param annotation the annotation to set border characteristics to.
44+
*/
45+
public static void applyBorderProperty(IPropertyContainer container, PdfFormAnnotation annotation) {
46+
Border border = container.<Border>getProperty(Property.BORDER);
47+
if (border == null) {
48+
// For now, we set left border to an annotation, but appropriate borders for an element will be drawn.
49+
border = container.<Border>getProperty(Property.BORDER_LEFT);
50+
}
51+
if (border != null) {
52+
annotation.setBorderStyle(transformBorderTypeToBorderStyleDictionary(border.getType()));
53+
annotation.setBorderColor(border.getColor());
54+
annotation.setBorderWidth(border.getWidth());
55+
}
56+
}
57+
58+
private static PdfDictionary transformBorderTypeToBorderStyleDictionary(int borderType) {
59+
final PdfDictionary bs = new PdfDictionary();
60+
PdfName style;
61+
switch (borderType) {
62+
case 1001:
63+
style = PdfAnnotation.STYLE_UNDERLINE;
64+
break;
65+
case 1002:
66+
style = PdfAnnotation.STYLE_BEVELED;
67+
break;
68+
case 1003:
69+
style = PdfAnnotation.STYLE_INSET;
70+
break;
71+
case Border.DASHED_FIXED:
72+
case Border.DASHED:
73+
case Border.DOTTED:
74+
// Default dash array will be used.
75+
style = PdfAnnotation.STYLE_DASHED;
76+
break;
77+
default:
78+
style = PdfAnnotation.STYLE_SOLID;
79+
break;
80+
}
81+
bs.put(PdfName.S, style);
82+
return bs;
83+
}
84+
85+
private BorderStyleUtil() {
86+
// Private constructor.
87+
}
88+
}

sign/src/main/java/com/itextpdf/signatures/PdfSignatureAppearance.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,8 @@ public PdfSignatureAppearance setPageRect(Rectangle pageRect) {
281281
* @return layer 0.
282282
*
283283
* @deprecated will be deleted in the next major release.
284-
* See {@link PdfSignatureFormField#setBackgroundLayer(PdfFormXObject)}.
284+
* See {@link PdfSignatureFormField#setBackgroundLayer(PdfFormXObject)}. Note that it should be called
285+
* for the field retrieved with {@link PdfSigner#getSignatureField()} method.
285286
*/
286287
@Deprecated
287288
public PdfFormXObject getLayer0() {
@@ -302,7 +303,8 @@ public PdfFormXObject getLayer0() {
302303
* @return layer 2.
303304
*
304305
* @deprecated will be deleted in the next major release.
305-
* See {@link PdfSignatureFormField#setSignatureAppearanceLayer(PdfFormXObject)}.
306+
* See {@link PdfSignatureFormField#setSignatureAppearanceLayer(PdfFormXObject)}. Note that it should be called
307+
* for the field retrieved with {@link PdfSigner#getSignatureField()} method.
306308
*/
307309
@Deprecated
308310
public PdfFormXObject getLayer2() {
@@ -544,7 +546,8 @@ public PdfSignatureAppearance setSignatureGraphic(ImageData signatureGraphic) {
544546
*
545547
* @return this instance to support fluent interface.
546548
*
547-
* @deprecated in favour of {@link PdfSignatureFormField#setReuseAppearance(boolean)}.
549+
* @deprecated in favour of {@link PdfSignatureFormField#setReuseAppearance(boolean)}. Note that it should be called
550+
* for the field retrieved with {@link PdfSigner#getSignatureField()} method.
548551
*/
549552
@Deprecated
550553
public PdfSignatureAppearance setReuseAppearance(boolean reuseAppearance) {

sign/src/main/java/com/itextpdf/signatures/PdfSigner.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@ This file is part of the iText (R) project.
2626
import com.itextpdf.commons.utils.MessageFormatUtil;
2727
import com.itextpdf.forms.PdfAcroForm;
2828
import com.itextpdf.forms.PdfSigFieldLock;
29+
import com.itextpdf.forms.fields.PdfFormAnnotation;
2930
import com.itextpdf.forms.fields.PdfFormCreator;
3031
import com.itextpdf.forms.fields.PdfFormField;
3132
import com.itextpdf.forms.fields.PdfSignatureFormField;
3233
import com.itextpdf.forms.fields.SignatureFormFieldBuilder;
3334
import com.itextpdf.forms.form.element.SignatureFieldAppearance;
35+
import com.itextpdf.forms.util.BorderStyleUtil;
3436
import com.itextpdf.io.source.ByteBuffer;
3537
import com.itextpdf.io.source.IRandomAccessSource;
3638
import com.itextpdf.io.source.RASInputStream;
@@ -39,6 +41,7 @@ This file is part of the iText (R) project.
3941
import com.itextpdf.commons.utils.FileUtil;
4042
import com.itextpdf.io.util.StreamUtil;
4143
import com.itextpdf.kernel.exceptions.PdfException;
44+
import com.itextpdf.kernel.font.PdfFont;
4245
import com.itextpdf.kernel.geom.Rectangle;
4346
import com.itextpdf.kernel.pdf.IsoKey;
4447
import com.itextpdf.kernel.pdf.PdfArray;
@@ -59,6 +62,11 @@ This file is part of the iText (R) project.
5962
import com.itextpdf.kernel.pdf.StampingProperties;
6063
import com.itextpdf.kernel.pdf.annot.PdfAnnotation;
6164
import com.itextpdf.kernel.pdf.annot.PdfWidgetAnnotation;
65+
import com.itextpdf.layout.properties.Background;
66+
import com.itextpdf.layout.properties.Property;
67+
import com.itextpdf.layout.properties.TextAlignment;
68+
import com.itextpdf.layout.properties.TransparentColor;
69+
import com.itextpdf.layout.properties.UnitValue;
6270
import com.itextpdf.pdfa.PdfAAgnosticPdfDocument;
6371
import com.itextpdf.signatures.cms.CMSContainer;
6472
import com.itextpdf.signatures.exceptions.SignExceptionMessageConstant;
@@ -1269,7 +1277,7 @@ protected PdfSigFieldLock createNewSignatureFormField(PdfAcroForm acroForm, Stri
12691277
sigField.setReuseAppearance(appearance.isReuseAppearance())
12701278
.setSignatureAppearanceLayer(appearance.getSignatureAppearanceLayer())
12711279
.setBackgroundLayer(appearance.getBackgroundLayer());
1272-
sigField.getFirstFormAnnotation().setFormFieldElement(appearance.getSignatureAppearance());
1280+
applyDefaultPropertiesForTheNewField(sigField);
12731281
sigField.enableFieldRegeneration();
12741282
acroForm.addField(sigField, document.getPage(pagen));
12751283

@@ -1525,7 +1533,6 @@ private boolean isDocumentPdf2() {
15251533

15261534
private PdfSignature createSignatureDictionary(boolean includeDate) {
15271535
PdfSignature dic = new PdfSignature();
1528-
PdfSignatureAppearance appearance = getSignatureAppearance();
15291536
dic.setReason(getReason());
15301537
dic.setLocation(getLocation());
15311538
dic.setSignatureCreator(getSignatureCreator());
@@ -1536,6 +1543,32 @@ private PdfSignature createSignatureDictionary(boolean includeDate) {
15361543
return dic;
15371544
}
15381545

1546+
private void applyDefaultPropertiesForTheNewField(PdfSignatureFormField sigField) {
1547+
SignatureFieldAppearance formFieldElement = appearance.getSignatureAppearance();
1548+
PdfFormAnnotation annotation = sigField.getFirstFormAnnotation();
1549+
annotation.setFormFieldElement(formFieldElement);
1550+
// Apply default field properties:
1551+
sigField.getWidgets().get(0).setHighlightMode(PdfAnnotation.HIGHLIGHT_NONE);
1552+
sigField.setJustification(formFieldElement.<TextAlignment>getProperty(Property.TEXT_ALIGNMENT));
1553+
final Object retrievedFont = formFieldElement.<Object>getProperty(Property.FONT);
1554+
if (retrievedFont instanceof PdfFont) {
1555+
sigField.setFont((PdfFont) retrievedFont);
1556+
}
1557+
UnitValue fontSize = formFieldElement.<UnitValue>getProperty(Property.FONT_SIZE);
1558+
if (fontSize != null && fontSize.isPointValue()) {
1559+
sigField.setFontSize(fontSize.getValue());
1560+
}
1561+
TransparentColor color = formFieldElement.<TransparentColor>getProperty(Property.FONT_COLOR);
1562+
if (color != null) {
1563+
sigField.setColor(color.getColor());
1564+
}
1565+
BorderStyleUtil.applyBorderProperty(formFieldElement, annotation);
1566+
Background background = formFieldElement.<Background>getProperty(Property.BACKGROUND);
1567+
if (background != null) {
1568+
sigField.getFirstFormAnnotation().setBackgroundColor(background.getColor());
1569+
}
1570+
}
1571+
15391572
/**
15401573
* An interface to retrieve the signature dictionary for modification.
15411574
*/

0 commit comments

Comments
 (0)