Skip to content

Commit e953694

Browse files
committed
Use model for generating signature appearances. Compare signature appearances visually in SigningTest
1 parent f2d7a4e commit e953694

File tree

5 files changed

+55
-36
lines changed

5 files changed

+55
-36
lines changed

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

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,24 @@
22

33
import com.itextpdf.basics.geom.Rectangle;
44
import com.itextpdf.basics.image.Image;
5-
import com.itextpdf.core.font.PdfFontFactory;
6-
import com.itextpdf.core.pdf.canvas.PdfCanvas;
75
import com.itextpdf.core.font.PdfFont;
6+
import com.itextpdf.core.font.PdfFontFactory;
87
import com.itextpdf.core.pdf.PdfDocument;
98
import com.itextpdf.core.pdf.PdfName;
109
import com.itextpdf.core.pdf.PdfStream;
10+
import com.itextpdf.core.pdf.canvas.PdfCanvas;
1111
import com.itextpdf.core.pdf.xobject.PdfFormXObject;
1212
import com.itextpdf.forms.PdfAcroForm;
1313
import com.itextpdf.forms.fields.PdfFormField;
14+
import com.itextpdf.model.Canvas;
15+
import com.itextpdf.model.Property;
16+
import com.itextpdf.model.element.Paragraph;
1417

1518
import java.io.IOException;
1619
import java.security.cert.Certificate;
1720
import java.security.cert.X509Certificate;
1821
import java.text.SimpleDateFormat;
1922
import java.util.Calendar;
20-
import java.util.List;
2123

2224
/**
2325
* Provides convenient methods to make a signature appearance. Use it in conjunction with {@link PdfSigner}.
@@ -630,19 +632,11 @@ protected PdfFormXObject getAppearance() throws IOException {
630632
signedBy = "";
631633
}
632634

633-
List<String> splittedText = font.splitString(signedBy, (int) layer2FontSize, signatureRect.getWidth());
634635
PdfCanvas canvas = new PdfCanvas(n2, document);
636+
Paragraph paragraph = setParagraphProperties(new Paragraph(signedBy).
637+
setFont(font).setFontSize(layer2FontSize).setMargin(0).setMultipliedLeading(0.9f), signedBy);
638+
new Canvas(canvas, document, signatureRect).add(paragraph);
635639

636-
canvas.setFontAndSize(font, layer2FontSize);
637-
canvas.beginText();
638-
canvas.setTextMatrix(signatureRect.getLeft(), signatureRect.getTop() - layer2FontSize);
639-
640-
for (String str : splittedText) {
641-
canvas.newlineText();
642-
canvas.showText(str);
643-
}
644-
645-
canvas.endText();
646640
break;
647641
case GRAPHIC_AND_DESCRIPTION: {
648642
if (signatureGraphic == null) {
@@ -702,22 +696,10 @@ protected PdfFormXObject getAppearance() throws IOException {
702696
}
703697

704698
if (renderingMode != RenderingMode.GRAPHIC) {
705-
List<String> splittedText = font.splitString(text, (int) layer2FontSize, dataRect.getWidth());
706699
PdfCanvas canvas = new PdfCanvas(n2, document);
707-
708-
float x = dataRect.getLeft();
709-
float y = dataRect.getTop();
710-
711-
canvas.setFontAndSize(font, layer2FontSize);
712-
canvas.beginText();
713-
canvas.setTextMatrix(x, y);
714-
715-
for (String str : splittedText) {
716-
canvas.moveText(0, -layer2FontSize);
717-
canvas.showText(str);
718-
}
719-
720-
canvas.endText();
700+
Paragraph paragraph = setParagraphProperties(new Paragraph(text).
701+
setFont(font).setFontSize(layer2FontSize).setMargin(0).setMultipliedLeading(0.9f), text);
702+
new Canvas(canvas, document, dataRect).add(paragraph);
721703
}
722704
}
723705

@@ -818,6 +800,18 @@ private void createBlankN0() {
818800
canvas.writeLiteral("% DSBlank\n");
819801
}
820802

803+
private Paragraph setParagraphProperties(Paragraph paragraph, String value) {
804+
// TODO this is temporary and will be replaced by script autodetection logic on model level
805+
if (value != null && value.length() > 0) {
806+
Character.UnicodeScript script = Character.UnicodeScript.of(value.charAt(0));
807+
paragraph.setFontScript(script);
808+
if (script == Character.UnicodeScript.ARABIC || script == Character.UnicodeScript.HEBREW) {
809+
paragraph.setBaseDirection(Property.BaseDirection.RIGHT_TO_LEFT);
810+
}
811+
}
812+
return paragraph;
813+
}
814+
821815
/**
822816
* Signature rendering modes.
823817
*/

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

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import com.itextpdf.basics.geom.Rectangle;
55
import com.itextpdf.core.pdf.PdfReader;
66
import com.itextpdf.core.pdf.PdfWriter;
7+
import com.itextpdf.core.utils.CompareTool;
8+
import com.itextpdf.test.annotations.type.IntegrationTest;
9+
710
import java.io.File;
811
import java.io.FileInputStream;
912
import java.io.IOException;
@@ -16,14 +19,18 @@
1619
import java.security.UnrecoverableKeyException;
1720
import java.security.cert.Certificate;
1821
import java.security.cert.CertificateException;
22+
import java.util.Arrays;
23+
import java.util.HashMap;
24+
import java.util.List;
1925

