Skip to content

Commit be64ecd

Browse files
vitali-priText-CI
authored andcommitted
Get rid of own merge fields logic in PdfPageFormCopier logic and use the one from form fields
DEVSIX-7389 Autoported commit. Original commit hash: [37b2549fa]
1 parent 2c41bf9 commit be64ecd

31 files changed

+180
-232
lines changed

itext.tests/itext.forms.tests/itext/forms/FormFieldFlatteningTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ private static void FillTextFieldsThenFlattenThenCompare(String testName) {
203203
}
204204

205205
[NUnit.Framework.Test]
206-
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 5)]
206+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 4)]
207207
public virtual void FlattenReadOnly() {
208208
//Logging is expected since there are duplicate field names
209209
PdfWriter writer = new PdfWriter(new MemoryStream());

itext.tests/itext.forms.tests/itext/forms/FormFieldsTaggingTest.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,33 @@ public virtual void FormFieldTaggingTest07() {
151151
CompareOutput(outFileName, cmpFileName);
152152
}
153153

154+
[NUnit.Framework.Test]
155+
public virtual void MergeFieldTaggingTest08() {
156+
String outFileName = destinationFolder + "mergeFieldTaggingTest08.pdf";
157+
String cmpFileName = sourceFolder + "cmp_mergeFieldTaggingTest08.pdf";
158+
String srcFileName = sourceFolder + "mergeFieldTaggingTest08.pdf";
159+
using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(srcFileName), new PdfWriter(outFileName))) {
160+
pdfDoc.SetTagged();
161+
PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDoc, true);
162+
AddFormFieldsToDocument(pdfDoc, form);
163+
}
164+
CompareOutput(outFileName, cmpFileName);
165+
}
166+
167+
[NUnit.Framework.Test]
168+
public virtual void MergeFieldTaggingTest09() {
169+
String outFileName = destinationFolder + "mergeFieldTaggingTest09.pdf";
170+
String cmpFileName = sourceFolder + "cmp_mergeFieldTaggingTest09.pdf";
171+
using (PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName))) {
172+
pdfDoc.SetTagged();
173+
PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDoc, true);
174+
AddFormFieldsToDocument(pdfDoc, form);
175+
AddFormFieldsToDocument(pdfDoc, form);
176+
}
177+
CompareOutput(outFileName, cmpFileName);
178+
CompareOutput(outFileName, sourceFolder + "cmp_mergeFieldTaggingTest08.pdf");
179+
}
180+
154181
private void AddFormFieldsToDocument(PdfDocument pdfDoc, PdfAcroForm acroForm) {
155182
Rectangle rect = new Rectangle(36, 700, 20, 20);
156183
Rectangle rect1 = new Rectangle(36, 680, 20, 20);

itext.tests/itext.forms.tests/itext/forms/PdfAcroFormTest.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ public virtual void FieldKidsWithTheSameNamesTest() {
262262
}
263263

264264
[NUnit.Framework.Test]
265+
[LogMessage(FormsLogMessageConstants.FORM_FIELD_MUST_HAVE_A_NAME)]
265266
public virtual void NamelessFieldTest() {
266267
using (PdfDocument outputDoc = CreateDocument()) {
267268
outputDoc.AddNewPage();
@@ -275,6 +276,7 @@ public virtual void NamelessFieldTest() {
275276
PdfPage page = outputDoc.GetLastPage();
276277
e = NUnit.Framework.Assert.Catch(typeof(PdfException), () => acroForm.AddField(field, page));
277278
NUnit.Framework.Assert.AreEqual(FormsExceptionMessageConstant.FORM_FIELD_MUST_HAVE_A_NAME, e.Message);
279+
acroForm.AddField(field, page, false);
278280
NUnit.Framework.Assert.AreEqual(0, acroForm.GetDirectFormFields().Count);
279281
}
280282
}

itext.tests/itext.forms.tests/itext/forms/PdfFormCopyTest.cs

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static void BeforeClass() {
4242
}
4343

4444
[NUnit.Framework.Test]
45-
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 32)]
45+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 14)]
4646
public virtual void CopyFieldsTest01() {
4747
String srcFilename1 = sourceFolder + "appearances1.pdf";
4848
String srcFilename2 = sourceFolder + "fieldsOn2-sPage.pdf";
@@ -132,7 +132,7 @@ public virtual void CopyFieldsTest05() {
132132
}
133133

134134
[NUnit.Framework.Test]
135-
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 12)]
135+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 9)]
136136
public virtual void CopyMultipleSubfieldsTest01() {
137137
String srcFilename = sourceFolder + "copyMultipleSubfieldsTest01.pdf";
138138
String destFilename = destinationFolder + "copyMultipleSubfieldsTest01.pdf";
@@ -195,7 +195,7 @@ public virtual void CopyMultipleSubfieldsTest03() {
195195
}
196196

197197
[NUnit.Framework.Test]
198-
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 12)]
198+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 9)]
199199
public virtual void CopyMultipleSubfieldsSmartModeTest01() {
200200
String srcFilename = sourceFolder + "copyMultipleSubfieldsSmartModeTest01.pdf";
201201
String destFilename = destinationFolder + "copyMultipleSubfieldsSmartModeTest01.pdf";
@@ -218,7 +218,7 @@ public virtual void CopyMultipleSubfieldsSmartModeTest01() {
218218
}
219219

220220
[NUnit.Framework.Test]
221-
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 13)]
221+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 14)]
222222
public virtual void CopyFieldsTest06() {
223223
String srcFilename = sourceFolder + "datasheet.pdf";
224224
String destFilename = destinationFolder + "copyFields06.pdf";
@@ -236,7 +236,7 @@ public virtual void CopyFieldsTest06() {
236236
}
237237

238238
[NUnit.Framework.Test]
239-
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 13)]
239+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 14)]
240240
public virtual void CopyFieldsTest07() {
241241
String srcFilename = sourceFolder + "datasheet.pdf";
242242
String destFilename = destinationFolder + "copyFields07.pdf";
@@ -254,7 +254,7 @@ public virtual void CopyFieldsTest07() {
254254
}
255255

256256
[NUnit.Framework.Test]
257-
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 32)]
257+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 14)]
258258
public virtual void CopyFieldsTest08() {
259259
String srcFilename1 = sourceFolder + "appearances1.pdf";
260260
String srcFilename2 = sourceFolder + "fieldsOn2-sPage.pdf";
@@ -349,7 +349,6 @@ public virtual void CopyFieldsTest12() {
349349
}
350350

351351
[NUnit.Framework.Test]
352-
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD)]
353352
public virtual void CopyFieldsTest13() {
354353
String srcFilename = sourceFolder + "copyFields13.pdf";
355354
String destFilename = destinationFolder + "copyFields13.pdf";
@@ -393,7 +392,7 @@ public virtual void UnnamedFieldsHierarchyTest() {
393392
}
394393

395394
[NUnit.Framework.Test]
396-
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 51)]
395+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 45)]
397396
public virtual void CopyAndEditTextFields() {
398397
String srcFileName = sourceFolder + "checkPdfFormCopy_Source.pdf";
399398
String destFilename = destinationFolder + "copyAndEditTextFields.pdf";
@@ -417,7 +416,7 @@ public virtual void CopyAndEditTextFields() {
417416
}
418417

419418
[NUnit.Framework.Test]
420-
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 51)]
419+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 45)]
421420
public virtual void CopyAndEditCheckboxes() {
422421
String srcFileName = sourceFolder + "checkPdfFormCopy_Source.pdf";
423422
String destFilename = destinationFolder + "copyAndEditCheckboxes.pdf";
@@ -439,7 +438,7 @@ public virtual void CopyAndEditCheckboxes() {
439438
}
440439

441440
[NUnit.Framework.Test]
442-
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 51)]
441+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 45)]
443442
public virtual void CopyAndEditRadioButtons() {
444443
String srcFileName = sourceFolder + "checkPdfFormCopy_Source.pdf";
445444
String destFilename = destinationFolder + "copyAndEditRadioButtons.pdf";
@@ -481,7 +480,7 @@ public virtual void MergeMergedFieldAndMergedFieldTest() {
481480
}
482481

483482
[NUnit.Framework.Test]
484-
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 2)]
483+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 1)]
485484
public virtual void MergeMergedFieldAndTwoWidgetsTest() {
486485
String srcFileName1 = sourceFolder + "fieldMergedWithWidget.pdf";
487486
String srcFileName2 = sourceFolder + "fieldTwoWidgets.pdf";
@@ -535,6 +534,7 @@ public virtual void MergeTwoWidgetsAndMergedFieldTest() {
535534
}
536535

537536
[NUnit.Framework.Test]
537+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD)]
538538
public virtual void MergeTwoWidgetsAndTwoWidgetsTest() {
539539
String srcFileName2 = sourceFolder + "fieldTwoWidgets.pdf";
540540
String destFilename = destinationFolder + "mergeTwoWidgetsAndTwoWidgetsTest.pdf";
@@ -555,6 +555,23 @@ public virtual void MergeTwoWidgetsAndTwoWidgetsTest() {
555555
, "diff_"));
556556
}
557557

