Skip to content

Commit 4de65ce

Browse files
committed
Set contents entry for signature field created in PdfSigner when alternative description is provided
DEVSIX-9057
1 parent bfdd38e commit 4de65ce

File tree

6 files changed

+55
-62
lines changed

6 files changed

+55
-62
lines changed

forms/src/main/java/com/itextpdf/forms/fields/PdfFormField.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,12 @@ This file is part of the iText (R) project.
5454
import com.itextpdf.kernel.pdf.action.PdfAction;
5555
import com.itextpdf.kernel.pdf.annot.PdfAnnotation;
5656
import com.itextpdf.kernel.pdf.annot.PdfWidgetAnnotation;
57+
import com.itextpdf.kernel.pdf.tagutils.AccessibilityProperties;
5758
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
5859
import com.itextpdf.layout.properties.TextAlignment;
60+
import com.itextpdf.layout.tagging.IAccessibleElement;
61+
import org.slf4j.Logger;
62+
import org.slf4j.LoggerFactory;
5963

6064
import java.io.ByteArrayOutputStream;
6165
import java.io.IOException;
@@ -69,8 +73,6 @@ This file is part of the iText (R) project.
6973
import java.util.List;
7074
import java.util.Map;
7175
import java.util.Set;
72-
import org.slf4j.Logger;
73-
import org.slf4j.LoggerFactory;
7476

