Skip to content

Commit 70def83

Browse files
Reinitialize form field appearance stream object on every field regeneration
First, appearance stream objects might be shared between different forms fields or other entities, if they are identical, so on regeneration we should not affect those other entities. Second, the resources of the streams and other entries in stream dictionaries are not shared between regenerations. It seems that this makes sense, because resources are completely rebuilt every time, and all other important entries in the appearance stream are updated on regeneration as well. DEVSIX-2374
1 parent eb53c75 commit 70def83

17 files changed

+57
-7
lines changed

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

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2026,13 +2026,7 @@ public boolean regenerateField() {
20262026
bBox = new PdfArray(rect);
20272027
}
20282028
//Create appearance
2029-
AppearanceXObject appearance = null;
2030-
if (asNormal != null) {
2031-
appearance = new AppearanceXObject(asNormal);
2032-
appearance.setBBox(new PdfArray(new float[]{0, 0, bBox.toRectangle().getWidth(), bBox.toRectangle().getHeight()}));
2033-
} else {
2034-
appearance = new AppearanceXObject(new Rectangle(0, 0, bBox.toRectangle().getWidth(), bBox.toRectangle().getHeight()));
2035-
}
2029+
AppearanceXObject appearance = new AppearanceXObject(new Rectangle(0, 0, bBox.toRectangle().getWidth(), bBox.toRectangle().getHeight()));
20362030
appearance.addFontFromDR(localFontName, localFont);
20372031
appearance.put(PdfName.Matrix, matrix);
20382032
//Create text appearance

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,37 @@ public void copyMultipleSubfieldsTest03() throws IOException, InterruptedExcepti
277277
Assert.assertNull(new CompareTool().compareByContent(destFilename, sourceFolder + "cmp_copyMultipleSubfieldsTest03.pdf", destinationFolder, "diff_"));
278278
}
279279

280+
281+
@Test
282+
@LogMessages(messages = {
283+
@LogMessage(messageTemplate = LogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, count = 12)
284+
})
285+
public void copyMultipleSubfieldsSmartModeTest01() throws IOException, InterruptedException {
286+
String srcFilename = sourceFolder + "copyMultipleSubfieldsSmartModeTest01.pdf";
287+
String destFilename = destinationFolder + "copyMultipleSubfieldsSmartModeTest01.pdf";
288+
289+
PdfDocument srcDoc = new PdfDocument(new PdfReader(srcFilename));
290+
PdfDocument destDoc = new PdfDocument(new PdfWriter(destFilename).setSmartMode(true));
291+
292+
PdfPageFormCopier pdfPageFormCopier = new PdfPageFormCopier();
293+
// copying the same page from the same document twice
294+
for (int i = 0; i < 4; ++i) {
295+
srcDoc.copyPagesTo(1, 1, destDoc, pdfPageFormCopier);
296+
}
297+
298+
PdfAcroForm acroForm = PdfAcroForm.getAcroForm(destDoc, false);
299+
300+
acroForm.getField("text_1").setValue("Text 1!");
301+
acroForm.getField("text_2").setValue("Text 2!");
302+
acroForm.getField("text.3").setValue("Text 3!");
303+
acroForm.getField("text.4").setValue("Text 4!");
304+
305+
destDoc.close();
306+
srcDoc.close();
307+
308+
Assert.assertNull(new CompareTool().compareByContent(destFilename, sourceFolder + "cmp_copyMultipleSubfieldsSmartModeTest01.pdf", destinationFolder, "diff_"));
309+
}
310+
280311
@Test
281312
@LogMessages(messages = {
282313
@LogMessage(messageTemplate = LogMessageConstant.DOCUMENT_ALREADY_HAS_FIELD, count = 13)

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,4 +647,29 @@ public void multilineFormFieldNewLineTest() throws IOException, InterruptedExcep
647647
Assert.fail(errorMessage);
648648
}
649649
}
650+
651+
@Test
652+
public void fillFormWithSameEmptyObjsForAppearance() throws IOException, InterruptedException {
653+
String outPdf = destinationFolder + "fillFormWithSameEmptyObjsForAppearance.pdf";
654+
String cmpPdf = sourceFolder + "cmp_fillFormWithSameEmptyObjsForAppearance.pdf";
655+
656+
PdfWriter writer = new PdfWriter(outPdf);
657+
PdfReader reader = new PdfReader(sourceFolder + "fillFormWithSameEmptyObjsForAppearance.pdf");
658+
PdfDocument pdfDoc = new PdfDocument(reader, writer);
659+
660+
PdfAcroForm acroForm = PdfAcroForm.getAcroForm(pdfDoc, false);
661+
662+
acroForm.getField("text_1").setValue("Text 1!");
663+
acroForm.getField("text_2").setValue("Text 2!");
664+
acroForm.getField("text.3").setValue("Text 3!");
665+
acroForm.getField("text.4").setValue("Text 4!");
666+
667+
pdfDoc.close();
668+
669+
CompareTool compareTool = new CompareTool();
670+
String errorMessage = compareTool.compareByContent(outPdf, cmpPdf, destinationFolder, "diff_");
671+
if (errorMessage != null) {
672+
Assert.fail(errorMessage);
673+
}
674+
}
650675
}

0 commit comments

Comments
 (0)