HI Tilman
Thanks for your help, regarding "pdAcroForm.setNeedAppearances(true);", will
pdfbox have a default appearance in the future, so need appearances will not be
needed?
I have a working solution to set default values and have acrobat render them.
It was pure fluke that I got this result, but wanted to post it so other will
know and to close out the solution.
Code:
package pdfboxtesting;
import java.io.FileInputStream;
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.PDFont;
import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
import org.apache.pdfbox.pdmodel.font.encoding.StandardEncoding;
import org.apache.pdfbox.pdmodel.graphics.color.PDColor;
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;
public class RadioButtonTest
{
private RadioButtonTest() {
}
public static void main(String[] args) throws IOException
{
String fileName = "output/Test.pdf";
String selectedValue = "a";
String name = "Radio";
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);
PDFont font = PDTrueTypeFont.load(document, new
FileInputStream("C:/Windows/Fonts/arial.ttf"), StandardEncoding.INSTANCE);
PDResources res = new PDResources();
COSName fontName = res.add(font);
acroForm.setDefaultResources(res);
acroForm.setDefaultAppearance('/' + fontName.getName() + " 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");
List<PDAnnotationWidget> widgets = new ArrayList<>();
for (int i = 0; i < options.size(); i++)
{
PDRadioButton subRadioButton = new PDRadioButton(acroForm);
subRadioButton.setPartialName(name);
PDAnnotationWidget widget = subRadioButton.getWidgets().get(0);
PDAppearanceCharacteristicsDictionary fieldAppearance = new
PDAppearanceCharacteristicsDictionary(new COSDictionary());
fieldAppearance.setBorderColour(new PDColor(new float[]{0, 0, 0},
PDDeviceRGB.INSTANCE));
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(options.get(i).equals(selectedValue) ?
selectedValue : "Off");
widget.setHighlightingMode("N");
PDAppearanceDictionary ap = new PDAppearanceDictionary();
COSDictionary aeDict = new COSDictionary();
COSStream off = new COSStream();
off.setItem(COSName.BBOX, new PDRectangle(0, 0, 16, 16));
off.setItem(COSName.RESOURCES, res);
OutputStream osOff = off.createOutputStream();
osOff.write(("q 0 g /" + fontName.getName() + " 16 Tf BT (O) Tj ET
Q").getBytes());
osOff.write(("").getBytes());
osOff.close();
aeDict.setItem("Off", off);
COSStream on = new COSStream();
on.setItem(COSName.BBOX, new PDRectangle(0, 0, 16, 16));
on.setItem(COSName.RESOURCES, res);
OutputStream osOn = on.createOutputStream();
osOn.write(("q 0 g BT /" + fontName.getName() + " 16 Tf (X) Tj ET
Q").getBytes());
osOn.write(("").getBytes());
osOn.close();
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(selectedValue);
acroForm.getFields().add(radioButton);
System.out.println(radioButton.getValue());
//acroForm.refreshAppearances(); // not implemented
contents.close();
document.save(new FileOutputStream(fileName));
document.close();
}
}
Adam
-----Original Message-----
From: Tilman Hausherr [mailto:[email protected]]
Sent: Thursday, 21 January 2016 4:55 PM
To: [email protected]
Subject: Re: How do you create a Radio Button Group with PDFBox 2.0?
Am 21.01.2016 um 09:41 schrieb Adam Steen:
> I am now able to create a radio button group with
> "pdAcroForm.setNeedAppearances(true);", acrobat rendering things nicely for
> me.
>
> I am also able to create a group of checkboxes with default values also with
> "pdAcroForm.setNeedAppearances(true);", again acrobat rendering things nicely
> for me.
>
> My last hurdle is to create a radio button group with
> "pdAcroForm.setNeedAppearances(true);" and have a default value (or value) be
> displayed.
>
> Using your code provided earlier Tilman, I was able to set a value or a
> default value, but acrobat just does not want to render it.
>
> Is " pdAcroForm.setNeedAppearances(true);" a hack? Should I be rendering
> everything myself?
Yes, it is a bit of a hack. Good applications should create their own
appearance streams. In PDF 2.0 it will be mandatory.
>
> Adam
>
> -----Original Message-----
> From: Tilman Hausherr [mailto:[email protected]]
> Sent: Thursday, 21 January 2016 4:29 PM
> To: [email protected]
> Subject: Re: How do you create a Radio Button Group with PDFBox 2.0?
>
> Am 21.01.2016 um 06:51 schrieb Adam Steen:
>> It seems without building an appearance I am unable to set a default value?
> Indeed. I've been there too and looked through the code.
>
> Tilman
>
>> Does anyone have any ideas?
>>
>> Adam
>>
>>
>> -----Original Message-----
>> From: Adam Steen [mailto:[email protected]]
>> Sent: Thursday, 21 January 2016 8:26 AM
>> To: [email protected]
>> Subject: RE: How do you create a Radio Button Group with PDFBox 2.0?
>>
>> Hi
>>
>> I did manage to get a Radio Group functioning, I have posted the code
>> to my question on stack overflow ->
>> http://stackoverflow.com/a/34895158/415681
>>
>> The next problem will be getting a default value set.
>>
>> Adam
>>
>> -----Original Message-----
>> From: Tilman Hausherr [mailto:[email protected]]
>> Sent: Wednesday, 20 January 2016 5:47 PM
>> To: [email protected]
>> Subject: Re: How do you create a Radio Button Group with PDFBox 2.0?
>>
>> Here's the code I did yesterday:
>> http://justpaste.it/CreateRadioButtons
>>
>> The problem is that Adobe does things on its own even if the appearance
>> streams are set. This seems to be related to the appearance characteristics
>> (/MK). I haven't been able to teach it to "do nothing", or "do it all" when
>> I do nothing (having empty streams).
>>
>> Tilman
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]