Fill and save dynamic XFA form

The following code opens a XFA form and programmatically fills text fields, selects an item from a drop-down list and ‘clicks’ a button. It also subscribes to the Changed event of the field collection of the document. A feature of dynamic XFA forms is that it can add new content such as new table rows including new fields.

using (FileStream inFile = new FileStream("Purchase Order.pdf", FileMode.Open, FileAccess.Read))
{
  // open 
  Document document = new Document(inFile);
  document.Fields.Changed += Fields_Changed;

  // fill
  TextField textField = document.Fields["form1[0].purchaseOrder[0].header[0].txtOrderedByCompanyName[0]"] 
    as TextField;
  textField.Value = "My Company";

  DropDownListField countryField = document.Fields["form1[0].purchaseOrder[0].header[0].drpOrderedByCountry[0]"] 
    as DropDownListField;
  countryField.DropDownListValue = countryField.Options[1]; // second option ('Canada')

  DropDownListField stateField = document.Fields["form1[0].purchaseOrder[0].header[0].drpOrderedByStateProv[0]"] 
    as DropDownListField;
  stateField.DropDownListValue = stateField.Options[2]; // third option ('Manitoba')

  PushButtonField addButtonField = document.Fields["form1[0].purchaseOrder[0].details[0].detailHeader1[0].Button1[0]"] 
    as PushButtonField;
  addButtonField.XfaInfo.ClickActions.Execute(); // invoke the buttons click action

  // note that after clicking the 'Add Item' button, 6 new fields were added to the collection
  DropDownListField partNoDropDown = document.Fields["form1[0].purchaseOrder[0].details[0].detail[3].txtPartNum[0]"] 
    as DropDownListField;
  partNoDropDown.DropDownListValue = partNoDropDown.Options[1]; // second option 
                                                                // Decription fields value changes to 'Electric Fuel Pump'

  // write the target document to disk
  using (FileStream outFile = new FileStream("Purchase Order Filled.pdf", FileMode.Create, FileAccess.Write))
  {
    document.Write(outFile);
  }
}

private static void Fields_Changed(FieldCollection sender, FieldsChangedEventArgs e)
{
  // note that after invoking the 'Add Item' buttons Click action, 6 new fields were added to the collection
  System.Diagnostics.Debug.Assert(e.Added.Length == 6);
}