public FileAttachment GenerateCustomPrepopulatedForm(string formCode, IFormContentProvider prePop)
        {
            string fileName;

            byte[] bytes;
            GeneratePrePopulatedForm(formCode, out fileName, out bytes);
            bytes = SetFields(bytes, prePop);
            return(new FileAttachment(bytes, fileName, FormDefinition.pdfMimeType)
            {
                DispositionType = "inline"
            });
        }
        public static byte[] SetFields(byte[] pdfFile, IFormContentProvider contentProvider)
        {
            var        pr   = new PdfReader(pdfFile);
            var        ims  = new MemoryStream();
            var        ps   = new PdfStamper(pr, ims);
            AcroFields flds = ps.AcroFields;

            foreach (DictionaryEntry entry in flds.Fields)
            {
                string fieldName = entry.Key.ToString();
                var    type      = (FieldTypes)flds.GetFieldType(fieldName);
                switch (type)
                {
                case FieldTypes.Text:
                    string value   = null;
                    string display = null;
                    contentProvider.PopulateTextField(fieldName, out value, out display);
                    if (value != null)
                    {
                        flds.SetField(fieldName, value);
                    }
                    break;

                case FieldTypes.List:
                    string[] exportValues  = null;
                    string[] displayValues = null;
                    string[] selected      = null;
                    contentProvider.PopulateListField(fieldName, out exportValues, out displayValues, out selected);
                    if (exportValues != null)
                    {
                        flds.SetListOption(fieldName, exportValues, displayValues);
                    }
                    if (selected != null)
                    {
                        flds.SetListSelection(fieldName, selected);
                    }
                    break;

                default:
                    break;
                }
            }
            ps.Close();
            return(ims.ToArray());
        }
        private void GeneratePrePopulatedForm(string formCode, out string fileName, out byte[] bytes)
        {
            var formDef = FormRepository.FindFormDefinitionByCode(formCode);

            if (formDef == null)
            {
                throw new DomainException("No Form Definition exists for code: " + formCode);
            }
            fileName = formDef.FileName;
            bytes    = formDef.FormContent;
            if (bytes == null)
            {
                throw new DomainException("Form Definition has no file content");
            }
            if (formDef.PrePopulator != null)
            {
                IFormContentProvider prepop = (IFormContentProvider)Container.NewTransientInstance(formDef.PrePopulatorType());
                bytes = SetFields(bytes, prepop);
            }
        }