/// <summary>Attempts to determine which type of field a PdfDictionary represents</summary> /// <param name="dict"></param> /// <returns></returns> public static PdfAcroFieldType DetermineFieldType(PdfDictionary dict) { if (!dict.Elements.ContainsKey(Keys.FT)) { return(PdfAcroFieldType.Unknown); } string ft = dict.Elements.GetName(Keys.FT); PdfAcroFieldFlags flags = (PdfAcroFieldFlags)dict.Elements.GetInteger(Keys.Ff); switch (ft) { case "/Btn": if ((flags & PdfAcroFieldFlags.Pushbutton) != 0) { return(PdfAcroFieldType.PushButton); } if ((flags & PdfAcroFieldFlags.Radio) != 0) { return(PdfAcroFieldType.RadioButton); } return(PdfAcroFieldType.CheckBox); case "/Tx": return(PdfAcroFieldType.Text); case "/Ch": if ((flags & PdfAcroFieldFlags.Combo) != 0) { return(PdfAcroFieldType.ComboBox); } else { return(PdfAcroFieldType.ListBox); } case "/Sig": return(PdfAcroFieldType.Signature); default: return(PdfAcroFieldType.Unknown); } }
/// <summary> /// Create a derived type like PdfTextField or PdfCheckBox if possible. /// If the actual cannot be guessed by PDFsharp the function returns an instance /// of PdfGenericField. /// </summary> PdfAcroField CreateAcroField(PdfDictionary dict) { string ft = dict.Elements.GetName(Keys.FT); PdfAcroFieldFlags flags = (PdfAcroFieldFlags)dict.Elements.GetInteger(Keys.Ff); switch (ft) { case "/Btn": if ((flags & PdfAcroFieldFlags.Pushbutton) != 0) { return(new PdfPushButtonField(dict)); } else if ((flags & PdfAcroFieldFlags.Radio) != 0) { return(new PdfRadioButtonField(dict)); } else { return(new PdfCheckBoxField(dict)); } case "/Tx": return(new PdfTextField(dict)); case "/Ch": if ((flags & PdfAcroFieldFlags.Combo) != 0) { return(new PdfComboBoxField(dict)); } else { return(new PdfListBoxField(dict)); } case "/Sig": return(new PdfSignatureField(dict)); default: return(new PdfGenericField(dict)); } }
internal static PdfAcroField CheckBoxMaybeRadioButton(PdfDictionary dict, PdfAcroFieldFlags flags) { if ((flags & PdfAcroFieldFlags.Radio) != 0) // explicitly given type { return(new PdfRadioButtonField(dict)); } if ((flags & PdfAcroFieldFlags.RadiosInUnison) != 0) // this flag is only valid for radio buttons { return(new PdfRadioButtonField(dict)); } var radio = new PdfRadioButtonField(dict); var distinctValues = new List <string>(); foreach (var val in radio.FieldValues) { if (!distinctValues.Contains(val)) { distinctValues.Add(val); } } // if the Annotations of this field have all different names, we consider this as a RadioButton if (distinctValues.Count == radio.FieldValues.Count && radio.FieldValues.Count > 1) { return(radio); } return(new PdfCheckBoxField(dict)); }