public bool SetFieldProperty(String field, String name, Object value, int[] inst) {
if (writer == null)
throw new Exception("This AcroFields instance is read-only.");
Item item = (Item)fields[field];
if (item == null)
return false;
InstHit hit = new InstHit(inst);
PdfDictionary merged;
PdfString da;
if (Util.EqualsIgnoreCase(name, "textfont")) {
for (int k = 0; k < item.Size; ++k) {
if (hit.IsHit(k)) {
merged = item.GetMerged( k );
da = merged.GetAsString(PdfName.DA);
PdfDictionary dr = merged.GetAsDict(PdfName.DR);
if (da != null && dr != null) {
Object[] dao = SplitDAelements(da.ToUnicodeString());
PdfAppearance cb = new PdfAppearance();
if (dao[DA_FONT] != null) {
BaseFont bf = (BaseFont)value;
PdfName psn = (PdfName)PdfAppearance.stdFieldFontNames[bf.PostscriptFontName];
if (psn == null) {
psn = new PdfName(bf.PostscriptFontName);
}
PdfDictionary fonts = dr.GetAsDict(PdfName.FONT);
if (fonts == null) {
fonts = new PdfDictionary();
dr.Put(PdfName.FONT, fonts);
}
PdfIndirectReference fref = (PdfIndirectReference)fonts.Get(psn);
PdfDictionary top = reader.Catalog.GetAsDict(PdfName.ACROFORM);
MarkUsed(top);
dr = top.GetAsDict(PdfName.DR);
if (dr == null) {
dr = new PdfDictionary();
top.Put(PdfName.DR, dr);
}
MarkUsed(dr);
PdfDictionary fontsTop = dr.GetAsDict(PdfName.FONT);
if (fontsTop == null) {
fontsTop = new PdfDictionary();
dr.Put(PdfName.FONT, fontsTop);
}
MarkUsed(fontsTop);
PdfIndirectReference frefTop = (PdfIndirectReference)fontsTop.Get(psn);
if (frefTop != null) {
if (fref == null)
fonts.Put(psn, frefTop);
}
else if (fref == null) {
FontDetails fd;
if (bf.FontType == BaseFont.FONT_TYPE_DOCUMENT) {
fd = new FontDetails(null, ((DocumentFont)bf).IndirectReference, bf);
}
else {
bf.Subset = false;
fd = writer.AddSimple(bf);
localFonts[psn.ToString().Substring(1)] = bf;
}
fontsTop.Put(psn, fd.IndirectReference);
fonts.Put(psn, fd.IndirectReference);
}
ByteBuffer buf = cb.InternalBuffer;
buf.Append(psn.GetBytes()).Append(' ').Append((float)dao[DA_SIZE]).Append(" Tf ");
if (dao[DA_COLOR] != null)
cb.SetColorFill((Color)dao[DA_COLOR]);
PdfString s = new PdfString(cb.ToString());
item.GetMerged(k).Put(PdfName.DA, s);
item.GetWidget(k).Put(PdfName.DA, s);
MarkUsed(item.GetWidget(k));
}
}
}
}
}
else if (Util.EqualsIgnoreCase(name, "textcolor")) {
for (int k = 0; k < item.Size; ++k) {
if (hit.IsHit(k)) {
merged = item.GetMerged( k );
da = merged.GetAsString(PdfName.DA);
if (da != null) {
Object[] dao = SplitDAelements(da.ToUnicodeString());
PdfAppearance cb = new PdfAppearance();
if (dao[DA_FONT] != null) {
ByteBuffer buf = cb.InternalBuffer;
buf.Append(new PdfName((String)dao[DA_FONT]).GetBytes()).Append(' ').Append((float)dao[DA_SIZE]).Append(" Tf ");
cb.SetColorFill((Color)value);
PdfString s = new PdfString(cb.ToString());
item.GetMerged(k).Put(PdfName.DA, s);
item.GetWidget(k).Put(PdfName.DA, s);
MarkUsed(item.GetWidget(k));
}
}
}
}
}
else if (Util.EqualsIgnoreCase(name, "textsize")) {
for (int k = 0; k < item.Size; ++k) {
if (hit.IsHit(k)) {
merged = item.GetMerged( k );
da = merged.GetAsString(PdfName.DA);
if (da != null) {
Object[] dao = SplitDAelements(da.ToUnicodeString());
PdfAppearance cb = new PdfAppearance();
if (dao[DA_FONT] != null) {
ByteBuffer buf = cb.InternalBuffer;
buf.Append(new PdfName((String)dao[DA_FONT]).GetBytes()).Append(' ').Append((float)value).Append(" Tf ");
if (dao[DA_COLOR] != null)
cb.SetColorFill((Color)dao[DA_COLOR]);
PdfString s = new PdfString(cb.ToString());
item.GetMerged(k).Put(PdfName.DA, s);
item.GetWidget(k).Put(PdfName.DA, s);
MarkUsed(item.GetWidget(k));
}
}
}
}
}
else if (Util.EqualsIgnoreCase(name, "bgcolor") || Util.EqualsIgnoreCase(name, "bordercolor")) {
PdfName dname = (Util.EqualsIgnoreCase(name, "bgcolor") ? PdfName.BG : PdfName.BC);
for (int k = 0; k < item.Size; ++k) {
if (hit.IsHit(k)) {
merged = item.GetMerged( k );
PdfDictionary mk = merged.GetAsDict(PdfName.MK);
if (mk == null) {
if (value == null)
return true;
mk = new PdfDictionary();
item.GetMerged(k).Put(PdfName.MK, mk);
item.GetWidget(k).Put(PdfName.MK, mk);
MarkUsed(item.GetWidget(k));
} else {
MarkUsed( mk );
}
if (value == null)
mk.Remove(dname);
else
mk.Put(dname, PdfFormField.GetMKColor((Color)value));
}
}
}
else
return false;
return true;
}