我想使用PDFBox 2.0创建一个单选按钮组,我能够创建3个单选按钮,但我无法弄清楚如何对它们进行分组(PDFBox 1.8,使用PDRadioCollection,但2.0不能吨)。
如何使用PDFBox 2.0创建单选按钮组?
这是我目前的代码:
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();
答案 0 :(得分:3)
通过查看Tilman的建议和一般的侥幸,我能够想出一个创建单选按钮组的解决方案。
注意:我一直在检查Acrobat 11中的pdf验证我的结果。
这是代码:
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();
}
关键似乎是将每个单选按钮的部分名称设置为相同的值,但我不能肯定地说。
更新17.1.2019:我是开头提到的“Tilman”,并为单选按钮创建了更灵活的代码并将其上传到source code repository。它的优点是可以创建类似于Adobe的外观流,因此不再需要调用acroForm.setNeedAppearances(true);
。该代码适用于PDFBox 2.0.13及更高版本。