internal void MergeField(String name, AcroFields.Item item)
 {
     Hashtable map = fieldTree;
     StringTokenizer tk = new StringTokenizer(name, ".");
     if (!tk.HasMoreTokens())
         return;
     while (true) {
         String s = tk.NextToken();
         Object obj = map[s];
         if (tk.HasMoreTokens()) {
             if (obj == null) {
                 obj = new Hashtable();
                 map[s] =  obj;
                 map = (Hashtable)obj;
                 continue;
             }
             else if (obj is Hashtable)
                 map = (Hashtable)obj;
             else
                 return;
         }
         else {
             if (obj is Hashtable)
                 return;
             PdfDictionary merged = item.GetMerged(0);
             if (obj == null) {
                 PdfDictionary field = new PdfDictionary();
                 if (PdfName.SIG.Equals(merged.Get(PdfName.FT)))
                     hasSignature = true;
                 foreach (PdfName key in merged.Keys) {
                     if (fieldKeys.ContainsKey(key))
                         field.Put(key, merged.Get(key));
                 }
                 ArrayList list = new ArrayList();
                 list.Add(field);
                 CreateWidgets(list, item);
                 map[s] =  list;
             }
             else {
                 ArrayList list = (ArrayList)obj;
                 PdfDictionary field = (PdfDictionary)list[0];
                 PdfName type1 = (PdfName)field.Get(PdfName.FT);
                 PdfName type2 = (PdfName)merged.Get(PdfName.FT);
                 if (type1 == null || !type1.Equals(type2))
                     return;
                 int flag1 = 0;
                 PdfObject f1 = field.Get(PdfName.FF);
                 if (f1 != null && f1.IsNumber())
                     flag1 = ((PdfNumber)f1).IntValue;
                 int flag2 = 0;
                 PdfObject f2 = merged.Get(PdfName.FF);
                 if (f2 != null && f2.IsNumber())
                     flag2 = ((PdfNumber)f2).IntValue;
                 if (type1.Equals(PdfName.BTN)) {
                     if (((flag1 ^ flag2) & PdfFormField.FF_PUSHBUTTON) != 0)
                         return;
                     if ((flag1 & PdfFormField.FF_PUSHBUTTON) == 0 && ((flag1 ^ flag2) & PdfFormField.FF_RADIO) != 0)
                         return;
                 }
                 else if (type1.Equals(PdfName.CH)) {
                     if (((flag1 ^ flag2) & PdfFormField.FF_COMBO) != 0)
                         return;
                 }
                 CreateWidgets(list, item);
             }
             return;
         }
     }
 }
 internal void CreateWidgets(ArrayList list, AcroFields.Item item)
 {
     for (int k = 0; k < item.Size; ++k) {
         list.Add(item.GetPage(k));
         PdfDictionary merged = item.GetMerged(k);
         PdfObject dr = merged.Get(PdfName.DR);
         if (dr != null)
             PdfFormField.MergeResources(resources, (PdfDictionary)PdfReader.GetPdfObject(dr));
         PdfDictionary widget = new PdfDictionary();
         foreach (PdfName key in merged.Keys) {
             if (widgetKeys.ContainsKey(key))
                 widget.Put(key, merged.Get(key));
         }
         widget.Put(iTextTag, new PdfNumber(item.GetTabOrder(k) + 1));
         list.Add(widget);
     }
 }