How to distribute the radio buttons of a radio field across multiple PdfPCells?

Tags: formstablescell eventradio buttonradio fieldposition fieldiText 5

I'd like to make a PdfPTable with multiple rows. In each row I'd like to have a Radio button in the first cell and descriptive text in the second cell. I'd like all the radio buttons to be a part of the same radio group. I've used PdfPCell's setCellEvent() method and I've created my own custom cell events to render text fields and check boxes in PdfPTables. However, I can't seem to figure out how to do it with radio buttons / radio groups. Is this possible with iText? Does anyone have an example?

Posted on StackOverflow on Apr 1, 2015 by corestruct00

Please take a look at the CreateRadioInTable example.

In this example, we create a PdfFormField for the radio group and we add it after constructing and adding the table:

PdfFormField radiogroup = PdfFormField.createRadioButton(writer, true);
radiogroup.setFieldName("Language");
PdfPTable table = new PdfPTable(2);
// add cells
document.add(table);
writer.addAnnotation(radiogroup);

When we create the cells for the radio buttons, we add an event, for instance:

cell.setCellEvent(new MyCellField(radiogroup, "english"));

The event looks like this:

class MyCellField implements PdfPCellEvent {
    protected PdfFormField radiogroup;
    protected String value;
    public MyCellField(PdfFormField radiogroup, String value) {
        this.radiogroup = radiogroup;
        this.value = value;
    }
    public void cellLayout(PdfPCell cell, Rectangle rectangle, PdfContentByte[] canvases) {
        final PdfWriter writer = canvases[0].getPdfWriter();
        RadioCheckField radio = new RadioCheckField(writer, rectangle, null, value);
        try {
            radiogroup.addKid(radio.getRadioField());
        } catch (final IOException ioe) {
            throw new ExceptionConverter(ioe);
        } catch (final DocumentException de) {
            throw new ExceptionConverter(de);
        }
    }
}

Taking this a bit further:

If you're nesting a table of radio buttons (radio group) in another table you'll have to change the following from Bruno's example:

instead of:

document.add(table);
writer.addAnnotation(radiogroup);

use (assuming you created a parent table and a PdfPCell in that table called parentCell)

parentCell.addElement(table);
parentCell.setCellEvent(new RadioGroupCellEvent(radioGroup));

with a parent cell event like so

public class RadioGroupCellEvent implements PdfPCellEvent {
    private PdfFormField radioGroup;
 
    public RadioGroupCellEvent(PdfFormField radioGroup) {
        this.radioGroup = radioGroup;
    }
 
    @Override
    public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) {
        PdfWriter writer = canvases[0].getPdfWriter();
        writer.addAnnotation(radioGroup);
    }
}