You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@pdfbox.apache.org by Gary Grosso <ga...@oberontech.com> on 2018/07/24 13:35:11 UTC

How to get square radio button

Users of a fillable form application have come back asking for the ability to have a square radio button.

Acrobat gives a dialog, Radio Button Properties, with Options > Button Style, which can be set to check, circle, cross, diamond, square, or star.

I have been trying to understand how this is implemented using PDFBox, but have not had any luck.

The sample PDF is at http://aapro.net/temp/squarebutton.pdf

While "How to get square radio button" is what I'm required to know, "How to have figured that out using PDFBox" would also be of interest and appreciated.

Thanks,
Gary


RE: How to get square radio button

Posted by Gary Grosso <ga...@oberontech.com>.
Thanks Tilman.

When navigating such a path it's good to know someone else went down it and came out the other end.

If this work gets approved I'll try to remember to post my augmented code.

Gary


-----Original Message-----
From: Tilman Hausherr <TH...@t-online.de> 
Sent: Tuesday, July 24, 2018 2:35 PM
To: users@pdfbox.apache.org
Subject: Re: How to get square radio button


Yes, it is a pain. Find these sequences in PDFDebugger and insert then appropriately in your code. Try first without the /ZaDB stuff. If it is needed, then add it to the Acroform default resources first, and then this element to the resource of the appearance stream element.

Tilman