7577
/**
7678
* This class represents a single field or field group in an {@link com.itextpdf.forms.PdfAcroForm
@@ -354,6 +356,30 @@ public static String getStringValue(PdfObject value) {
354356
}
355357
}
356358

359+
/**
360+
* Applies {@link AccessibilityProperties} for provided form field and its annotation children.
361+
*
362+
* @param formField {@link PdfFormField} the form field to which the accessibility properties should be applied
363+
* @param modelElement {@link IAccessibleElement} the form field layout element with accessibility properties
364+
* @param pdfDocument {@link PdfDocument} the document to which the form field belongs
365+
*/
366+
public static void applyAccessibilityProperties(PdfFormField formField, IAccessibleElement modelElement,
367+
PdfDocument pdfDocument) {
368+
if (!pdfDocument.isTagged()) {
369+
return;
370+
}
371+
final AccessibilityProperties properties = modelElement.getAccessibilityProperties();
372+
final String alternativeDescription = properties.getAlternateDescription();
373+
if (alternativeDescription != null && !alternativeDescription.isEmpty()) {
374+
formField.setAlternativeName(alternativeDescription);
375+
for (PdfFormAnnotation annotation : formField.getChildFormAnnotations()) {
376+
if (annotation.getAlternativeDescription() == null) {
377+
annotation.setAlternativeDescription(alternativeDescription);
378+
}
379+
}
380+
}
381+
}
382+
357383
/**
358384
* Returns the type of the parent form field, or of the wrapped
359385
* <PdfDictionary> object.

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

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ 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.fields.PdfFormField;
2726
import com.itextpdf.forms.form.FormProperty;
2827
import com.itextpdf.forms.form.element.IFormField;
@@ -46,13 +45,12 @@ This file is part of the iText (R) project.
4645
import com.itextpdf.layout.renderer.DrawContext;
4746
import com.itextpdf.layout.renderer.IRenderer;
4847
import com.itextpdf.layout.tagging.IAccessibleElement;
48+
import com.itextpdf.layout.tagging.LayoutTaggingHelper;
49+
import org.slf4j.LoggerFactory;
4950

5051
import java.util.Collections;
5152
import java.util.List;
5253

53-
import com.itextpdf.layout.tagging.LayoutTaggingHelper;
54-
import org.slf4j.LoggerFactory;
55-
5654
/**
5755
* Abstract {@link BlockRenderer} for form fields.
5856
*/
@@ -223,27 +221,13 @@ public void drawChildren(DrawContext drawContext) {
223221
/**
224222
* Applies the accessibility properties to the form field.
225223
*
226-
* @param formField The form field to which the accessibility properties should be applied.
227-
* @param pdfDocument The document to which the form field belongs.
224+
* @param formField the form field to which the accessibility properties should be applied
225+
* @param pdfDocument the document to which the form field belongs
228226
*/
229227
protected void applyAccessibilityProperties(PdfFormField formField, PdfDocument pdfDocument) {
230-
if (!pdfDocument.isTagged()) {
231-
return;
232-
}
233-
final AccessibilityProperties properties = ((IAccessibleElement) this.modelElement)
234-
.getAccessibilityProperties();
235-
final String alternativeDescription = properties.getAlternateDescription();
236-
if (alternativeDescription != null && !alternativeDescription.isEmpty()) {
237-
formField.setAlternativeName(alternativeDescription);
238-
for (PdfFormAnnotation annotation : formField.getChildFormAnnotations()) {
239-
if (annotation.getAlternativeDescription() == null) {
240-
annotation.setAlternativeDescription(alternativeDescription);
241-
}
242-
}
243-
}
228+
PdfFormField.applyAccessibilityProperties(formField, ((IAccessibleElement) this.modelElement), pdfDocument);
244229
}
245230

246-
247231
/**
248232
* Adjusts the field layout.
249233
*

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

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ This file is part of the iText (R) project.
2323
package com.itextpdf.forms.form.renderer;
2424

2525
import com.itextpdf.forms.fields.ChoiceFormFieldBuilder;
26-
import com.itextpdf.forms.fields.PdfFormAnnotation;
2726
import com.itextpdf.forms.fields.PdfFormField;
2827
import com.itextpdf.forms.form.FormProperty;
2928
import com.itextpdf.forms.form.element.AbstractSelectField;
@@ -33,7 +32,6 @@ This file is part of the iText (R) project.
3332
import com.itextpdf.kernel.pdf.PdfConformance;
3433
import com.itextpdf.kernel.pdf.PdfDocument;
3534
import com.itextpdf.kernel.pdf.tagging.StandardRoles;
36-
import com.itextpdf.kernel.pdf.tagutils.AccessibilityProperties;
3735
import com.itextpdf.kernel.pdf.tagutils.TagTreePointer;
3836
import com.itextpdf.layout.layout.LayoutArea;
3937
import com.itextpdf.layout.layout.LayoutContext;
@@ -194,24 +192,11 @@ protected void writeAcroFormFieldLangAttribute(PdfDocument pdfDoc) {
194192
/**
195193
* Applies the accessibility properties to the form field.
196194
*
197-
* @param formField The form field to which the accessibility properties should be applied.
198-
* @param pdfDocument The document to which the form field belongs.
195+
* @param formField the form field to which the accessibility properties should be applied
196+
* @param pdfDocument the document to which the form field belongs
199197
*/
200198
protected void applyAccessibilityProperties(PdfFormField formField, PdfDocument pdfDocument) {
201-
if (!pdfDocument.isTagged()) {
202-
return;
203-
}
204-
final AccessibilityProperties properties = ((IAccessibleElement) this.modelElement)
205-
.getAccessibilityProperties();
206-
final String alternativeDescription = properties.getAlternateDescription();
207-
if (alternativeDescription != null && !alternativeDescription.isEmpty()) {
208-
formField.setAlternativeName(alternativeDescription);
209-
for (PdfFormAnnotation annotation : formField.getChildFormAnnotations()) {
210-
if (annotation.getAlternativeDescription() == null) {
211-
annotation.setAlternativeDescription(alternativeDescription);
212-
}
213-
}
214-
}
199+
PdfFormField.applyAccessibilityProperties(formField, ((IAccessibleElement) this.modelElement), pdfDocument);
215200
}
216201

217202
/**

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ This file is part of the iText (R) project.
5555

5656
import java.util.List;
5757
import java.util.Map;
58+
5859
import org.slf4j.Logger;
5960
import org.slf4j.LoggerFactory;
6061

@@ -193,7 +194,7 @@ protected void adjustFieldLayout(LayoutContext layoutContext) {
193194
bBox.moveDown(bBox.getBottom() - getOccupiedArea().getBBox().getBottom() - additionalHeight / 2);
194195
}
195196
descriptionRect = bBox.setHeight(getOccupiedArea().getBBox().getHeight() * (1 - TOP_SECTION)
196-
- additionalHeight);
197+
- additionalHeight);
197198
break;
198199
default:
199200
return;
@@ -239,7 +240,7 @@ protected void applyAcroField(DrawContext drawContext) {
239240
PdfDocument doc = drawContext.getDocument();
240241
Rectangle area = getOccupiedArea().getBBox().clone();
241242
applyMargins(area, false);
242-
Map<Integer,Object> properties = FormFieldRendererUtil.removeProperties(this.modelElement);
243+
Map<Integer, Object> properties = FormFieldRendererUtil.removeProperties(this.modelElement);
243244
PdfPage page = doc.getPage(occupiedArea.getPageNumber());
244245

245246
Background background = this.<Background>getProperty(Property.BACKGROUND);
@@ -265,7 +266,7 @@ protected void applyAcroField(DrawContext drawContext) {
265266
sigField.setFontSize(fontSizeValue);
266267
sigField.getFirstFormAnnotation().setBackgroundColor(backgroundColor);
267268
applyDefaultFieldProperties(sigField);
268-
applyAccessibilityProperties(sigField,doc);
269+
applyAccessibilityProperties(sigField, doc);
269270
sigField.getFirstFormAnnotation().setFormFieldElement((SignatureFieldAppearance) modelElement);
270271
sigField.enableFieldRegeneration();
271272
PdfAcroForm forms = PdfFormCreator.getAcroForm(doc, true);

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,18 @@ protected int getWidgetPageNumber(PdfWidgetAnnotation widget) {
13701370
return pageNumber;
13711371
}
13721372

1373+
/**
1374+
* Applies {@link AccessibilityProperties} for provided signature field.
1375+
*
1376+
* @param formField {@link PdfFormField} the form field to which the accessibility properties should be applied
1377+
* @param modelElement {@link IAccessibleElement} the form field layout element with accessibility properties
1378+
* @param pdfDocument {@link PdfDocument} the document to which the form field belongs
1379+
*/
1380+
protected void applyAccessibilityProperties(PdfFormField formField, IAccessibleElement modelElement,
1381+
PdfDocument pdfDocument) {
1382+
PdfFormField.applyAccessibilityProperties(formField, modelElement, pdfDocument);
1383+
}
1384+
13731385
PdfSignature createSignatureDictionary(boolean includeDate) {
13741386
PdfSignature dic = new PdfSignature();
13751387
dic.setReason(this.signerProperties.getReason());
@@ -1474,18 +1486,6 @@ private boolean isDocumentPdf2() {
14741486
return document.getPdfVersion().compareTo(PdfVersion.PDF_2_0) >= 0;
14751487
}
14761488

1477-
protected void applyAccessibilityProperties(PdfFormField formField, IAccessibleElement modelElement,
1478-
PdfDocument pdfDocument) {
1479-
if (!pdfDocument.isTagged()) {
1480-
return;
1481-
}
1482-
final AccessibilityProperties properties = modelElement.getAccessibilityProperties();
1483-
final String alternativeDescription = properties.getAlternateDescription();
1484-
if (alternativeDescription != null && !alternativeDescription.isEmpty()) {
1485-
formField.setAlternativeName(alternativeDescription);
1486-
}
1487-
}
1488-
14891489
private void applyDefaultPropertiesForTheNewField(PdfSignatureFormField sigField) {
14901490
SignatureFieldAppearance formFieldElement = getSignatureAppearance();
14911491
PdfFormAnnotation annotation = sigField.getFirstFormAnnotation();

sign/src/test/java/com/itextpdf/signatures/PdfUASignerTest.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,7 @@ public void signatureAppearanceWithImageUA2() throws GeneralSecurityException, I
299299
.setPageRect(new Rectangle(36, 648, 200, 200))
300300
.setSignatureAppearance(appearance);
301301
});
302-
// TODO DEVSIX-9057 setAlternativeDescription doesn't set Contents entry for PdfSigner
303-
new VeraPdfValidator().validateFailure(outPdf); // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf\a validation on Android)
302+
new VeraPdfValidator().validate(outPdf); // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf\a validation on Android)
304303
}
305304

