You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2026/07/25 14:37:35 UTC

svn commit: r1936579 - in pdfbox/trunk/pdfbox/src: main/java/org/apache/pdfbox/pdmodel/interactive/form test/java/org/apache/pdfbox/pdmodel/interactive/form

Author: tilman
Date: Sat Jul 25 14:37:35 2026
New Revision: 1936579

Log:
PDFBOX-6224: support the NoToggleToOff flag by Valery Bokov; closes #490

Modified:
   pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java
   pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestRadioButtons.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java	Sat Jul 25 14:13:38 2026	(r1936578)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java	Sat Jul 25 14:37:35 2026	(r1936579)
@@ -81,6 +81,29 @@ public final class PDRadioButton extends
     }
 
     /**
+     * From the PDF Spec <br>
+     * If set, exactly one radio button shall be selected at all times; clicking the currently
+     * selected button has no effect. If clear, clicking the selected button deselects it, leaving
+     * no button selected. This flag is meaningful only if the radio buttons are mutually exclusive,
+     * i.e. {@link #isRadiosInUnison()} is false.
+     *
+     * @param noToggleToOff The new flag for noToggleToOff.
+     */
+    public void setNoToggleToOff(boolean noToggleToOff)
+    {
+        getCOSObject().setFlag(COSName.FF, FLAG_NO_TOGGLE_TO_OFF, noToggleToOff);
+    }
+
+    /**
+     *
+     * @return true if the flag is set preventing a radio button from being toggled to off.
+     */
+    public boolean isNoToggleToOff()
+    {
+        return getCOSObject().getFlag(COSName.FF, FLAG_NO_TOGGLE_TO_OFF);
+    }
+
+    /**
      * This will get the selected index.
      * <p>
      * A RadioButton might have multiple same value options which are not selected jointly if

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestRadioButtons.java
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestRadioButtons.java	Sat Jul 25 14:13:38 2026	(r1936578)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestRadioButtons.java	Sat Jul 25 14:37:35 2026	(r1936579)
@@ -137,6 +137,33 @@ class TestRadioButtons
     }
 
     /**
+     * Test getting/setting the NoToggleToOff flag (PDF spec Ff bit 15).
+     *
+     * @throws IOException If there is an error creating the field.
+     */
+    @Test
+    void testNoToggleToOff() throws IOException
+    {
+        try (PDDocument doc = new PDDocument())
+        {
+            PDAcroForm acroForm = new PDAcroForm(doc);
+            PDRadioButton radioButton = new PDRadioButton(acroForm);
+
+            // default shall be false/unset
+            assertFalse(radioButton.isNoToggleToOff());
+
+            radioButton.setNoToggleToOff(true);
+            assertTrue(radioButton.isNoToggleToOff());
+            // spec bit 15 -> mask 1 << 14
+            assertEquals(1 << 14, radioButton.getCOSObject().getInt(COSName.FF) & (1 << 14));
+
+            radioButton.setNoToggleToOff(false);
+            assertFalse(radioButton.isNoToggleToOff());
+            assertEquals(0, radioButton.getCOSObject().getInt(COSName.FF) & (1 << 14));
+        }
+    }
+
+    /**
      * PDFBOX-3656 Radio button field with FLAG_RADIOS_IN_UNISON false
      * 
      * @throws IOException