Skip to content

Commit e0f6081

Browse files
committed
Don't embed default font in case of PDFA signing
DEVSIX-7850
1 parent bcea6d1 commit e0f6081

File tree

12 files changed

+247
-42
lines changed

12 files changed

+247
-42
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,6 +1100,9 @@ private boolean fontRequiredForRegeneration() {
11001100
if (parent instanceof PdfButtonFormField) {
11011101
return ((PdfButtonFormField) parent).isPushButton();
11021102
}
1103+
if (parent instanceof PdfSignatureFormField) {
1104+
return false;
1105+
}
11031106
return true;
11041107
}
11051108

forms/src/test/java/com/itextpdf/forms/form/element/SignatureFieldAppearanceTest.java

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ This file is part of the iText (R) project.
3434
import com.itextpdf.io.image.ImageDataFactory;
3535
import com.itextpdf.io.logs.IoLogMessageConstant;
3636
import com.itextpdf.kernel.colors.ColorConstants;
37+
import com.itextpdf.kernel.font.PdfFont;
3738
import com.itextpdf.kernel.geom.Rectangle;
3839
import com.itextpdf.kernel.pdf.PdfDictionary;
3940
import com.itextpdf.kernel.pdf.PdfDocument;
@@ -50,6 +51,7 @@ This file is part of the iText (R) project.
5051
import com.itextpdf.layout.element.List;
5152
import com.itextpdf.layout.element.ListItem;
5253
import com.itextpdf.layout.element.Paragraph;
54+
import com.itextpdf.layout.exceptions.LayoutExceptionMessageConstant;
5355
import com.itextpdf.layout.properties.AlignmentPropertyValue;
5456
import com.itextpdf.layout.properties.BoxSizingPropertyValue;
5557
import com.itextpdf.layout.properties.FlexDirectionPropertyValue;
@@ -64,13 +66,14 @@ This file is part of the iText (R) project.
6466
import com.itextpdf.test.annotations.LogMessage;
6567
import com.itextpdf.test.annotations.LogMessages;
6668
import com.itextpdf.test.annotations.type.IntegrationTest;
69+
70+
import java.io.FileNotFoundException;
71+
import java.io.IOException;
6772
import org.junit.Assert;
6873
import org.junit.BeforeClass;
6974
import org.junit.Test;
7075
import org.junit.experimental.categories.Category;
7176

72-
import java.io.IOException;
73-
7477
@Category(IntegrationTest.class)
7578
public class SignatureFieldAppearanceTest extends ExtendedITextTest {
7679
public static final String SOURCE_FOLDER =
@@ -390,6 +393,43 @@ public void borderTypesTest() throws IOException, InterruptedException {
390393
Assert.assertNull(new CompareTool().compareByContent(outPdf, cmpPdf, DESTINATION_FOLDER));
391394
}
392395

396+
@Test
397+
public void fontSizeTest() throws IOException, InterruptedException {
398+
String outPdf = DESTINATION_FOLDER + "fontSizeTest.pdf";
399+
String cmpPdf = SOURCE_FOLDER + "cmp_fontSizeTest.pdf";
400+
try (Document document = new Document(new PdfDocument(new PdfWriter(outPdf)))) {
401+
SignatureFieldAppearance sigField = new SignatureFieldAppearance("SigField");
402+
//TODO DEVSIX-7970 Fontsize doesn't get recalculate correctly in SignatureFieldAppearance making the signature look absent
403+
sigField.setFontSize(20);
404+
sigField.setContent("test");
405+
document.add(sigField);
406+
}
407+
Assert.assertNull(new CompareTool().compareByContent(outPdf, cmpPdf, DESTINATION_FOLDER));
408+
}
409+
410+
@Test
411+
public void fontNullCustomCheck() throws FileNotFoundException {
412+
String outPdf = DESTINATION_FOLDER + "fontNullCustomCheck.pdf";
413+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outPdf)) {
414+
@Override
415+
public PdfFont getDefaultFont() {
416+
return null;
417+
}
418+
};
419+
Document document = new Document(pdfDoc);
420+
421+
SignatureFieldAppearance sigField = new SignatureFieldAppearance("SigField");
422+
sigField.setContent("test");
423+
sigField.setInteractive(true);
424+
sigField.setBorder(new SolidBorder(ColorConstants.GREEN, 1));
425+
426+
Exception e = Assert.assertThrows(IllegalStateException.class, () -> {
427+
document.add(sigField);
428+
});
429+
Assert.assertEquals(LayoutExceptionMessageConstant.INVALID_FONT_PROPERTY_VALUE, e.getMessage());
430+
431+
}
432+
393433
@Test
394434
public void signatureOnRotatedPagesTest() throws IOException, InterruptedException {
395435
String outPdf = DESTINATION_FOLDER + "signatureOnRotatedPages.pdf";

layout/src/main/java/com/itextpdf/layout/exceptions/LayoutExceptionMessageConstant.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public final class LayoutExceptionMessageConstant {
5353

5454
public static final String INVALID_COLUMN_PROPERTIES =
5555
"Invalid column-count/column-width/column-gap properties, they're absent or have negative value";
56+
public static final String INVALID_FONT_PROPERTY_VALUE = "Invalid FONT property value type.";
5657

5758
private LayoutExceptionMessageConstant(){}
5859
}

layout/src/main/java/com/itextpdf/layout/renderer/TextRenderer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1542,7 +1542,7 @@ protected boolean resolveFonts(List<IRenderer> addTo) {
15421542
}
15431543
return true;
15441544
} else {
1545-
throw new IllegalStateException("Invalid FONT property value type.");
1545+
throw new IllegalStateException(LayoutExceptionMessageConstant.INVALID_FONT_PROPERTY_VALUE);
15461546
}
15471547
}
15481548