Am 24.07.2018 um 20:20 schrieb Gary Grosso:
> Oooooh.....
>
> I actually have to do stuff like this, then?
>
>
>      String offNString = "0 G\n"
>              + "q\n"
>              + "  1 0 0 1 8 8 cm\n"
>              + "  7.5 0 m\n"
>              + "  7.5 4.1423 4.1423 7.5 0 7.5 c\n"
>              + "  -4.1423 7.5 -7.5 4.1423 -7.5 0 c\n"
>              + "  -7.5 -4.1423 -4.1423 -7.5 0 -7.5 c\n"
>              + "  4.1423 -7.5 7.5 -4.1423 7.5 0 c\n"
>              + "  s\n"
>              + "Q";
>
>      OutputStream os = offNStream.createOutputStream(COSName.FLATE_DECODE);
>      os.write(offNString.getBytes());
>      os.close();
>
>
> Gack.
>
>
>
> -----Original Message-----
> From: Gary Grosso <ga...@oberontech.com>
> Sent: Tuesday, July 24, 2018 2:13 PM
> To: users@pdfbox.apache.org
> Subject: RE: How to get square radio button
>
> Hi Tilman,
>
> Right, I stared at PDFDebugger for a half hour and all I could determine was the square used ZapfDingbats. That was after I spent a half hour searching the API.
>
> My application makes round buttons already. I figure the square buttons have something to do with Appearance Streams. I looked at the SO article, but am not gaining any enlightenment regarding square radio buttons, though that may be my fault.
>
> I put a PDFDebugger view at http://aapro.net/temp/squarebuttonPDFDebuggerScreenshot.jpg in case that is helpful. I've looked around a lot more that that view indicates, but maybe someone can suggest where I need to be looking based on that screen shot.
>
> Also (I hope it isn't too lengthy), I'll post my radio button code. 
> Maybe someone can remind me what portion of this is likely relevant. I 
> sort of remember looking at the PDFBox source quite a bit back in 2016 
> for this, but have since forgotten all the details, and wish not to 
> have to go fully down that rabbit hole again. (I don't fit down rabbit 
> holes as well as I did in my younger days.)
>
>      private static void addRadiobuttonAtRect(PDPage page, PDAcroForm acroForm, String name,
>              Map<String, String> optionMap, PDRectangle rect, GroupInfo groupInfo, String dflt) {
>          PDAnnotationWidget radioButton = new PDAnnotationWidget();
>          
>          String grp = Utils.unescapeChar(optionMap.get("grp"));
>          System.out.println("grp=" + grp + "; name=" + name + "; num=" 
> + optionMap.get("num"));
>          
>          radioButton.setRectangle(rect);
>          
>          int wd = Utils.getInt(optionMap.get("wd"));
>          if (wd == -1) {
>              System.out.println("Zero or invalid wd of radio button '" + optionMap.get("wd") + "'");
>              wd = 8;
>          }
>          rect.setUpperRightX(rect.getLowerLeftX() + wd);
>          
>          PDFormFieldAdditionalActions fieldActions = new PDFormFieldAdditionalActions();
>          PDAnnotationAdditionalActions annotationActions = new PDAnnotationAdditionalActions();
>          setWidgetActions(optionMap, fieldActions, annotationActions);
>          radioButton.setActions(annotationActions);
>          
>          PDAppearanceCharacteristicsDictionary fieldAppearance
>                  = new PDAppearanceCharacteristicsDictionary(new COSDictionary());
>          if (Utils.getInt(optionMap.get("brdwt")) != 0) {
>              /*
>               * For borderWeight of zero to work reliably (and not exhibit a thin rule),
>               * it is important not so set any border color.
>               */
>              fieldAppearance.setBorderColour(Utils.hexToPDColor(optionMap.get("brdclr")));
>          }
>          
> fieldAppearance.setBackground(Utils.hexToPDColor(optionMap.get("bclr")
> ));
>          
>          radioButton.setAppearanceCharacteristics(fieldAppearance);
>          
>          radioButton.setAnnotationFlags(4);
>          radioButton.setPage(page);
>          PDRadioButton radioGroupWidget = (PDRadioButton) groupInfo.getGroupButton();
>          radioButton.setParent(radioGroupWidget);
>          
>          
>          COSDictionary apNDict = new COSDictionary();
>          COSStream offNStream = new COSStream();
>          offNStream.setItem(COSName.BBOX, rect);
>          offNStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
>          offNStream.setItem(COSName.TYPE, COSName.XOBJECT);
>          offNStream.setItem(COSName.SUBTYPE, COSName.FORM);
>
>          apNDict.setItem(COSName.Off, offNStream);
>
>          COSStream onNStream = new COSStream();
>          onNStream.setItem(COSName.BBOX, rect);
>          onNStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
>          onNStream.setItem(COSName.TYPE, COSName.XOBJECT);
>          onNStream.setItem(COSName.SUBTYPE, COSName.FORM);
>
>          apNDict.setItem(name, onNStream);
>
>          COSDictionary apDDict = new COSDictionary();
>          COSStream offDStream = new COSStream();
>          offDStream.setItem(COSName.BBOX, rect);
>          offDStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
>          offDStream.setItem(COSName.TYPE, COSName.XOBJECT);
>          offDStream.setItem(COSName.SUBTYPE, COSName.FORM);
>
>          apDDict.setItem(COSName.Off, offDStream);
>
>          COSStream onDStream = new COSStream();
>          onDStream.setItem(COSName.BBOX, rect);
>          onDStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
>          onDStream.setItem(COSName.TYPE, COSName.XOBJECT);
>          onDStream.setItem(COSName.SUBTYPE, COSName.FORM);
>
>          apDDict.setItem(name, onDStream);
>
>          PDAppearanceDictionary appearance = new PDAppearanceDictionary();
>          PDAppearanceEntry appearanceNEntry = new 
> PDAppearanceEntry(apNDict);
>
>          appearance.setNormalAppearance(appearanceNEntry);
>
>          PDAppearanceEntry appearanceDEntry = new 
> PDAppearanceEntry(apDDict);
>
>          appearance.setDownAppearance(appearanceDEntry);
>
>          radioButton.setAppearance(appearance);
>
>          if ((dflt != null) && dflt.equals("Yes")) {
>                  radioButton.setAppearanceState(name);
>          } else {
>              radioButton.setAppearanceState("Off");
>          }
>         
>          // Add the annotation to the group.
>          groupInfo.addItem(radioButton);
>          
>          try {
>              page.getAnnotations().add(radioButton);
>          } catch (IOException exc) {
>              System.out.println("IOException adding readioButton to page: " + exc.getMessage());
>          }
>
>      }
>
> Thanks,
> Gary
>
>
> -----Original Message-----
> From: Tilman Hausherr <TH...@t-online.de>
> Sent: Tuesday, July 24, 2018 1:43 PM
> To: users@pdfbox.apache.org
> Subject: Re: How to get square radio button
>
> It is tricky... one needs to look with PDFDebugger how Adobe does it and then you copy that. Here's my attempt with round buttons.
> https://stackoverflow.com/questions/41631119/radiobutton-display-probl
> ems-with-pdfbox/41632982
>
> I looked how the square buttons are done... it is similar except that a font is used. Not sure if this is needed or whether it is for text extraction.
>
> Tilman
>
>
> Am 24.07.2018 um 15:35 schrieb Gary Grosso:
>> Users of a fillable form application have come back asking for the ability to have a square radio button.
>>
>> Acrobat gives a dialog, Radio Button Properties, with Options > Button Style, which can be set to check, circle, cross, diamond, square, or star.
>>
>> I have been trying to understand how this is implemented using PDFBox, but have not had any luck.
>>
>> The sample PDF is at http://aapro.net/temp/squarebutton.pdf
>>
>> While "How to get square radio button" is what I'm required to know, "How to have figured that out using PDFBox" would also be of interest and appreciated.
>>
>> Thanks,
>> Gary
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
> For additional commands, e-mail: users-help@pdfbox.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
> For additional commands, e-mail: users-help@pdfbox.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
> For additional commands, e-mail: users-help@pdfbox.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


Re: How to get square radio button

Posted by Tilman Hausherr <TH...@t-online.de>.
Yes, it is a pain. Find these sequences in PDFDebugger and insert then 
appropriately in your code. Try first without the /ZaDB stuff. If it is 
needed, then add it to the Acroform default resources first, and then 
this element to the resource of the appearance stream element.

Tilman

Am 24.07.2018 um 20:20 schrieb Gary Grosso:
> Oooooh.....
>
> I actually have to do stuff like this, then?
>
>
>      String offNString = "0 G\n"
>              + "q\n"
>              + "  1 0 0 1 8 8 cm\n"
>              + "  7.5 0 m\n"
>              + "  7.5 4.1423 4.1423 7.5 0 7.5 c\n"
>              + "  -4.1423 7.5 -7.5 4.1423 -7.5 0 c\n"
>              + "  -7.5 -4.1423 -4.1423 -7.5 0 -7.5 c\n"
>              + "  4.1423 -7.5 7.5 -4.1423 7.5 0 c\n"
>              + "  s\n"
>              + "Q";
>
>      OutputStream os = offNStream.createOutputStream(COSName.FLATE_DECODE);
>      os.write(offNString.getBytes());
>      os.close();
>
>
> Gack.
>
>
>
> -----Original Message-----
> From: Gary Grosso <ga...@oberontech.com>
> Sent: Tuesday, July 24, 2018 2:13 PM
> To: users@pdfbox.apache.org
> Subject: RE: How to get square radio button
>
> Hi Tilman,
>
> Right, I stared at PDFDebugger for a half hour and all I could determine was the square used ZapfDingbats. That was after I spent a half hour searching the API.
>
> My application makes round buttons already. I figure the square buttons have something to do with Appearance Streams. I looked at the SO article, but am not gaining any enlightenment regarding square radio buttons, though that may be my fault.
>
> I put a PDFDebugger view at http://aapro.net/temp/squarebuttonPDFDebuggerScreenshot.jpg in case that is helpful. I've looked around a lot more that that view indicates, but maybe someone can suggest where I need to be looking based on that screen shot.
>
> Also (I hope it isn't too lengthy), I'll post my radio button code. Maybe someone can remind me what portion of this is likely relevant. I sort of remember looking at the PDFBox source quite a bit back in 2016 for this, but have since forgotten all the details, and wish not to have to go fully down that rabbit hole again. (I don't fit down rabbit holes as well as I did in my younger days.)
>
>      private static void addRadiobuttonAtRect(PDPage page, PDAcroForm acroForm, String name,
>              Map<String, String> optionMap, PDRectangle rect, GroupInfo groupInfo, String dflt) {
>          PDAnnotationWidget radioButton = new PDAnnotationWidget();
>          
>          String grp = Utils.unescapeChar(optionMap.get("grp"));
>          System.out.println("grp=" + grp + "; name=" + name + "; num=" + optionMap.get("num"));
>          
>          radioButton.setRectangle(rect);
>          
>          int wd = Utils.getInt(optionMap.get("wd"));
>          if (wd == -1) {
>              System.out.println("Zero or invalid wd of radio button '" + optionMap.get("wd") + "'");
>              wd = 8;
>          }
>          rect.setUpperRightX(rect.getLowerLeftX() + wd);
>          
>          PDFormFieldAdditionalActions fieldActions = new PDFormFieldAdditionalActions();
>          PDAnnotationAdditionalActions annotationActions = new PDAnnotationAdditionalActions();
>          setWidgetActions(optionMap, fieldActions, annotationActions);
>          radioButton.setActions(annotationActions);
>          
>          PDAppearanceCharacteristicsDictionary fieldAppearance
>                  = new PDAppearanceCharacteristicsDictionary(new COSDictionary());
>          if (Utils.getInt(optionMap.get("brdwt")) != 0) {
>              /*
>               * For borderWeight of zero to work reliably (and not exhibit a thin rule),
>               * it is important not so set any border color.
>               */
>              fieldAppearance.setBorderColour(Utils.hexToPDColor(optionMap.get("brdclr")));
>          }
>          fieldAppearance.setBackground(Utils.hexToPDColor(optionMap.get("bclr")));
>          
>          radioButton.setAppearanceCharacteristics(fieldAppearance);
>          
>          radioButton.setAnnotationFlags(4);
>          radioButton.setPage(page);
>          PDRadioButton radioGroupWidget = (PDRadioButton) groupInfo.getGroupButton();
>          radioButton.setParent(radioGroupWidget);
>          
>          
>          COSDictionary apNDict = new COSDictionary();
>          COSStream offNStream = new COSStream();
>          offNStream.setItem(COSName.BBOX, rect);
>          offNStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
>          offNStream.setItem(COSName.TYPE, COSName.XOBJECT);
>          offNStream.setItem(COSName.SUBTYPE, COSName.FORM);
>
>          apNDict.setItem(COSName.Off, offNStream);
>
>          COSStream onNStream = new COSStream();
>          onNStream.setItem(COSName.BBOX, rect);
>          onNStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
>          onNStream.setItem(COSName.TYPE, COSName.XOBJECT);
>          onNStream.setItem(COSName.SUBTYPE, COSName.FORM);
>
>          apNDict.setItem(name, onNStream);
>
>          COSDictionary apDDict = new COSDictionary();
>          COSStream offDStream = new COSStream();
>          offDStream.setItem(COSName.BBOX, rect);
>          offDStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
>          offDStream.setItem(COSName.TYPE, COSName.XOBJECT);
>          offDStream.setItem(COSName.SUBTYPE, COSName.FORM);
>
>          apDDict.setItem(COSName.Off, offDStream);
>
>          COSStream onDStream = new COSStream();
>          onDStream.setItem(COSName.BBOX, rect);
>          onDStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
>          onDStream.setItem(COSName.TYPE, COSName.XOBJECT);
>          onDStream.setItem(COSName.SUBTYPE, COSName.FORM);
>
>          apDDict.setItem(name, onDStream);
>
>          PDAppearanceDictionary appearance = new PDAppearanceDictionary();
>          PDAppearanceEntry appearanceNEntry = new PDAppearanceEntry(apNDict);
>
>          appearance.setNormalAppearance(appearanceNEntry);
>
>          PDAppearanceEntry appearanceDEntry = new PDAppearanceEntry(apDDict);
>
>          appearance.setDownAppearance(appearanceDEntry);
>
>          radioButton.setAppearance(appearance);
>
>          if ((dflt != null) && dflt.equals("Yes")) {
>                  radioButton.setAppearanceState(name);
>          } else {
>              radioButton.setAppearanceState("Off");
>          }
>         
>          // Add the annotation to the group.
>          groupInfo.addItem(radioButton);
>          
>          try {
>              page.getAnnotations().add(radioButton);
>          } catch (IOException exc) {
>              System.out.println("IOException adding readioButton to page: " + exc.getMessage());
>          }
>
>      }
>
> Thanks,
> Gary
>
>
> -----Original Message-----
> From: Tilman Hausherr <TH...@t-online.de>
> Sent: Tuesday, July 24, 2018 1:43 PM
> To: users@pdfbox.apache.org
> Subject: Re: How to get square radio button
>
> It is tricky... one needs to look with PDFDebugger how Adobe does it and then you copy that. Here's my attempt with round buttons.
> https://stackoverflow.com/questions/41631119/radiobutton-display-problems-with-pdfbox/41632982
>
> I looked how the square buttons are done... it is similar except that a font is used. Not sure if this is needed or whether it is for text extraction.
>
> Tilman
>
>
> Am 24.07.2018 um 15:35 schrieb Gary Grosso:
>> Users of a fillable form application have come back asking for the ability to have a square radio button.
>>
>> Acrobat gives a dialog, Radio Button Properties, with Options > Button Style, which can be set to check, circle, cross, diamond, square, or star.
>>
>> I have been trying to understand how this is implemented using PDFBox, but have not had any luck.
>>
>> The sample PDF is at http://aapro.net/temp/squarebutton.pdf
>>
>> While "How to get square radio button" is what I'm required to know, "How to have figured that out using PDFBox" would also be of interest and appreciated.
>>
>> Thanks,
>> Gary
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
> For additional commands, e-mail: users-help@pdfbox.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
> For additional commands, e-mail: users-help@pdfbox.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
> For additional commands, e-mail: users-help@pdfbox.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


RE: How to get square radio button

Posted by Gary Grosso <ga...@oberontech.com>.
Oooooh.....

I actually have to do stuff like this, then?


    String offNString = "0 G\n"
            + "q\n"
            + "  1 0 0 1 8 8 cm\n"
            + "  7.5 0 m\n"
            + "  7.5 4.1423 4.1423 7.5 0 7.5 c\n"
            + "  -4.1423 7.5 -7.5 4.1423 -7.5 0 c\n"
            + "  -7.5 -4.1423 -4.1423 -7.5 0 -7.5 c\n"
            + "  4.1423 -7.5 7.5 -4.1423 7.5 0 c\n"
            + "  s\n"
            + "Q";

    OutputStream os = offNStream.createOutputStream(COSName.FLATE_DECODE);
    os.write(offNString.getBytes());
    os.close();


Gack.



-----Original Message-----
From: Gary Grosso <ga...@oberontech.com> 
Sent: Tuesday, July 24, 2018 2:13 PM
To: users@pdfbox.apache.org
Subject: RE: How to get square radio button

Hi Tilman,

Right, I stared at PDFDebugger for a half hour and all I could determine was the square used ZapfDingbats. That was after I spent a half hour searching the API.

My application makes round buttons already. I figure the square buttons have something to do with Appearance Streams. I looked at the SO article, but am not gaining any enlightenment regarding square radio buttons, though that may be my fault.

I put a PDFDebugger view at http://aapro.net/temp/squarebuttonPDFDebuggerScreenshot.jpg in case that is helpful. I've looked around a lot more that that view indicates, but maybe someone can suggest where I need to be looking based on that screen shot.

Also (I hope it isn't too lengthy), I'll post my radio button code. Maybe someone can remind me what portion of this is likely relevant. I sort of remember looking at the PDFBox source quite a bit back in 2016 for this, but have since forgotten all the details, and wish not to have to go fully down that rabbit hole again. (I don't fit down rabbit holes as well as I did in my younger days.)

    private static void addRadiobuttonAtRect(PDPage page, PDAcroForm acroForm, String name,
            Map<String, String> optionMap, PDRectangle rect, GroupInfo groupInfo, String dflt) {
        PDAnnotationWidget radioButton = new PDAnnotationWidget();
        
        String grp = Utils.unescapeChar(optionMap.get("grp"));
        System.out.println("grp=" + grp + "; name=" + name + "; num=" + optionMap.get("num"));
        
        radioButton.setRectangle(rect);
        
        int wd = Utils.getInt(optionMap.get("wd"));
        if (wd == -1) {
            System.out.println("Zero or invalid wd of radio button '" + optionMap.get("wd") + "'");
            wd = 8;
        }
        rect.setUpperRightX(rect.getLowerLeftX() + wd);
        
        PDFormFieldAdditionalActions fieldActions = new PDFormFieldAdditionalActions();
        PDAnnotationAdditionalActions annotationActions = new PDAnnotationAdditionalActions();
        setWidgetActions(optionMap, fieldActions, annotationActions);
        radioButton.setActions(annotationActions);
        
        PDAppearanceCharacteristicsDictionary fieldAppearance
                = new PDAppearanceCharacteristicsDictionary(new COSDictionary());
        if (Utils.getInt(optionMap.get("brdwt")) != 0) {
            /*
             * For borderWeight of zero to work reliably (and not exhibit a thin rule),
             * it is important not so set any border color.
             */
            fieldAppearance.setBorderColour(Utils.hexToPDColor(optionMap.get("brdclr")));
        }
        fieldAppearance.setBackground(Utils.hexToPDColor(optionMap.get("bclr")));
        
        radioButton.setAppearanceCharacteristics(fieldAppearance);
        
        radioButton.setAnnotationFlags(4);
        radioButton.setPage(page);
        PDRadioButton radioGroupWidget = (PDRadioButton) groupInfo.getGroupButton(); 
        radioButton.setParent(radioGroupWidget);
        
        
        COSDictionary apNDict = new COSDictionary();
        COSStream offNStream = new COSStream();
        offNStream.setItem(COSName.BBOX, rect);
        offNStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
        offNStream.setItem(COSName.TYPE, COSName.XOBJECT);
        offNStream.setItem(COSName.SUBTYPE, COSName.FORM);

        apNDict.setItem(COSName.Off, offNStream);

        COSStream onNStream = new COSStream();
        onNStream.setItem(COSName.BBOX, rect);
        onNStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
        onNStream.setItem(COSName.TYPE, COSName.XOBJECT);
        onNStream.setItem(COSName.SUBTYPE, COSName.FORM);

        apNDict.setItem(name, onNStream);

        COSDictionary apDDict = new COSDictionary();
        COSStream offDStream = new COSStream();
        offDStream.setItem(COSName.BBOX, rect);
        offDStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
        offDStream.setItem(COSName.TYPE, COSName.XOBJECT);
        offDStream.setItem(COSName.SUBTYPE, COSName.FORM);

        apDDict.setItem(COSName.Off, offDStream);

        COSStream onDStream = new COSStream();
        onDStream.setItem(COSName.BBOX, rect);
        onDStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
        onDStream.setItem(COSName.TYPE, COSName.XOBJECT);
        onDStream.setItem(COSName.SUBTYPE, COSName.FORM);

        apDDict.setItem(name, onDStream);

        PDAppearanceDictionary appearance = new PDAppearanceDictionary();
        PDAppearanceEntry appearanceNEntry = new PDAppearanceEntry(apNDict);

        appearance.setNormalAppearance(appearanceNEntry);

        PDAppearanceEntry appearanceDEntry = new PDAppearanceEntry(apDDict);

        appearance.setDownAppearance(appearanceDEntry);

        radioButton.setAppearance(appearance);

        if ((dflt != null) && dflt.equals("Yes")) {
                radioButton.setAppearanceState(name);
        } else {
            radioButton.setAppearanceState("Off");
        }
       
        // Add the annotation to the group.
        groupInfo.addItem(radioButton);
        
        try {
            page.getAnnotations().add(radioButton);
        } catch (IOException exc) {
            System.out.println("IOException adding readioButton to page: " + exc.getMessage());
        }

    }

Thanks,
Gary


-----Original Message-----
From: Tilman Hausherr <TH...@t-online.de> 
Sent: Tuesday, July 24, 2018 1:43 PM
To: users@pdfbox.apache.org
Subject: Re: How to get square radio button

It is tricky... one needs to look with PDFDebugger how Adobe does it and then you copy that. Here's my attempt with round buttons.
https://stackoverflow.com/questions/41631119/radiobutton-display-problems-with-pdfbox/41632982

I looked how the square buttons are done... it is similar except that a font is used. Not sure if this is needed or whether it is for text extraction.

Tilman


Am 24.07.2018 um 15:35 schrieb Gary Grosso:
> Users of a fillable form application have come back asking for the ability to have a square radio button.
>
> Acrobat gives a dialog, Radio Button Properties, with Options > Button Style, which can be set to check, circle, cross, diamond, square, or star.
>
> I have been trying to understand how this is implemented using PDFBox, but have not had any luck.
>
> The sample PDF is at http://aapro.net/temp/squarebutton.pdf
>
> While "How to get square radio button" is what I'm required to know, "How to have figured that out using PDFBox" would also be of interest and appreciated.
>
> Thanks,
> Gary
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


RE: How to get square radio button

Posted by Gary Grosso <ga...@oberontech.com>.
Hi Tilman,

Right, I stared at PDFDebugger for a half hour and all I could determine was the square used ZapfDingbats. That was after I spent a half hour searching the API.

My application makes round buttons already. I figure the square buttons have something to do with Appearance Streams. I looked at the SO article, but am not gaining any enlightenment regarding square radio buttons, though that may be my fault.

I put a PDFDebugger view at http://aapro.net/temp/squarebuttonPDFDebuggerScreenshot.jpg in case that is helpful. I've looked around a lot more that that view indicates, but maybe someone can suggest where I need to be looking based on that screen shot.

Also (I hope it isn't too lengthy), I'll post my radio button code. Maybe someone can remind me what portion of this is likely relevant. I sort of remember looking at the PDFBox source quite a bit back in 2016 for this, but have since forgotten all the details, and wish not to have to go fully down that rabbit hole again. (I don't fit down rabbit holes as well as I did in my younger days.)

    private static void addRadiobuttonAtRect(PDPage page, PDAcroForm acroForm, String name,
            Map<String, String> optionMap, PDRectangle rect, GroupInfo groupInfo, String dflt) {
        PDAnnotationWidget radioButton = new PDAnnotationWidget();
        
        String grp = Utils.unescapeChar(optionMap.get("grp"));
        System.out.println("grp=" + grp + "; name=" + name + "; num=" + optionMap.get("num"));
        
        radioButton.setRectangle(rect);
        
        int wd = Utils.getInt(optionMap.get("wd"));
        if (wd == -1) {
            System.out.println("Zero or invalid wd of radio button '" + optionMap.get("wd") + "'");
            wd = 8;
        }
        rect.setUpperRightX(rect.getLowerLeftX() + wd);
        
        PDFormFieldAdditionalActions fieldActions = new PDFormFieldAdditionalActions();
        PDAnnotationAdditionalActions annotationActions = new PDAnnotationAdditionalActions();
        setWidgetActions(optionMap, fieldActions, annotationActions);
        radioButton.setActions(annotationActions);
        
        PDAppearanceCharacteristicsDictionary fieldAppearance
                = new PDAppearanceCharacteristicsDictionary(new COSDictionary());
        if (Utils.getInt(optionMap.get("brdwt")) != 0) {
            /*
             * For borderWeight of zero to work reliably (and not exhibit a thin rule),
             * it is important not so set any border color.
             */
            fieldAppearance.setBorderColour(Utils.hexToPDColor(optionMap.get("brdclr")));
        }
        fieldAppearance.setBackground(Utils.hexToPDColor(optionMap.get("bclr")));
        
        radioButton.setAppearanceCharacteristics(fieldAppearance);
        
        radioButton.setAnnotationFlags(4);
        radioButton.setPage(page);
        PDRadioButton radioGroupWidget = (PDRadioButton) groupInfo.getGroupButton(); 
        radioButton.setParent(radioGroupWidget);
        
        
        COSDictionary apNDict = new COSDictionary();
        COSStream offNStream = new COSStream();
        offNStream.setItem(COSName.BBOX, rect);
        offNStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
        offNStream.setItem(COSName.TYPE, COSName.XOBJECT);
        offNStream.setItem(COSName.SUBTYPE, COSName.FORM);

        apNDict.setItem(COSName.Off, offNStream);

        COSStream onNStream = new COSStream();
        onNStream.setItem(COSName.BBOX, rect);
        onNStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
        onNStream.setItem(COSName.TYPE, COSName.XOBJECT);
        onNStream.setItem(COSName.SUBTYPE, COSName.FORM);

        apNDict.setItem(name, onNStream);

        COSDictionary apDDict = new COSDictionary();
        COSStream offDStream = new COSStream();
        offDStream.setItem(COSName.BBOX, rect);
        offDStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
        offDStream.setItem(COSName.TYPE, COSName.XOBJECT);
        offDStream.setItem(COSName.SUBTYPE, COSName.FORM);

        apDDict.setItem(COSName.Off, offDStream);

        COSStream onDStream = new COSStream();
        onDStream.setItem(COSName.BBOX, rect);
        onDStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
        onDStream.setItem(COSName.TYPE, COSName.XOBJECT);
        onDStream.setItem(COSName.SUBTYPE, COSName.FORM);

        apDDict.setItem(name, onDStream);

        PDAppearanceDictionary appearance = new PDAppearanceDictionary();
        PDAppearanceEntry appearanceNEntry = new PDAppearanceEntry(apNDict);

        appearance.setNormalAppearance(appearanceNEntry);

        PDAppearanceEntry appearanceDEntry = new PDAppearanceEntry(apDDict);

        appearance.setDownAppearance(appearanceDEntry);

        radioButton.setAppearance(appearance);

        if ((dflt != null) && dflt.equals("Yes")) {
                radioButton.setAppearanceState(name);
        } else {
            radioButton.setAppearanceState("Off");
        }
       
        // Add the annotation to the group.
        groupInfo.addItem(radioButton);
        
        try {
            page.getAnnotations().add(radioButton);
        } catch (IOException exc) {
            System.out.println("IOException adding readioButton to page: " + exc.getMessage());
        }

    }

Thanks,
Gary


-----Original Message-----
From: Tilman Hausherr <TH...@t-online.de> 
Sent: Tuesday, July 24, 2018 1:43 PM
To: users@pdfbox.apache.org
Subject: Re: How to get square radio button

It is tricky... one needs to look with PDFDebugger how Adobe does it and then you copy that. Here's my attempt with round buttons.
https://stackoverflow.com/questions/41631119/radiobutton-display-problems-with-pdfbox/41632982

I looked how the square buttons are done... it is similar except that a font is used. Not sure if this is needed or whether it is for text extraction.

Tilman


Am 24.07.2018 um 15:35 schrieb Gary Grosso:
> Users of a fillable form application have come back asking for the ability to have a square radio button.
>
> Acrobat gives a dialog, Radio Button Properties, with Options > Button Style, which can be set to check, circle, cross, diamond, square, or star.
>
> I have been trying to understand how this is implemented using PDFBox, but have not had any luck.
>
> The sample PDF is at http://aapro.net/temp/squarebutton.pdf
>
> While "How to get square radio button" is what I'm required to know, "How to have figured that out using PDFBox" would also be of interest and appreciated.
>
> Thanks,
> Gary
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


Re: How to get square radio button

Posted by Tilman Hausherr <TH...@t-online.de>.
It is tricky... one needs to look with PDFDebugger how Adobe does it and 
then you copy that. Here's my attempt with round buttons.
https://stackoverflow.com/questions/41631119/radiobutton-display-problems-with-pdfbox/41632982

I looked how the square buttons are done... it is similar except that a 
font is used. Not sure if this is needed or whether it is for text 
extraction.

Tilman


Am 24.07.2018 um 15:35 schrieb Gary Grosso:
> Users of a fillable form application have come back asking for the ability to have a square radio button.
>
> Acrobat gives a dialog, Radio Button Properties, with Options > Button Style, which can be set to check, circle, cross, diamond, square, or star.
>
> I have been trying to understand how this is implemented using PDFBox, but have not had any luck.
>
> The sample PDF is at http://aapro.net/temp/squarebutton.pdf
>
> While "How to get square radio button" is what I'm required to know, "How to have figured that out using PDFBox" would also be of interest and appreciated.
>
> Thanks,
> Gary
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org