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