Author: tilman
Date: Thu Jul 30 14:58:21 2026
New Revision: 1936740
Log:
PDFBOX-6227: add test
Modified:
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormTest.java
Modified:
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormTest.java
==============================================================================
---
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormTest.java
Thu Jul 30 14:58:18 2026 (r1936739)
+++
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormTest.java
Thu Jul 30 14:58:21 2026 (r1936740)
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Asse
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.ByteArrayOutputStream;
@@ -437,6 +438,43 @@ class PDAcroFormTest
}
}
+ /**
+ * PDFBOX-6227: Check that cycle is caught in repair.
+ *
+ * @throws IOException
+ */
+ @Test
+ void testCycle() throws IOException
+ {
+ try (PDDocument doc = new PDDocument())
+ {
+ PDPage page = new PDPage();
+ doc.addPage(page);
+
+ PDAcroForm theAcroForm = new PDAcroForm(doc);
+ theAcroForm.setNeedAppearances(true);
+ doc.getDocumentCatalog().setAcroForm(theAcroForm);
+ theAcroForm.setDefaultResources(new PDResources());
+
+ PDTextField textBox = new PDTextField(theAcroForm);
+ textBox.setPartialName("SampleField");
+
+ textBox.setDefaultAppearance("/Helv 0 Ff 0 g");
+ // field not added to force repair
+
+ PDAnnotationWidget widget = textBox.getWidgets().get(0);
+ PDRectangle rect = new PDRectangle(50, 750, 200, 20);
+ assertThrows(IllegalArgumentException.class, () ->
widget.setParent(textBox));
+ widget.getCOSObject().setItem(COSName.PARENT,
widget.getCOSObject());
+ widget.setRectangle(rect);
+ widget.setPage(page);
+
+ page.getAnnotations().add(widget);
+
+
assertTrue(doc.getDocumentCatalog().getAcroForm().getFields().isEmpty());
+ }
+ }
+
@AfterEach
void tearDown() throws IOException
{