pdfa/src/main/java/com/itextpdf/pdfa/PdfAAgnosticPdfDocument.java

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,10 @@ This file is part of the iText (R) project.
2222
*/
2323
package com.itextpdf.pdfa;
2424

25-
import com.itextpdf.io.logs.IoLogMessageConstant;
26-
import com.itextpdf.kernel.font.PdfFont;
27-
import com.itextpdf.kernel.font.PdfFontFactory;
28-
import com.itextpdf.kernel.pdf.PdfDocument;
2925
import com.itextpdf.kernel.pdf.PdfReader;
3026
import com.itextpdf.kernel.pdf.PdfWriter;
3127
import com.itextpdf.kernel.pdf.StampingProperties;
3228

33-
import java.io.IOException;
34-
import org.slf4j.Logger;
35-
import org.slf4j.LoggerFactory;
36-
3729
/**
3830
* This class extends {@link PdfADocument} and serves as {@link PdfADocument} for
3931
* PDF/A compliant documents and as {@link com.itextpdf.kernel.pdf.PdfDocument}
@@ -45,7 +37,6 @@ This file is part of the iText (R) project.
4537
*/
4638
public class PdfAAgnosticPdfDocument extends PdfADocument {
4739

48-
private PdfFont defaultFont;
4940

5041
/**
5142
* Opens a PDF/A document in stamping mode.
@@ -67,28 +58,4 @@ public PdfAAgnosticPdfDocument (PdfReader reader, PdfWriter writer) {
6758
public PdfAAgnosticPdfDocument (PdfReader reader, PdfWriter writer, StampingProperties properties) {
6859
super(reader, writer, properties, true);
6960
}
70-
71-
/**
72-
* Get default font for the document: Helvetica, WinAnsi.
73-
* One instance per document.
74-
*
75-
* @return instance of {@link PdfFont} or {@code null} on error.
76-
*/
77-
@Override
78-
public PdfFont getDefaultFont() {
79-
// TODO DEVSIX-7850 investigate embedding default font into PDF/A documents while signing
80-
if (defaultFont == null) {
81-
try {
82-
defaultFont = PdfFontFactory.createFont();
83-
if (writer != null) {
84-
defaultFont.makeIndirect(this);
85-
}
86-
} catch (IOException e) {
87-
Logger logger = LoggerFactory.getLogger(PdfDocument.class);
88-
logger.error(IoLogMessageConstant.EXCEPTION_WHILE_CREATING_DEFAULT_FONT, e);
89-
defaultFont = null;
90-
}
91-
}
92-
return defaultFont;
93-
}
9461
}