20-
import com.itextpdf.test.annotations.type.IntegrationTest;
2126
import org.bouncycastle.jce.provider.BouncyCastleProvider;
27+
import org.junit.Assert;
2228
import org.junit.Before;
2329
import org.junit.Test;
2430
import org.junit.experimental.categories.Category;
2531

2632

33+
2734
//TODO: add some validation of results in future
2835
@Category(IntegrationTest.class)
2936
public class SigningTest {
@@ -51,9 +58,10 @@ public void init() throws KeyStoreException, IOException, CertificateException,
5158
}
5259

5360
@Test
54-
public void simpleSigningTest() throws GeneralSecurityException, IOException {
61+
public void simpleSigningTest() throws GeneralSecurityException, IOException, InterruptedException {
5562
String src = sourceFolder + "simpleDocument.pdf";
56-
String dest = destinationFolder + "simpleSignature.pdf";
63+
String fileName = "simpleSignature.pdf";
64+
String dest = destinationFolder + fileName;
5765

5866
int x = 36;
5967
int y = 648;
@@ -65,28 +73,45 @@ public void simpleSigningTest() throws GeneralSecurityException, IOException {
6573
sign(src, fieldName, dest, chain, pk,
6674
DigestAlgorithms.SHA256, provider.getName(),
6775
PdfSigner.CryptoStandard.CADES, "Test 1", "TestCity", rect, false);
76+
77+
Assert.assertNull(new CompareTool().compareVisually(dest, sourceFolder + "cmp_" + fileName, destinationFolder, "diff_",
78+
new HashMap<Integer, List<Rectangle>>() {{
79+
put(1, Arrays.asList(new Rectangle(67, 690, 148, 15)));
80+
}}));
6881
}
6982

7083
@Test
71-
public void signingIntoExistingFieldTest01() throws GeneralSecurityException, IOException {
84+
public void signingIntoExistingFieldTest01() throws GeneralSecurityException, IOException, InterruptedException {
7285
String src = sourceFolder + "emptySignature01.pdf"; //field is merged with widget and has /P key
73-
String dest = destinationFolder + "filledSignatureFields01.pdf";
86+
String fileName = "filledSignatureFields01.pdf";
87+
String dest = destinationFolder + fileName;
7488

7589
String fieldName = "Signature1";
7690
sign(src, fieldName, dest, chain, pk,
7791
DigestAlgorithms.SHA256, provider.getName(),
7892
PdfSigner.CryptoStandard.CADES, "Test 1", "TestCity", null, false);
93+
94+
Assert.assertNull(new CompareTool().compareVisually(dest, sourceFolder + "cmp_" + fileName, destinationFolder, "diff_",
95+
new HashMap<Integer, List<Rectangle>>() {{
96+
put(1, Arrays.asList(new Rectangle(67, 725, 148, 15)));
97+
}}));
7998
}
8099

81100
@Test
82-
public void signingIntoExistingFieldTest02() throws GeneralSecurityException, IOException {
101+
public void signingIntoExistingFieldTest02() throws GeneralSecurityException, IOException, InterruptedException {
83102
String src = sourceFolder + "emptySignature02.pdf"; //field is merged with widget and widget doesn't have /P key
84-
String dest = destinationFolder + "filledSignatureFields02.pdf";
103+
String fileName = "filledSignatureFields02.pdf";
104+
String dest = destinationFolder + fileName;
85105

86106
String fieldName = "Signature1";
87107
sign(src, fieldName, dest, chain, pk,
88108
DigestAlgorithms.SHA256, provider.getName(),
89109
PdfSigner.CryptoStandard.CADES, "Test 1", "TestCity", null, false);
110+
111+
Assert.assertNull(new CompareTool().compareVisually(dest, sourceFolder + "cmp_" + fileName, destinationFolder, "diff_",
112+
new HashMap<Integer, List<Rectangle>>() {{
113+
put(1, Arrays.asList(new Rectangle(67, 725, 148, 15)));
114+
}}));
90115
}
91116

92117
@Test
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)