306305
@Test
@@ -327,9 +326,8 @@ public void signatureAppearanceImageInDivUA2() throws GeneralSecurityException,
327326
.setPageRect(new Rectangle(36, 648, 200, 200))
328327
.setSignatureAppearance(appearance);
329328
});
330-
// TODO DEVSIX-9057 setAlternativeDescription doesn't set Contents entry for PdfSigner
331329
// TODO DEVSIX-9060 Image that is in Div element is not rendered in signature
332-
new VeraPdfValidator().validateFailure(outPdf); // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf\a validation on Android)
330+
new VeraPdfValidator().validate(outPdf); // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf\a validation on Android)
333331
}
334332

335333
@Test
@@ -351,8 +349,7 @@ public void signatureAppearanceWithLineSeparatorUA2() throws GeneralSecurityExce
351349
.setPageRect(new Rectangle(36, 648, 200, 50))
352350
.setSignatureAppearance(appearance);
353351
});
354-
// TODO DEVSIX-9057 setAlternativeDescription doesn't set Contents entry for PdfSigner
355-
new VeraPdfValidator().validateFailure(outPdf); // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf\a validation on Android)
352+
new VeraPdfValidator().validate(outPdf); // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf\a validation on Android)
356353
}
357354

358355

0 commit comments

Comments
 (0)