pdfa/src/main/java/com/itextpdf/pdfa/PdfADocument.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,10 @@ public PdfADocument(PdfWriter writer, PdfAConformanceLevel conformanceLevel, Pdf
120120
*/
121121
@Override
122122
public PdfFont getDefaultFont() {
123-
return null;
123+
if (isPdfADocument) {
124+
return null;
125+
}
126+
return super.getDefaultFont();
124127
}
125128

126129
/**

pdfa/src/test/java/com/itextpdf/pdfa/PdfAFormFieldTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,21 @@ This file is part of the iText (R) project.
3232
import com.itextpdf.forms.fields.PdfFormAnnotation;
3333
import com.itextpdf.forms.fields.PdfFormCreator;
3434
import com.itextpdf.forms.fields.PdfFormField;
35+
import com.itextpdf.forms.fields.PdfSignatureFormField;
3536
import com.itextpdf.forms.fields.PushButtonFormFieldBuilder;
3637
import com.itextpdf.forms.fields.RadioFormFieldBuilder;
3738
import com.itextpdf.forms.fields.SignatureFormFieldBuilder;
3839
import com.itextpdf.forms.fields.TextFormFieldBuilder;
3940
import com.itextpdf.forms.fields.properties.CheckBoxType;
41+
import com.itextpdf.forms.fields.properties.SignedAppearanceText;
4042
import com.itextpdf.forms.form.element.Button;
4143
import com.itextpdf.forms.form.element.CheckBox;
4244
import com.itextpdf.forms.form.element.ComboBoxField;
4345
import com.itextpdf.forms.form.element.IFormField;
4446
import com.itextpdf.forms.form.element.InputField;
4547
import com.itextpdf.forms.form.element.Radio;
4648
import com.itextpdf.forms.form.element.SelectFieldItem;
49+
import com.itextpdf.forms.form.element.SignatureFieldAppearance;
4750
import com.itextpdf.forms.form.element.TextArea;
4851
import com.itextpdf.io.font.PdfEncodings;
4952
import com.itextpdf.io.logs.IoLogMessageConstant;
@@ -667,6 +670,41 @@ public void testCopyPagesDoesntEmbedHelveticaFont() throws IOException, Interrup
667670

668671
}
669672

673+
@Test
674+
public void pdfASignatureFieldTestWithAndFontText() throws IOException, InterruptedException {
675+
String name = "pdfASignatureFieldTestWithText";
676+
String fileName = DESTINATION_FOLDER + name + ".pdf";
677+
String cmp = SOURCE_FOLDER + "cmp/PdfAFormFieldTest/cmp_pdfASignatureFieldTestWithText.pdf";
678+
679+
PdfFont fontFreeSans = PdfFontFactory.createFont(SOURCE_FOLDER + "FreeSans.ttf",
680+
"WinAnsi", EmbeddingStrategy.FORCE_EMBEDDED);
681+
682+
makePdfDocument(fileName, cmp, (pdfDoc) -> {
683+
SignatureFieldAppearance signatureFieldAppearance = new SignatureFieldAppearance("Signature1");
684+
signatureFieldAppearance.setContent(new SignedAppearanceText().setLocationLine("HEEELLLLLO"));
685+
signatureFieldAppearance.setInteractive(true);
686+
signatureFieldAppearance.setFont(fontFreeSans);
687+
pdfDoc.add(signatureFieldAppearance);
688+
PdfAcroForm form = PdfFormCreator.getAcroForm(pdfDoc.getPdfDocument(), true);
689+
SignatureFormFieldBuilder signatureFormFieldBuilder = new SignatureFormFieldBuilder(pdfDoc.getPdfDocument(),
690+
"Signature2");
691+
692+
SignatureFieldAppearance signatureFieldAppearance2 = new SignatureFieldAppearance("Signature2");
693+
signatureFieldAppearance2.setContent(new SignedAppearanceText().setLocationLine("Byeeee"));
694+
signatureFieldAppearance2.setInteractive(true);
695+
696+
PdfSignatureFormField signatureFormField = signatureFormFieldBuilder.setWidgetRectangle(
697+
new Rectangle(200, 200, 40, 40))
698+
.setFont(fontFreeSans)
699+
.setConformanceLevel(PdfAConformanceLevel.PDF_A_4)
700+
.createSignature();
701+
signatureFormField.getFirstFormAnnotation().setFormFieldElement(signatureFieldAppearance2);
702+
form.addField(signatureFormField);
703+
704+
});
705+
706+
}
707+
670708
private void makePdfDocument(String outPdf, String cmp, Consumer<Document> consumer)
671709
throws IOException, InterruptedException {
672710
PdfWriter writer = new PdfWriter(outPdf,

0 commit comments

Comments
 (0)