The support for XFDF merge/extract (doc.FDFExtract(PDFDoc.ExtractFlag.e_annots_only), SaveAsXFDF()) was recently added as part of PDFNet v.5.8.2). For an example of how to use API please see the attached (updated) FDF sample project:
/// PDFNet includes full support for FDF (Forms Data Format) and for merging/extracting annotation and
/// forms data (FDF, XFDF) with/from PDF. This sample illustrates basic FDF merge/extract functionality
/// available in PDFNet.
static void Main(string[] args)
{
PDFNet.Initialize();
// Relative path to the folder containing test files.
string input_path = "../../../../TestFiles/";
string output_path = "../../../../TestFiles/Output/";
// Example 1)
// Iterate over all form fields in the document. Display all field names.
try
{
PDFDoc doc = new PDFDoc(input_path + "form1.pdf");
doc.InitSecurityHandler();
FieldIterator itr;
for(itr=doc.GetFieldIterator(); itr.HasNext(); itr.Next())
{
Console.WriteLine("Field name: {0:s}", itr.Current().GetName());
Console.WriteLine("Field partial name: {0:s}", itr.Current().GetPartialName());
Console.Write("Field type: ");
Field.Type type = itr.Current().GetType();
switch(type)
{
case Field.Type.e_button:
Console.WriteLine("Button"); break;
case Field.Type.e_text:
Console.WriteLine("Text"); break;
case Field.Type.e_choice:
Console.WriteLine("Choice"); break;
case Field.Type.e_signature:
Console.WriteLine("Signature"); break;
}
Console.WriteLine("------------------------------");
}
doc.Close();
Console.WriteLine("Done.");
}
catch (PDFNetException e)
{
Console.WriteLine(e.Message);
}
// Example 2) Import XFDF into FDF, then merge data from FDF into PDF
try
{
// XFDF to FDF
// form fields
Console.WriteLine("Import form field data from XFDF to FDF.");
FDFDoc fdf_doc1 = new FDFDoc(FDFDoc.CreateFromXFDF(input_path + "form1_data.xfdf"));
fdf_doc1.Save(output_path + "form1_data.fdf");
// annotations
Console.WriteLine("Import annotations from XFDF to FDF.");
FDFDoc fdf_doc2 = new FDFDoc(FDFDoc.CreateFromXFDF(input_path + "form1_annots.xfdf"));
fdf_doc2.Save(output_path + "form1_annots.fdf");
// FDF to PDF
// form fields
Console.WriteLine("Merge form field data from FDF.");
PDFDoc doc = new PDFDoc(input_path + "form1.pdf");
doc.InitSecurityHandler();
doc.FDFMerge(fdf_doc1);
// To use PDFNet form field appearance generation instead of relying on
// Acrobat, uncomment the following two lines:
// doc.RefreshFieldAppearances();
// doc.GetAcroForm().Put("NeedAppearances", Obj.CreateBool(false));
doc.Save(output_path + "form1_filled.pdf", SDFDoc.SaveOptions.e_linearized);
// annotations
Console.WriteLine("Merge annotations from FDF.");
doc.FDFMerge(fdf_doc2);
doc.Save(output_path + "form1_filled_with_annots.pdf", SDFDoc.SaveOptions.e_linearized);
doc.Close();
Console.WriteLine("Done.");
}
catch (PDFNetException e)
{
Console.WriteLine(e.Message);
}
// Example 3) Extract data from PDF to FDF, then export FDF as XFDF
try
{
// PDF to FDF
PDFDoc in_doc = new PDFDoc(output_path + "form1_filled_with_annots.pdf");
in_doc.InitSecurityHandler();
// form fields only
Console.WriteLine("Extract form fields data to FDF.");
FDFDoc doc_fields = in_doc.FDFExtract(PDFDoc.ExtractFlag.e_forms_only);
doc_fields.SetPdfFileName("../form1_filled_with_annots.pdf");
doc_fields.Save(output_path + "form1_filled_data.fdf");
// annotations only
Console.WriteLine("Extract annotations to FDF.");
FDFDoc doc_annots = in_doc.FDFExtract(PDFDoc.ExtractFlag.e_annots_only);
doc_annots.SetPdfFileName("../form1_filled_with_annots.pdf");
doc_annots.Save(output_path + "form1_filled_annot.fdf");
// both form fields and annotations
Console.WriteLine("Extract both form fields and annotations to FDF.");
FDFDoc doc_both = in_doc.FDFExtract(PDFDoc.ExtractFlag.e_both);
doc_both.SetPdfFileName("../form1_filled_with_annots.pdf");
doc_both.Save(output_path + "form1_filled_both.fdf");
// FDF to XFDF
// form fields
Console.WriteLine("Export form field data from FDF to XFDF.");
doc_fields.SaveAsXFDF(output_path + "form1_filled_data.xfdf");
// annotations
Console.WriteLine("Export annotations from FDF to XFDF.");
doc_annots.SaveAsXFDF(output_path + "form1_filled_annot.xfdf");
// both form fields and annotations
Console.WriteLine("Export both form fields and annotations from FDF to XFDF.");
doc_both.SaveAsXFDF(output_path + "form1_filled_both.xfdf");
in_doc.Close();
Console.WriteLine("Done.");
}
catch (PDFNetException e)
{
Console.WriteLine(e.Message);
}
// Example 4) Read FDF files directly
try
{
FDFDoc doc = new FDFDoc(output_path + "form1_filled_data.fdf");
FDFFieldIterator itr = doc.GetFieldIterator();
for(; itr.HasNext(); itr.Next())
{
Console.WriteLine("Field name: {0:s}", itr.Current().GetName());
Console.WriteLine("Field partial name: {0:s}", itr.Current().GetPartialName());
Console.WriteLine("------------------------------");
}
Console.WriteLine("Done.");
}
catch (PDFNetException e)
{
Console.WriteLine(e.Message);
}
// Example 5) Direct generation of FDF.
try
{
FDFDoc doc = new FDFDoc();
// Create new fields (i.e. key/value pairs).
doc.FieldCreate("Company", (int)Field.Type.e_text, "PDFTron Systems");
doc.FieldCreate("First Name", (int)Field.Type.e_text, "John");
doc.FieldCreate("Last Name", (int)Field.Type.e_text, "Doe");
// ...
// doc.SetPdfFileName("mydoc.pdf");
doc.Save(output_path + "fdf_sample_output.fdf");
Console.WriteLine("Done. Results saved in fdf_sample_output.fdf");
}
catch (PDFNetException e)
{
Console.WriteLine(e.Message);
}
PDFNet.Terminate();
}
http://www.pdftron.com/ID-f94ls2-edm0aqZ/PDFNet.zip
http://www.pdftron.com/ID-f94ls2-edm0aqZ/PDFNet64.zip
http://www.pdftron.com/ID-f94ls2-edm0aqZ/PDFNetDotNet4.zip
http://www.pdftron.com/ID-f94ls2-edm0aqZ/PDFNet64DotNet4.zip