protected internal void FlatFields()
{
if (append)
throw new ArgumentException(MessageLocalization.GetComposedMessage("field.flattening.is.not.supported.in.append.mode"));
AcroFields af = AcroFields;
IDictionary<string,AcroFields.Item> fields = acroFields.Fields;
if (fieldsAdded && partialFlattening.Count == 0) {
foreach (string obf in fields.Keys) {
partialFlattening[obf] = null;
}
}
PdfDictionary acroForm = reader.Catalog.GetAsDict(PdfName.ACROFORM);
PdfArray acroFds = null;
if (acroForm != null) {
acroFds = (PdfArray)PdfReader.GetPdfObject(acroForm.Get(PdfName.FIELDS), acroForm);
}
foreach (KeyValuePair<string,AcroFields.Item> entry in fields) {
String name = entry.Key;
if (partialFlattening.Count != 0 && !partialFlattening.ContainsKey(name))
continue;
AcroFields.Item item = entry.Value;
for (int k = 0; k < item.Size; ++k) {
PdfDictionary merged = item.GetMerged(k);
PdfNumber ff = merged.GetAsNumber(PdfName.F);
int flags = 0;
if (ff != null)
flags = ff.IntValue;
int page = item.GetPage(k);
PdfDictionary appDic = merged.GetAsDict(PdfName.AP);
if (appDic != null && (flags & PdfFormField.FLAGS_PRINT) != 0 && (flags & PdfFormField.FLAGS_HIDDEN) == 0) {
PdfObject obj = appDic.Get(PdfName.N);
PdfAppearance app = null;
if (obj != null) {
PdfObject objReal = PdfReader.GetPdfObject(obj);
if (obj is PdfIndirectReference && !obj.IsIndirect())
app = new PdfAppearance((PdfIndirectReference)obj);
else if (objReal is PdfStream) {
((PdfDictionary)objReal).Put(PdfName.SUBTYPE, PdfName.FORM);
app = new PdfAppearance((PdfIndirectReference)obj);
}
else {
if (objReal != null && objReal.IsDictionary()) {
PdfName as_p = merged.GetAsName(PdfName.AS);
if (as_p != null) {
PdfIndirectReference iref = (PdfIndirectReference)((PdfDictionary)objReal).Get(as_p);
if (iref != null) {
app = new PdfAppearance(iref);
if (iref.IsIndirect()) {
objReal = PdfReader.GetPdfObject(iref);
((PdfDictionary)objReal).Put(PdfName.SUBTYPE, PdfName.FORM);
}
}
}
}
}
}
if (app != null) {
Rectangle box = PdfReader.GetNormalizedRectangle(merged.GetAsArray(PdfName.RECT));
PdfContentByte cb = GetOverContent(page);
cb.SetLiteral("Q ");
cb.AddTemplate(app, box.Left, box.Bottom);
cb.SetLiteral("q ");
}
}
if (partialFlattening.Count == 0)
continue;
PdfDictionary pageDic = reader.GetPageN(page);
PdfArray annots = pageDic.GetAsArray(PdfName.ANNOTS);
if (annots == null)
continue;
for (int idx = 0; idx < annots.Size; ++idx) {
PdfObject ran = annots[idx];
if (!ran.IsIndirect())
continue;
PdfObject ran2 = item.GetWidgetRef(k);
if (!ran2.IsIndirect())
continue;
if (((PRIndirectReference)ran).Number == ((PRIndirectReference)ran2).Number) {
annots.Remove(idx--);
PRIndirectReference wdref = (PRIndirectReference)ran2;
while (true) {
PdfDictionary wd = (PdfDictionary)PdfReader.GetPdfObject(wdref);
PRIndirectReference parentRef = (PRIndirectReference)wd.Get(PdfName.PARENT);
PdfReader.KillIndirect(wdref);
if (parentRef == null) { // reached AcroForm
for (int fr = 0; fr < acroFds.Size; ++fr) {
PdfObject h = acroFds[fr];
if (h.IsIndirect() && ((PRIndirectReference)h).Number == wdref.Number) {
acroFds.Remove(fr);
--fr;
}
}
break;
}
PdfDictionary parent = (PdfDictionary)PdfReader.GetPdfObject(parentRef);
PdfArray kids = parent.GetAsArray(PdfName.KIDS);
for (int fr = 0; fr < kids.Size; ++fr) {
PdfObject h = kids[fr];
if (h.IsIndirect() && ((PRIndirectReference)h).Number == wdref.Number) {
kids.Remove(fr);
--fr;
}
}
if (!kids.IsEmpty())
break;
wdref = parentRef;
}
}
}
if (annots.IsEmpty()) {
PdfReader.KillIndirect(pageDic.Get(PdfName.ANNOTS));
pageDic.Remove(PdfName.ANNOTS);
}
}
}
if (!fieldsAdded && partialFlattening.Count == 0) {
for (int page = 1; page <= reader.NumberOfPages; ++page) {
PdfDictionary pageDic = reader.GetPageN(page);
PdfArray annots = pageDic.GetAsArray(PdfName.ANNOTS);
if (annots == null)
continue;
for (int idx = 0; idx < annots.Size; ++idx) {
PdfObject annoto = annots.GetDirectObject(idx);
if ((annoto is PdfIndirectReference) && !annoto.IsIndirect())
continue;
if (!annoto.IsDictionary() || PdfName.WIDGET.Equals(((PdfDictionary)annoto).Get(PdfName.SUBTYPE))) {
annots.Remove(idx);
--idx;
}
}
if (annots.IsEmpty()) {
PdfReader.KillIndirect(pageDic.Get(PdfName.ANNOTS));
pageDic.Remove(PdfName.ANNOTS);
}
}
EliminateAcroformObjects();
}
}