JustPaste.it

package testpdfbox20;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.color.PDColor;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceCharacteristicsDictionary;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceEntry;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDRadioButton;
import org.apache.pdfbox.rendering.PDFRenderer;

/**
 *
 * @author Tilman Hausherr
 *
 * https://stackoverflow.com/questions/34867139/how-to-create-a-radio-button-group-with-pdfbox-2-0
 */
public class CreateRadioButtons
{
    public static void main(String[] args) throws IOException
    {
        PDDocument document = new PDDocument();
        PDPage page = new PDPage(PDRectangle.A4);
        document.addPage(page);

        PDAcroForm acroForm = new PDAcroForm(document);
        document.getDocumentCatalog().setAcroForm(acroForm);

        PDResources res = new PDResources();
        res.put(COSName.getPDFName("Helv"), PDType1Font.HELVETICA);
        acroForm.setDefaultResources(res);
        acroForm.setDefaultAppearance("/Helv 0 Tf 0 g");

        PDPageContentStream contents = new PDPageContentStream(document, page);

        List<String> options = Arrays.asList("a", "b", "c");
        PDRadioButton radioButton = new PDRadioButton(acroForm);
        radioButton.setPartialName("RadioButton");
        radioButton.setExportValues(options);
        radioButton.setFieldFlags(49152);
        List<PDAnnotationWidget> widgets = new ArrayList<PDAnnotationWidget>();
        for (int i = 0; i < options.size(); i++)
        {
            PDAppearanceCharacteristicsDictionary fieldAppearance = new PDAppearanceCharacteristicsDictionary(new COSDictionary());
            fieldAppearance.setBorderColour(new PDColor(new float[]{1, 1, 1}, PDDeviceRGB.INSTANCE));
            fieldAppearance.setBackground(new PDColor(new float[]{1}, PDDeviceGray.INSTANCE));
            fieldAppearance.setNormalCaption("4");

            PDAnnotationWidget widget = new PDAnnotationWidget();
            widget.setRectangle(new PDRectangle(30, 800 - i * (21), 16, 16));
            widget.setAppearanceCharacteristics(fieldAppearance);
            widget.setPage(page);
            widget.getCOSObject().setItem(COSName.PARENT, radioButton);
            widget.setAnnotationFlags(4);
            widget.setAppearanceState("Off");
            widget.setHighlightingMode("N");
            PDAppearanceDictionary ap = new PDAppearanceDictionary();
            COSDictionary aeDict = new COSDictionary();
            COSStream off = new COSStream();
            COSStream on = new COSStream();
            off.setItem(COSName.BBOX, new PDRectangle(0, 0, 16, 16));
            off.setItem(COSName.RESOURCES, res);
            on.setItem(COSName.BBOX, new PDRectangle(0, 0, 16, 16));
            on.setItem(COSName.RESOURCES, res);
            OutputStream osOff = off.createOutputStream();
            osOff.write(("q 0 g /Helv 16 Tf BT (O) Tj ET Q").getBytes());
            osOff.write(("").getBytes());
            osOff.close();
            OutputStream osOn = on.createOutputStream();
            osOn.write(("q 0 g BT /Helv 16 Tf (X) Tj ET Q").getBytes());
            osOn.write(("").getBytes());
            osOn.close();
            aeDict.setItem("Off", off);
            aeDict.setItem(options.get(i), on);
            PDAppearanceEntry ae = new PDAppearanceEntry(aeDict);
            
            ap.setNormalAppearance(ae);
            widget.setAppearance(ap);

            widgets.add(widget);
            page.getAnnotations().add(widget);
        }
        radioButton.setWidgets(widgets);
        System.out.println(radioButton.getOnValues());
        radioButton.setValue("b");
        acroForm.getFields().add(radioButton);
        //acroForm.refreshAppearances(); // not implemented
        contents.close();
        document.save(new FileOutputStream("RadioButtonTest.pdf"));
        
        PDFRenderer r = new PDFRenderer(document);
        r.renderImage(0);
        document.close();
    }
}