pdfbox-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bharat Bhatt <bharatbh...@gmail.com>
Subject Re: RadioButton group with one radiobutton selected
Date Thu, 02 Feb 2017 17:10:39 GMT
Hi Tilman,

I am facing another issue in RadioButton. when click on unselected radio
button appearance of radio will disappear.

Sample PDF is attached and sample code I am using as follow:
        try
        {
            PDDocument document = new PDDocument();
            PDPage page = new PDPage(PDRectangle.A4);

            document.addPage(page);

            PDAcroForm acroForm = new PDAcroForm(document);

            // not needed, we have appearance streams
            //acroForm.setNeedAppearances(true);

            acroForm.setXFA(null);
            document.getDocumentCatalog().setAcroForm(acroForm);

            PDFont font = PDType1Font.HELVETICA;

            PDResources res = new PDResources();
            COSName fontName = res.add(font);
            acroForm.setDefaultResources(res);
            acroForm.setDefaultAppearance('/' + fontName.getName() + " 10
Tf 0 g");

            PDPageContentStream contents = new
PDPageContentStream(document, page);

            List<String> options = Arrays.asList("a", "b", "c");
            PDRadioButton radioButton = new PDRadioButton(acroForm);
            radioButton.setPartialName("RadioButtonParent");
            // removed per advice of Maruan Sahyoun, setValue didn't work
anymore
            //radioButton.setExportValues(options);
            radioButton.getCOSObject().setName(COSName.DV, options.get(1));
            radioButton.setFieldFlags(49152);
            int on = 1;

            List<PDAnnotationWidget> widgets = new ArrayList<>();
            for (int i = 0; i < options.size(); i++)
            {
                PDAppearanceCharacteristicsDictionary fieldAppearance =
                    new PDAppearanceCharacteristicsDictionary(new
COSDictionary());
                fieldAppearance.setBorderColour(new PDColor(new float[] {
0, 0, 0 }, PDDeviceRGB.INSTANCE));

                PDAnnotationWidget widget = new PDAnnotationWidget();
                widget.setRectangle(new PDRectangle(30, 811 - i * (21), 16,
16));
                widget.setAppearanceCharacteristics(fieldAppearance);
                widget.setAnnotationFlags(4);
                widget.setPage(page);
                PDAppearanceDictionary appearance = widget.getAppearance();
                if (appearance == null)
                {
                    appearance = new PDAppearanceDictionary();
                }

                COSDictionary aeDict = new COSDictionary();
                COSStream onStream = new COSStream();
                aeDict.setItem(options.get(i), onStream);
                aeDict.setItem(COSName.Off.getName(), onStream);

                PDAppearanceEntry ae = new PDAppearanceEntry(aeDict);
                appearance.setNormalAppearance(ae);
                widget.setAppearance(appearance);
                widgets.add(widget);
                page.getAnnotations().add(widget);


                widget.setAppearanceState(i == on? options.get(i): "Off");

                widgets.add(widget);
                page.getAnnotations().add(widget);

                contents.beginText();
                contents.setFont(font, 10);
                contents.newLineAtOffset(56, 811 - i * (21) + 4);
                contents.showText(options.get(i));
                contents.endText();
            }
            radioButton.setWidgets(widgets);
            acroForm.getFields().add(radioButton);

            contents.close();
            try (FileOutputStream output = new
FileOutputStream("D:\\test22.pdf"))
            {
                document.save(output);
            }
            document.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

Please help me resolve this issue. Is any other configuration or appearance
I have to add.


Thanks,
Bharat

On Thu, Feb 2, 2017 at 11:44 AM, Bharat Bhatt <bharatbhatt@gmail.com> wrote:

> Thank a lot for details.
>
> I tried with |widget.setAppearanceState(i ==on ?options.get(i):"Off");|
> and its works fine for me.
>
> Thanks,
> Bharat
>
>
>
> On Thu, Feb 2, 2017 at 12:40 AM, Tilman Hausherr <THausherr@t-online.de>
> wrote:
>
>> Please see the code in the answer to this question:
>> https://stackoverflow.com/questions/41631119/radiobutton-dis
>> play-problems-with-pdfbox
>>
>> To select a button, the appropriate line there is
>>
>> |widget.setAppearanceState(i ==on ?options.get(i):"Off");|
>>
>>
>> setValue should also work, but you'd have to delete this line
>>
>> radioButton.setExportValues(options);
>>
>>
>> because there's a bug related to that.
>>
>> Your code below seems to be based on an older answer of mine (it has "new
>> PDRadioButton" twice), which wasn't really good.
>>
>> Another strategy would be that you open your created file with
>> PDFDebugger, then do the same after selecting something in Adobe Reader and
>> saving it.
>>
>> Tilman
>>
>>
>> Am 01.02.2017 um 19:22 schrieb Bharat Bhatt:
>>
>>> Hi,
>>>
>>> I used PDRadioButton to create group of radio button. I am trying to
>>> select
>>> the one radio button by default but radio button is not appearing as
>>> selected.
>>> Code example as follows:
>>>          try
>>>          {
>>>              PDDocument document = new PDDocument();
>>>              PDPage page = new PDPage(PDRectangle.A4);
>>>
>>>              document.addPage(page);
>>>
>>>              PDAcroForm acroForm = new PDAcroForm(document);
>>>              acroForm.setNeedAppearances(true);
>>>              acroForm.setXFA(null);
>>>              document.getDocumentCatalog().setAcroForm(acroForm);
>>>
>>>              PDFont font = PDType1Font.HELVETICA;
>>>
>>>              PDResources res = new PDResources();
>>>              COSName fontName = res.add(font);
>>>              acroForm.setDefaultResources(res);
>>>              acroForm.setDefaultAppearance('/' + fontName.getName() + "
>>> 10
>>> Tf 0 g");
>>>
>>>              PDPageContentStream contents = new
>>> PDPageContentStream(document, page);
>>>
>>>              List<String> options = Arrays.asList("a", "b", "c");
>>>              PDRadioButton radioButton = new PDRadioButton(acroForm);
>>>              radioButton.setPartialName("RadioButtonParent");
>>>              radioButton.setExportValues(options);
>>>              radioButton.getCOSObject().setName(COSName.DV,
>>> options.get(1));
>>>
>>>              List<PDAnnotationWidget> widgets = new ArrayList<>();
>>>              for (int i = 0; i < options.size(); i++)
>>>              {
>>>                  PDRadioButton subRadioButtons = new
>>> PDRadioButton(acroForm);
>>>                  subRadioButtons.setPartialName("RadioButton");
>>>
>>>                  PDAppearanceCharacteristicsDictionary fieldAppearance =
>>>                      new PDAppearanceCharacteristicsDictionary(new
>>> COSDictionary());
>>>                  fieldAppearance.setBorderColour(new PDColor(new
>>> float[] {
>>> 0, 0, 0 }, PDDeviceRGB.INSTANCE));
>>>
>>>                  PDAnnotationWidget widget =
>>> subRadioButtons.getWidgets().get(0);
>>>                  widget.setRectangle(new PDRectangle(30, 811 - i * (21),
>>> 16,
>>> 16));
>>>                  widget.setAppearanceCharacteristics(fieldAppearance);
>>>
>>>                  PDAppearanceDictionary appearance =
>>> widget.getAppearance();
>>>                  if (appearance == null)
>>>                  {
>>>                      appearance = new PDAppearanceDictionary();
>>>                  }
>>>
>>>                  COSDictionary aeDict = new COSDictionary();
>>>                  COSStream on = new COSStream();
>>>                  aeDict.setItem(options.get(i), on);
>>>
>>>                  String value = null;
>>>                  if (options != null)
>>>                  {
>>>                      value = options.get(i);
>>>                      if (!"b".equalsIgnoreCase(value))
>>>                      {
>>>                          aeDict.setItem(COSName.Off.getName(), on);
>>>                      }
>>>                  }
>>>
>>>                  PDAppearanceEntry ae = new PDAppearanceEntry(aeDict);
>>>                  appearance.setNormalAppearance(ae);
>>>                  widget.setAppearance(appearance);
>>>                  widgets.add(widget);
>>>                  page.getAnnotations().add(widget);
>>>
>>>                  contents.beginText();
>>>                  contents.setFont(font, 10);
>>>                  contents.newLineAtOffset(56, 811 - i * (21) + 4);
>>>                  contents.showText(options.get(i));
>>>                  contents.endText();
>>>              }
>>>              radioButton.setWidgets(widgets);
>>>              acroForm.getFields().add(radioButton);
>>>
>>>              contents.close();
>>>              try (FileOutputStream output = new
>>> FileOutputStream("D:\\RadioTest.pdf"))
>>>              {
>>>                  document.save(output);
>>>              }
>>>              document.close();
>>>          }
>>>          catch (IOException e)
>>>          {
>>>              e.printStackTrace();
>>>          }
>>>
>>> How to make radio button "b"  as selected?
>>>
>>> Thanks,
>>> Bharat
>>>
>>>
>>
>

Mime
View raw message