Skip to content

Commit d2cdb45

Browse files
committed
Fix copying fields during multiple page copying
DEVSIX-2187
1 parent 3f04567 commit d2cdb45

File tree

12 files changed

+69
-18
lines changed

12 files changed

+69
-18
lines changed

forms/src/main/java/com/itextpdf/forms/PdfPageFormCopier.java

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -141,20 +141,15 @@ private void copyField(PdfPage toPage, Map<String, PdfFormField> fieldsFrom,
141141
if (field == null) {
142142
formTo.addField(PdfFormField.makeFormField(currentAnnot.getPdfObject(), documentTo), null);
143143
} else {
144-
copyExistingField(toPage, currentAnnot, annotNameString);
144+
copyExistingField(toPage, currentAnnot);
145145
}
146146
}
147147
}
148148
}
149149

150-
private void copyExistingField(PdfPage toPage, PdfAnnotation currentAnnot, String annotNameString) {
151-
PdfFormField field;
152-
PdfDictionary clonedAnnot = (PdfDictionary) currentAnnot.getPdfObject().clone().makeIndirect(documentTo);
153-
toPage.getPdfObject().getAsArray(PdfName.Annots).add(clonedAnnot);
154-
toPage.removeAnnotation(currentAnnot);
155-
field = mergeFieldsWithTheSameName(PdfFormField.makeFormField(clonedAnnot, toPage.getDocument()));
150+
private void copyExistingField(PdfPage toPage, PdfAnnotation currentAnnot) {
151+
PdfFormField field = mergeFieldsWithTheSameName(PdfFormField.makeFormField(currentAnnot.getPdfObject(), toPage.getDocument()));
156152

157-
logger.warn(MessageFormatUtil.format(LogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, annotNameString));
158153
PdfArray kids = field.getKids();
159154
if (kids != null) {
160155
field.getPdfObject().remove(PdfName.Kids);
@@ -180,10 +175,8 @@ private void copyParentFormField(PdfPage toPage, Map<String, PdfFormField> field
180175
if (fieldName != null) {
181176
PdfFormField existingField = fieldsTo.get(fieldName.toUnicodeString());
182177
if (existingField != null) {
183-
PdfFormField clonedField = PdfFormField.makeFormField(field.getPdfObject().clone().makeIndirect(documentTo), documentTo);
184-
toPage.getPdfObject().getAsArray(PdfName.Annots).add(clonedField.getPdfObject());
185-
toPage.removeAnnotation(annot);
186-
mergeFieldsWithTheSameName(clonedField);
178+
PdfFormField mergedField = mergeFieldsWithTheSameName(field);
179+
formTo.getFormFields().put(mergedField.getFieldName().toUnicodeString(), mergedField);
187180
} else {
188181
HashSet<String> existingFields = new HashSet<>();
189182
getAllFieldNames(formTo.getFields(), existingFields);
@@ -204,6 +197,8 @@ private PdfFormField mergeFieldsWithTheSameName(PdfFormField newField) {
204197
String fullFieldName = newField.getFieldName().toUnicodeString();
205198
PdfString fieldName = newField.getPdfObject().getAsString(PdfName.T);
206199

200+
logger.warn(MessageFormatUtil.format(LogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, fullFieldName));
201+
207202
PdfFormField existingField = formTo.getField(fullFieldName);
208203
if (existingField.isFlushed()) {
209204
int index = 0;
@@ -216,6 +211,9 @@ private PdfFormField mergeFieldsWithTheSameName(PdfFormField newField) {
216211
}
217212
newField.getPdfObject().remove(PdfName.T);
218213
newField.getPdfObject().remove(PdfName.P);
214+
215+
formTo.getFields().remove(existingField.getPdfObject());
216+
219217
PdfArray kids = existingField.getKids();
220218
if (kids != null && !kids.isEmpty()) {
221219
existingField.addKid(newField);
@@ -224,7 +222,6 @@ private PdfFormField mergeFieldsWithTheSameName(PdfFormField newField) {
224222

225223
existingField.getPdfObject().remove(PdfName.T);
226224
existingField.getPdfObject().remove(PdfName.P);
227-
formTo.getFields().remove(existingField.getPdfObject());
228225
PdfFormField mergedField = PdfFormField.createEmptyField(documentTo);
229226
mergedField.
230227
put(PdfName.FT, existingField.getFormType()).
@@ -318,9 +315,9 @@ private void addChildToExistingParent(PdfDictionary fieldDic, Set<String> existi
318315
if (((PdfDictionary) kid).get(PdfName.T).equals(fieldDic.get(PdfName.T))) {
319316
PdfFormField kidField = PdfFormField.makeFormField(kid, documentTo);
320317
fieldsTo.put(kidField.getFieldName().toUnicodeString(), kidField);
321-
logger.warn(MessageFormatUtil.format(LogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD,
322-
kidField.getFieldName().toUnicodeString()));
323-
mergeFieldsWithTheSameName(PdfFormField.makeFormField(fieldDic, documentTo));
318+
319+
PdfFormField mergedField = mergeFieldsWithTheSameName(PdfFormField.makeFormField(fieldDic, documentTo));
320+
formTo.getFormFields().put(mergedField.getFieldName().toUnicodeString(), mergedField);
324321
return;
325322
}
326323
}

forms/src/test/java/com/itextpdf/forms/PdfFormCopyTest.java

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public void copyFieldsTest05() throws IOException, InterruptedException {
195195

196196
@Test
197197
@LogMessages(messages = {
198-
@LogMessage(messageTemplate = LogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, count = 4)
198+
@LogMessage(messageTemplate = LogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, count = 12)
199199
})
200200
public void copyMultipleSubfieldsTest01() throws IOException, InterruptedException {
201201
String srcFilename = sourceFolder + "copyMultipleSubfieldsTest01.pdf";
@@ -206,7 +206,7 @@ public void copyMultipleSubfieldsTest01() throws IOException, InterruptedExcepti
206206

207207
PdfPageFormCopier pdfPageFormCopier = new PdfPageFormCopier();
208208
// copying the same page from the same document twice
209-
for (int i = 0; i < 2; ++i) {
209+
for (int i = 0; i < 4; ++i) {
210210
srcDoc.copyPagesTo(1, 1, destDoc, pdfPageFormCopier);
211211
}
212212

@@ -223,6 +223,60 @@ public void copyMultipleSubfieldsTest01() throws IOException, InterruptedExcepti
223223
Assert.assertNull(new CompareTool().compareByContent(destFilename, sourceFolder + "cmp_copyMultipleSubfieldsTest01.pdf", destinationFolder, "diff_"));
224224
}
225225

226+
@Test
227+
@LogMessages(messages = {
228+
@LogMessage(messageTemplate = LogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, count = 2)
229+
})
230+
public void copyMultipleSubfieldsTest02() throws IOException, InterruptedException {
231+
String srcFilename = sourceFolder + "copyMultipleSubfieldsTest02.pdf";
232+
String destFilename = destinationFolder + "copyMultipleSubfieldsTest02.pdf";
233+
234+
PdfDocument srcDoc = new PdfDocument(new PdfReader(srcFilename));
235+
PdfDocument destDoc = new PdfDocument(new PdfWriter(destFilename));
236+
237+
PdfPageFormCopier pdfPageFormCopier = new PdfPageFormCopier();
238+
// copying the same page from the same document twice
239+
for (int i = 0; i < 3; ++i) {
240+
srcDoc.copyPagesTo(1, 1, destDoc, pdfPageFormCopier);
241+
}
242+
243+
PdfAcroForm acroForm = PdfAcroForm.getAcroForm(destDoc, false);
244+
245+
acroForm.getField("text.3").setValue("Text 3!");
246+
247+
destDoc.close();
248+
srcDoc.close();
249+
250+
Assert.assertNull(new CompareTool().compareByContent(destFilename, sourceFolder + "cmp_copyMultipleSubfieldsTest02.pdf", destinationFolder, "diff_"));
251+
}
252+
253+
@Test
254+
@LogMessages(messages = {
255+
@LogMessage(messageTemplate = LogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, count = 2)
256+
})
257+
public void copyMultipleSubfieldsTest03() throws IOException, InterruptedException {
258+
String srcFilename = sourceFolder + "copyMultipleSubfieldsTest03.pdf";
259+
String destFilename = destinationFolder + "copyMultipleSubfieldsTest03.pdf";
260+
261+
PdfDocument srcDoc = new PdfDocument(new PdfReader(srcFilename));
262+
PdfDocument destDoc = new PdfDocument(new PdfWriter(destFilename));
263+
264+
PdfPageFormCopier pdfPageFormCopier = new PdfPageFormCopier();
265+
// copying the same page from the same document twice
266+
for (int i = 0; i < 3; ++i) {
267+
srcDoc.copyPagesTo(1, 1, destDoc, pdfPageFormCopier);
268+
}
269+
270+
PdfAcroForm acroForm = PdfAcroForm.getAcroForm(destDoc, false);
271+
272+
acroForm.getField("text_1").setValue("Text 1!");
273+
274+
destDoc.close();
275+
srcDoc.close();
276+
277+
Assert.assertNull(new CompareTool().compareByContent(destFilename, sourceFolder + "cmp_copyMultipleSubfieldsTest03.pdf", destinationFolder, "diff_"));
278+
}
279+
226280
@Test
227281
@LogMessages(messages = {
228282
@LogMessage(messageTemplate = LogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, count = 13)

0 commit comments

Comments
 (0)