How to distribute the radio buttons of a radio field across multiple PdfPCells?
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);
}
}