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); } }