How to create a group of radio buttons using PDFBox 2.0

I want to create a Radio Button group using PDFBox 2.0, I can create 3 Radio Buttons, but I cannot figure out how to group them (PDFBox 1.8, uses PDRadioCollection , but 2.0 does not.).

How do you create a radio button group with PDFBox 2.0?

Here is my current code:

        PDDocument document = new PDDocument();
        PDPage page = new PDPage(PDRectangle.A4);
        document.addPage(page);

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

        PDResources res = new PDResources();
        COSName fontName = res.add(PDTrueTypeFont.load(document, new FileInputStream("C:/Windows/Fonts/arial.ttf"), StandardEncoding.INSTANCE));
        acroForm.setDefaultResources(res);
        acroForm.setDefaultAppearance('/' + fontName.getName() + " 10 Tf 0 g");

        PDPageContentStream contents = new PDPageContentStream(document, page);

        List<String> options = Arrays.asList("a", "b", "c");
        for (int i = 0; i < options.size(); i++) {
            PDRadioButton button = new PDRadioButton(acroForm);
            button.setPartialName("RadioButton" + options.get(i));

            PDAppearanceCharacteristicsDictionary fieldAppearance = new PDAppearanceCharacteristicsDictionary(new COSDictionary());
            fieldAppearance.setBorderColour(new PDColor(new float[]{0, 0, 0}, PDDeviceRGB.INSTANCE));

            PDAnnotationWidget widget = button.getWidgets().get(0);
            widget.setRectangle(new PDRectangle(30, 800 - i * (21), 16, 16));
            widget.setAppearanceCharacteristics(fieldAppearance);

            acroForm.getFields().add(button);
            page.getAnnotations().add(widget);
        }
        contents.close();
        document.save(new FileOutputStream("RadioButtonTest.pdf"));
        document.close();
+4
source share
1 answer

Looking at Tilman’s suggestions and, by a lucky chance as a whole, I was able to find what the solution looks like for creating a group of switches.

note: I checked my results by checking the PDF in Acrobat 11.

here is the code:

try {
        PDDocument document = new PDDocument();
        PDPage page = new PDPage(PDRectangle.A4);

        document.addPage(page);

        PDAcroForm acroForm = new PDAcroForm(document);
        acroForm.setNeedAppearances(true);
        acroForm.setXFA(null);
        document.getDocumentCatalog().setAcroForm(acroForm);

        PDFont font = PDType1Font.HELVETICA;

        PDResources res = new PDResources();
        COSName fontName = res.add(font);
        acroForm.setDefaultResources(res);
        acroForm.setDefaultAppearance('/' + fontName.getName() + " 10 Tf 0 g");

        PDPageContentStream contents = new PDPageContentStream(document, page);

        List<String> options = Arrays.asList("a", "b", "c");
        PDRadioButton radioButton = new PDRadioButton(acroForm);
        radioButton.setPartialName("RadioButtonParent");
        radioButton.setExportValues(options);
        radioButton.getCOSObject().setName(COSName.DV, options.get(1));

        List<PDAnnotationWidget> widgets = new ArrayList<>();
        for (int i = 0; i < options.size(); i++) {

            PDAppearanceCharacteristicsDictionary fieldAppearance = new PDAppearanceCharacteristicsDictionary(new COSDictionary());
            fieldAppearance.setBorderColour(new PDColor(new float[]{0, 0, 0}, PDDeviceRGB.INSTANCE));

            PDAnnotationWidget widget = new PDAnnotationWidget();
            widget.setRectangle(new PDRectangle(30, 811 - i * (21), 16, 16));
            widget.setAppearanceCharacteristics(fieldAppearance);

            widgets.add(widget);
            page.getAnnotations().add(widget);

            // added by Tilman on 13.1.2017, without it Adobe does not set the values properly
            PDAppearanceDictionary appearance = new PDAppearanceDictionary();
            COSDictionary dict = new COSDictionary();
            dict.setItem(COSName.getPDFName("Off"), new COSDictionary());
            dict.setItem(COSName.getPDFName(options.get(i)), new COSDictionary());
            PDAppearanceEntry appearanceEntry = new PDAppearanceEntry(dict);
            appearance.setNormalAppearance(appearanceEntry);
            widget.setAppearance(appearance);


            contents.beginText();
            contents.setFont(font, 10);
            contents.newLineAtOffset(56, 811 - i * (21) + 4);
            contents.showText(options.get(i));
            contents.endText();
        }
        radioButton.setWidgets(widgets);
        acroForm.getFields().add(radioButton);

        contents.close();
        try(FileOutputStream output = new FileOutputStream("Test.pdf")) {
            document.save(output);
        }
        document.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

The key seems to set the partial names of each radio button to the same value, but I cannot say for sure.

17.1.2019: "", , . , , Adobe, acroForm.setNeedAppearances(true); , PDFBox 2.0.13 .

+3

Source: https://habr.com/ru/post/1695844/


All Articles