This HTML page is not optimized for LLM or AI agent consumption. Fetch the Markdown version instead: /guides/document-converter/document-converter-services/knowledge-base/sample-code-for-kvp-extraction.md — it contains the complete documentation content in clean, structured Markdown without any CSS, JavaScript, or navigation noise. Do you have sample code for KVP Extraction functionality?

Document Converter Services version 11.0 features a key-value pair (KVP) extraction engine. The sample code below shows how the engine is set up to extract the invoice number and the grand total from a document:

static void Main(string[] args)
{
string expectedKeys =
@"[
{
'expectedKey': 'grand total',
'synonyms': ['total']
},
{
'expectedKey': 'invoice number',
'synonyms': ['invoice no']
}
]";
DocumentConverterServiceClient client = null;
try
{
// ** Delete any processed files from a previous run.
foreach (FileInfo f in new DirectoryInfo(".").GetFiles("*.json"))
f.Delete();
// ** Determine the source file and read it into a byte array.
string sourceFileName = null;
if (args.Length == 0)
{
// ** If nothing is specified, then read the first PDF file from the current folder.
string[] sourceFiles = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.pdf");
if (sourceFiles.Length > 0)
sourceFileName = sourceFiles[0];
else
{
Console.WriteLine("Please specify a document to extract data from.");
Console.ReadKey();
return;
}
}
else
sourceFileName = args[0];
byte[] sourceFile = File.ReadAllBytes(sourceFileName);
// ** Open the service and configure the bindings.
client = OpenService(SERVICE_URL);
//** Set the absolute minimum open options.
OpenOptions openOptions = new OpenOptions();
openOptions.OriginalFileName = Path.GetFileName(sourceFileName);
openOptions.FileExtension = Path.GetExtension(sourceFileName);
//** Set KVP settings.
KVPSettings kvpSettings = new KVPSettings();
kvpSettings.DPI = 300;
kvpSettings.KVPFormat = KVPOutputFormat.JSON;
kvpSettings.OCRLanguage = "eng";
kvpSettings.IncludePageNumber = BooleanEnum.False;
kvpSettings.IncludeType = BooleanEnum.False;
kvpSettings.IncludeKeyBoundingBox = BooleanEnum.False;
kvpSettings.IncludeValueBoundingBox = BooleanEnum.False;
if (!string.IsNullOrEmpty(expectedKeys))
{
kvpSettings.ExpectedKeys = expectedKeys;
}
// ** Carry out the operation.
byte[] result = client.ExtractKeyValuePairs(sourceFile, openOptions, kvpSettings);
if (result != null)
{
string destinationFileName = Path.GetFileNameWithoutExtension(sourceFileName) + "." + kvpSettings.KVPFormat.ToString();
using (FileStream fs = File.Create(destinationFileName))
{
fs.Write(result, 0, result.Length);
fs.Close();
}
Console.WriteLine("Result saved to " + destinationFileName);
}
else
{
Console.WriteLine("Nothing returned.");
}
}
catch (FaultException<WebServiceFaultException> ex)
{
Console.WriteLine("FaultException occurred: ExceptionType: " +
ex.Detail.ExceptionType.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
CloseService(client);
}
Console.ReadKey();
}
/// <summary>
/// Configure the bindings and endpoints and open the service using the specified address.
/// </summary>
/// <returns>An instance of the web service.</returns>
public static DocumentConverterServiceClient OpenService(string address)
{
DocumentConverterServiceClient client = null;
try
{
BasicHttpBinding binding = new BasicHttpBinding();
// ** Use standard Windows Security.
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType =
HttpClientCredentialType.Windows;
// ** Increase the client timeout to deal with (very) long running requests.
binding.SendTimeout = TimeSpan.FromMinutes(120);
binding.ReceiveTimeout = TimeSpan.FromMinutes(120);
// ** Set the maximum document size to 50MB
binding.MaxReceivedMessageSize = 50 * 1024 * 1024;
binding.ReaderQuotas.MaxArrayLength = 50 * 1024 * 1024;
binding.ReaderQuotas.MaxStringContentLength = 50 * 1024 * 1024;
// ** Specify an identity (or any identity) to get past .net3.5 sp1.
EndpointIdentity epi = EndpointIdentity.CreateUpnIdentity("unknown");
EndpointAddress epa = new EndpointAddress(new Uri(address), epi);
client = new DocumentConverterServiceClient(binding, epa);
client.Open();
return client;
}
catch (Exception)
{
CloseService(client);
throw;
}
}
/// <summary>
/// Check if the client is open and then close it.
/// </summary>
/// <param name="client">The client to close</param>
public static void CloseService(DocumentConverterServiceClient client)
{
if (client != null && client.State == CommunicationState.Opened)
client.Close();
}