558+
[NUnit.Framework.Test]
559+
[LogMessage(iText.IO.Logs.IoLogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, Count = 2)]
560+
public virtual void ComplexFieldsHierarchyTest() {
561+
String srcFileName = sourceFolder + "complexFieldsHierarchyTest.pdf";
562+
String destFilename = destinationFolder + "complexFieldsHierarchyTest.pdf";
563+
String cmpFileName = sourceFolder + "cmp_complexFieldsHierarchyTest.pdf";
564+
using (PdfDocument pdfDocMerged = new PdfDocument(new PdfReader(srcFileName), new PdfWriter(destFilename))
565+
) {
566+
using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(srcFileName))) {
567+
pdfDoc.CopyPagesTo(1, pdfDoc.GetNumberOfPages(), pdfDocMerged, new PdfPageFormCopier());
568+
pdfDoc.CopyPagesTo(1, pdfDoc.GetNumberOfPages(), pdfDocMerged, new PdfPageFormCopier());
569+
}
570+
}
571+
NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(destFilename, cmpFileName, destinationFolder
572+
, "diff_"));
573+
}
574+
558575
[NUnit.Framework.Test]
559576
public virtual void WidgetContainsNoTEntryTest() {
560577
String sourceFileName = sourceFolder + "fieldThreeWidgets.pdf";

itext/itext.forms/itext/forms/PdfAcroForm.cs

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -225,22 +225,38 @@ public virtual void AddField(PdfFormField field) {
225225
/// <see cref="iText.Kernel.Pdf.PdfPage"/>
226226
/// on which to add the field
227227
/// </param>
228-
/// <param name="replaceExisted">
229-
/// if true then the existed form field will be replaced by a new one
230-
/// in case they have the same names
228+
public virtual void AddField(PdfFormField field, PdfPage page) {
229+
AddField(field, page, true);
230+
}
231+
232+
/// <summary>This method adds the field to a specific page.</summary>
233+
/// <param name="field">
234+
/// the
235+
/// <see cref="iText.Forms.Fields.PdfFormField"/>
236+
/// to be added to the form
231237
/// </param>
232-
public virtual void AddField(PdfFormField field, PdfPage page, bool replaceExisted) {
238+
/// <param name="page">
239+
/// the
240+
/// <see cref="iText.Kernel.Pdf.PdfPage"/>
241+
/// on which to add the field
242+
/// </param>
243+
/// <param name="throwExceptionOnError">true if the exception is expected to be thrown in case of error.</param>
244+
public virtual void AddField(PdfFormField field, PdfPage page, bool throwExceptionOnError) {
233245
if (!field.GetPdfObject().ContainsKey(PdfName.T)) {
234-
throw new PdfException(FormsExceptionMessageConstant.FORM_FIELD_MUST_HAVE_A_NAME);
235-
}
236-
if (!replaceExisted) {
237-
PdfFormFieldMergeUtil.MergeKidsWithSameNames(field, true);
246+
if (throwExceptionOnError) {
247+
throw new PdfException(FormsExceptionMessageConstant.FORM_FIELD_MUST_HAVE_A_NAME);
248+
}
249+
else {
250+
LOGGER.LogWarning(FormsLogMessageConstants.FORM_FIELD_MUST_HAVE_A_NAME);
251+
return;
252+
}
238253
}
254+
PdfFormFieldMergeUtil.MergeKidsWithSameNames(field, throwExceptionOnError);
239255
PdfDictionary fieldDict = field.GetPdfObject();
240256
// PdfPageFormCopier expects that we replace existed field by a new one in case they have the same names.
241257
String fieldName = field.GetFieldName().ToUnicodeString();
242-
if (replaceExisted || !fields.ContainsKey(fieldName) || !PdfFormFieldMergeUtil.MergeTwoFieldsWithTheSameNames
243-
(fields.Get(fieldName), field, true)) {
258+
if (!fields.ContainsKey(fieldName) || !PdfFormFieldMergeUtil.MergeTwoFieldsWithTheSameNames(fields.Get(fieldName
259+
), field, throwExceptionOnError)) {
244260
PdfArray fieldsArray = GetFields();
245261
fieldsArray.Add(fieldDict);
246262
fieldsArray.SetModified();
@@ -253,21 +269,6 @@ public virtual void AddField(PdfFormField field, PdfPage page, bool replaceExist
253269
SetModified();
254270
}
255271

256-
/// <summary>This method adds the field to a specific page.</summary>
257-
/// <param name="field">
258-
/// the
259-
/// <see cref="iText.Forms.Fields.PdfFormField"/>
260-
/// to be added to the form
261-
/// </param>
262-
/// <param name="page">
263-
/// the
264-
/// <see cref="iText.Kernel.Pdf.PdfPage"/>
265-
/// on which to add the field
266-
/// </param>
267-
public virtual void AddField(PdfFormField field, PdfPage page) {
268-
AddField(field, page, false);
269-
}
270-
271272
/// <summary>
272273
/// This method merges field with its annotation and places it on the given
273274
/// page.

0 commit comments

Comments
 (0)