appearance = new PDAppearanceDictionary();
widget.setAppearance(appearance);
}
Map normalAppearance = appearance.getNormalAppearance();
PDAppearanceStream appearanceStream = (PDAppearanceStream) normalAppearance.get("default");
if (appearanceStream == null)
{
COSStream cosStream = acroForm.getDocument().getDocument().createCOSStream();
appearanceStream = new PDAppearanceStream(cosStream);
appearanceStream.setBoundingBox(widget.getRectangle().createRetranslatedRectangle());
appearance.setNormalAppearance(appearanceStream);
}
List tokens = getStreamTokens(appearanceStream);
List daTokens = getStreamTokens(getDefaultAppearance());
PDFont pdFont = getFontAndUpdateResources(tokens, appearanceStream);
// Special handling for listboxes to address PDFBOX-2249
// TODO: Shall be addressed properly in a future release
if (parent instanceof PDChoiceField
&& (parent.getFieldFlags() & ((PDChoiceField) parent).FLAG_COMBO) == 0)
{
generateListboxAppearance(widget, pdFont, tokens, daTokens, appearanceStream, value);
}
else
{
if (!containsMarkedContent(tokens))
{
ByteArrayOutputStream output = new ByteArrayOutputStream();
// BJL 9/25/2004 Must prepend existing stream
// because it might have operators to draw things like
// rectangles and such
ContentStreamWriter writer = new ContentStreamWriter(output);
writer.writeTokens(tokens);
output.write(" /Tx BMC\n".getBytes("ISO-8859-1"));
insertGeneratedAppearance(widget, output, pdFont, tokens, appearanceStream);
output.write(" EMC".getBytes("ISO-8859-1"));
writeToStream(output.toByteArray(), appearanceStream);
}
else
{
if (tokens != null)
{
if (daTokens != null)
{
int bmcIndex = tokens.indexOf(PDFOperator.getOperator("BMC"));
int emcIndex = tokens.indexOf(PDFOperator.getOperator("EMC"));
if (bmcIndex != -1 && emcIndex != -1 && emcIndex == bmcIndex + 1)
{
// if the EMC immediately follows the BMC index then should
// insert the daTokens inbetween the two markers.
tokens.addAll(emcIndex, daTokens);
}
}
ByteArrayOutputStream output = new ByteArrayOutputStream();
ContentStreamWriter writer = new ContentStreamWriter(output);
float fontSize = calculateFontSize(pdFont, appearanceStream.getBoundingBox(), tokens, null);
boolean foundString = false;
// Don't replace the string content of the
// current appearance stream value for a choice list PDFBOX-2249
// and if the comb flag is set PDFBOX-91