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

Reply via email to