internal void MergeField(String name, AcroFields.Item item) { Dictionary<string,object> map = fieldTree; StringTokenizer tk = new StringTokenizer(name, "."); if (!tk.HasMoreTokens()) return; while (true) { String s = tk.NextToken(); Object obj; map.TryGetValue(s, out obj); if (tk.HasMoreTokens()) { if (obj == null) { obj = new Dictionary<string,object>(); map[s] = obj; map = (Dictionary<string,object>)obj; continue; } else if (obj is Dictionary<string,object>) map = (Dictionary<string,object>)obj; else return; } else { if (obj is Dictionary<string,object>) 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)); } List<object> list = new List<object>(); list.Add(field); CreateWidgets(list, item); map[s] = list; } else { List<object> list = (List<object>)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 MergeField(String name, AcroFields.Item item) { Dictionary<String, Object> map = fieldTree; StringTokenizer tk = new StringTokenizer(name, "."); if (!tk.HasMoreTokens()) return; while (true) { String s = tk.NextToken(); Object obj; map.TryGetValue(s, out obj); if (tk.HasMoreTokens()) { if (obj == null) { obj = new Dictionary<String, Object>(); map[s] = obj; map = (Dictionary<String, Object>)obj; } else if (obj is Dictionary<String, Object>) { map = (Dictionary<String, Object>) obj; } else { return; } } else { if (obj is Dictionary<String, Object>) return; PdfDictionary merged = item.GetMerged(0); // if a field with this name already exists, we try to rename it // so a new field will be created. if (obj != null) { s = RenameField(obj, map, merged); } // generate a new field PdfDictionary field = new PdfDictionary(); if (PdfName.SIG.Equals(merged.Get(PdfName.FT))) hasSignature = true; foreach (PdfName key in merged.Keys) { if(fieldKeys.Contains(key)) field.Put(key, merged.Get(key)); } List<Object> list = new List<Object>(); list.Add(field); CreateWidgets(list, item); map[s] = list; return; } } }
internal void CreateWidgets(List<Object> 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); } }
private void CreateWidgets(List<Object> 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 (Object element in merged.Keys) { PdfName key = (PdfName)element; if (PdfCopyFieldsImp.widgetKeys.ContainsKey(key) || annotId.Equals(key) || PdfName.TYPE.Equals(key)) widget.Put(key, merged.Get(key)); } widget.Put(PdfCopyFieldsImp.iTextTag, new PdfNumber(item.GetTabOrder(k) + 1)); list.Add(widget); } }