Skip to content

Commit 87c76c1

Browse files
committed
Handle annotations missing a subtype
DEVSIX-4742
1 parent bfe8635 commit 87c76c1

5 files changed

Lines changed: 25 additions & 1 deletion

File tree

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ public void copy(PdfPage fromPage, PdfPage toPage) {
103103

104104
try {
105105
for (PdfAnnotation annot : annots) {
106+
if (annot.getSubtype() == null) {
107+
logger.warn(MessageFormatUtil.format(FormsLogMessageConstants.ANNOTATION_WITHOUT_SUBTYPE_NOT_COPIED,
108+
annot.getPdfObject().getIndirectReference()));
109+
continue;
110+
}
106111
if (!annot.getSubtype().equals(PdfName.Widget)) {
107112
continue;
108113
}

forms/src/main/java/com/itextpdf/forms/logs/FormsLogMessageConstants.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public final class FormsLogMessageConstants {
3030
public static final String ACROFORM_NOT_SUPPORTED_FOR_SELECT =
3131
"AcroForm fields creation for select fields (ComboBoxField and ListBoxField) is not supported. They will "
3232
+ "be flattened instead.";
33-
33+
3434
public static final String ANNOTATION_IN_ACROFORM_DICTIONARY = "Annotation is noticed directly in fields array "
3535
+ "of AcroForm dictionary. It violates pdf specification.";
3636

@@ -86,6 +86,9 @@ public final class FormsLogMessageConstants {
8686
public static final String DUPLICATE_EXPORT_VALUE = "More than one option with the same value. This is an invalid"
8787
+ " state.";
8888

89+
public static final String ANNOTATION_WITHOUT_SUBTYPE_NOT_COPIED = "Encountered an annotation without "
90+
+ "a Subtype property: {0}. If there is a corresponding Acroform field, it will not be copied";
91+
8992
private FormsLogMessageConstants() {
9093
}
9194
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ This file is part of the iText (R) project.
2323
package com.itextpdf.forms;
2424

2525
import com.itextpdf.forms.fields.PdfFormCreator;
26+
import com.itextpdf.forms.logs.FormsLogMessageConstants;
2627
import com.itextpdf.io.logs.IoLogMessageConstant;
2728
import com.itextpdf.io.source.ByteArrayOutputStream;
2829
import com.itextpdf.kernel.pdf.PdfDocument;
@@ -699,4 +700,19 @@ public void widgetContainsNoTEntryTest() throws IOException, InterruptedExceptio
699700
resultPdfDocument.close();
700701
Assertions.assertNull(new CompareTool().compareByContent(destFileName, cmpFileName, destinationFolder, "diff_"));
701702
}
703+
704+
@Test
705+
@LogMessages(messages = {
706+
@LogMessage(messageTemplate = FormsLogMessageConstants.ANNOTATION_WITHOUT_SUBTYPE_NOT_COPIED, count = 1)
707+
})
708+
public void copyWithNoSubtypeInAnnotationTest() throws Exception {
709+
String sourceFileName = sourceFolder + "copyWithNoSubtypeInAnnotationTest.pdf";
710+
String destFileName = destinationFolder + "copyWithNoSubtypeInAnnotationTest.pdf";
711+
String cmpFileName = sourceFolder + "cmp_copyWithNoSubtypeInAnnotationTest.pdf";
712+
PdfDocument sourcePdfDocument = new PdfDocument(new PdfReader(sourceFileName));
713+
PdfDocument resultPdfDocument = new PdfDocument(new PdfWriter(destFileName));
714+
sourcePdfDocument.copyPagesTo(1, sourcePdfDocument.getNumberOfPages(), resultPdfDocument, new PdfPageFormCopier());
715+
resultPdfDocument.close();
716+
Assertions.assertNull(new CompareTool().compareByContent(destFileName, cmpFileName, destinationFolder, "diff_"));
717+
}
702718
}
Binary file not shown.

0 commit comments

Comments
 (0)