/// <summary> /// Searches for a field in a given page and returns the concatenated results. /// </summary> /// <param name="response">the responsed from the forms recognizer service.</param> /// <param name="fieldName">The field to search for</param> /// <param name="pageNumber">The page where the field should appear</param> /// <returns></returns> private static string GetField(FormsRecognizerResponse response, string fieldName, int pageNumber) { // Find the Address in Page 0 if (response.pages != null) { //Assume that a given field is in the first page. if (response.pages[pageNumber] != null) { foreach (var pair in response.pages[pageNumber].KeyValuePairs) { foreach (var key in pair.Key) { /// You may want to have a different comparer here /// depending on your needs. if (key.Text.Contains(fieldName)) { // then concatenate the result; StringBuilder sb = new StringBuilder(); foreach (var value in pair.Value) { sb.Append(value.Text); // You could replace this for a newline depending on your scenario. sb.Append(" "); } return(sb.ToString()); } } } } } // Could not find it in that page. return(null); }
private static Dictionary <string, string> GetKeyValuePairs(FormsRecognizerResponse response, Dictionary <string, string> formEntities, string entityTable, string storageConnectionString, string sourceFile, string page, string formType) { // Analyze the results if (response.analyzeResult != null) { int entityIndex = 0; var duplicatePair = new ListWithDuplicates(); if (response.analyzeResult.documentResults != null) { // Custom model with supervised training stores data in "DocumentResults" foreach (var docResult in response.analyzeResult.documentResults) { //foreach (var pair in response.pages[0].KeyValuePairs) foreach (var pair in docResult.fields) { var formKey = pair.Key; if (formKey.Contains("Token")) { continue; } // then concatenate the result; StringBuilder sb = new StringBuilder(); sb.Append(pair.Value.text); // Get keys List <string> allKeys = (from kvp in duplicatePair select kvp.Key).ToList(); var formKeyNew = formKey; // Count the # of keys for current Key pair if (allKeys.Contains(formKey, StringComparer.OrdinalIgnoreCase)) { List <string> allValues = (from kvp in duplicatePair where kvp.Key.ToUpper() == formKey.ToUpper() select kvp.Value).ToList(); var count = allValues.Count(); if (count > 0) { formKeyNew = formKey + (count).ToString(); } } duplicatePair.Add(formKey, sb.ToString()); CreateTableEntity(entityTable, storageConnectionString, sourceFile, entityIndex, formKeyNew, sb.ToString(), string.Concat("Page", page), formType); entityIndex++; formEntities.Add(formKeyNew, sb.ToString()); } } } // Process each tables and Key-value pair - Results from unsupervised training if (response.analyzeResult.pageResults != null) { foreach (var pages in response.analyzeResult.pageResults) { var pageNumber = pages.page; int iTable = 0; // Process KV Pairs if (pages.keyValuePairs != null) { foreach (var kvPair in pages.keyValuePairs) { var formKey = kvPair.key.text. Replace(":", "").Replace(" ", "_").Replace("-", "_") .Replace("'", "").Replace("(", "").Replace(")", "") .Replace(",", "").Replace("/", "_").Replace("\\", "_").Trim(); if (formKey.Contains("Token")) { continue; } // then concatenate the result; StringBuilder sb = new StringBuilder(); sb.Append(kvPair.value.text); // Get keys List <string> allKeys = (from kvp in duplicatePair select kvp.Key).ToList(); var formKeyNew = formKey; // Count the # of keys for current Key pair if (allKeys.Contains(formKey, StringComparer.OrdinalIgnoreCase)) { List <string> allValues = (from kvp in duplicatePair where kvp.Key.ToUpper() == formKey.ToUpper() select kvp.Value).ToList(); var count = allValues.Count(); if (count > 0) { formKeyNew = formKey + (count).ToString(); } } duplicatePair.Add(formKey, sb.ToString()); CreateTableEntity(entityTable, storageConnectionString, sourceFile, entityIndex, formKeyNew, sb.ToString(), string.Concat("Page", page), formType); entityIndex++; formEntities.Add(formKeyNew, sb.ToString()); } } // Process Tables if (pages.tables != null) { foreach (var table in pages.tables) { iTable++; var totalRows = table.rows; var totalColumns = table.columns; for (int r = 0; r < totalRows; r++) { var cells = table.cells.Where(c => c.rowIndex == r).OrderBy(c => c.columnIndex); StringBuilder sb = new StringBuilder(); if (r == 0) { var formKey = string.Concat("Table", iTable, "Header"); foreach (var colummn in cells) { sb.Append(colummn.text); sb.Append(","); } duplicatePair.Add(formKey, sb.ToString()); CreateTableEntity(entityTable, storageConnectionString, sourceFile, entityIndex, formKey, sb.ToString(), string.Concat("Page", page), formType); entityIndex++; formEntities.Add(formKey, sb.ToString()); } else { var formKey = string.Concat("Table", iTable, "Row", r); foreach (var colummn in cells) { sb.Append(colummn.text); sb.Append(","); } duplicatePair.Add(formKey, sb.ToString()); CreateTableEntity(entityTable, storageConnectionString, sourceFile, entityIndex, formKey, sb.ToString(), string.Concat("Page", page), formType); entityIndex++; formEntities.Add(formKey, sb.ToString()); } } } } } } } // Could not find it in that page. return(formEntities); }
private static async Task <Dictionary <string, string> > AnalyzeForm(string modelId, string endPoint, string subscriptionKey, Stream myBlob, Dictionary <string, string> formEntities, string entityTable, string storageConnectionString, string sourceFile, string page, string formType, string folder, string sourceContainer) { var outputRecord = new OutputRecord.OutputRecordData { FormEntitiesv2 = new Dictionary <string, string>() }; byte[] bytes = null; bytes = ReadFully(myBlob); using (var client = new HttpClient()) using (var request = new HttpRequestMessage()) { endPoint = endPoint.Replace("ModelId", modelId); request.Method = HttpMethod.Post; request.RequestUri = new Uri(endPoint); request.Content = new ByteArrayContent(bytes); request.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); request.Headers.Add("Ocp-Apim-Subscription-Key", subscriptionKey); var frResult = new FormsRecognizerResponse() { status = "Running" }; var response = await client.SendAsync(request); var responseBody = await response.Content.ReadAsStringAsync(); var result = string.Empty; if (response.StatusCode == System.Net.HttpStatusCode.Accepted) { var operationLocation = response.Headers.GetValues("Operation-Location").FirstOrDefault(); if (!string.IsNullOrEmpty(operationLocation)) { var clientGet = new HttpClient(); clientGet.DefaultRequestHeaders.Add( "Ocp-Apim-Subscription-Key", subscriptionKey); while (frResult.status.Trim().ToLower() != "succeeded" && frResult.status.Trim().ToLower() != "failed") { Thread.Sleep(1000); var httpGetResult = clientGet.GetAsync(operationLocation).Result; result = httpGetResult.Content.ReadAsStringAsync().Result; frResult = JsonConvert.DeserializeObject <FormsRecognizerResponse>(result); } if (frResult.status.Trim().ToLower() == "failed") { return(formEntities); } } // Save the returned Json to Blob var storageAccount = CreateStorageAccountFromConnectionString(storageConnectionString); var jsonFile = sourceFile.Replace(".jpg", ".json"); var blob = GetBlobReference(folder + jsonFile, sourceContainer, storageConnectionString); blob.UploadTextAsync(result).Wait(); GetKeyValuePairs(frResult, formEntities, entityTable, storageConnectionString, sourceFile, page, formType); formEntities.Add("IsProcessed", "false"); return(formEntities); } else { throw new SystemException(response.StatusCode.ToString() + ": " + response.ToString() + "\n " + responseBody); } } }
private static Dictionary <string, string> GetKeyValuePairs(FormsRecognizerResponse response, Dictionary <string, string> formEntities, string entityTable, string storageConnectionString, string sourceFile, string page, string formType) { // Find the Address in Page 0 if (response.pages != null) { //Assume that a given field is in the first page. if (response.pages[0] != null) { var duplicatePair = new ListWithDuplicates(); int entityIndex = 0; //foreach (var pair in response.pages[0].KeyValuePairs) foreach (var pair in response.pages.FirstOrDefault().keyValuePairs) { foreach (var key in pair.key) { var formKey = key.text. Replace(":", "").Replace(" ", "_").Replace("-", "_") .Replace("'", "").Replace("(", "").Replace(")", "") .Replace(",", "").Replace("/", "_").Replace("\\", "_").Trim(); if (formKey.Contains("Token")) { continue; } // then concatenate the result; StringBuilder sb = new StringBuilder(); foreach (var value in pair.value) { sb.Append(value.text); // You could replace this for a newline depending on your scenario. sb.Append(" "); } // Get keys List <string> allKeys = (from kvp in duplicatePair select kvp.Key).ToList(); var formKeyNew = formKey; // Count the # of keys for current Key pair if (allKeys.Contains(formKey, StringComparer.OrdinalIgnoreCase)) { List <string> allValues = (from kvp in duplicatePair where kvp.Key.ToUpper() == formKey.ToUpper() select kvp.Value).ToList(); var count = allValues.Count(); if (count > 0) { formKeyNew = formKey + (count).ToString(); } } duplicatePair.Add(formKey, sb.ToString()); CreateTableEntity(entityTable, storageConnectionString, sourceFile, entityIndex, formKeyNew, sb.ToString(), string.Concat("Page", page), formType); entityIndex++; formEntities.Add(formKeyNew, sb.ToString()); } } // Process each tables foreach (var table in response.pages.FirstOrDefault().tables) { foreach (var column in table.columns) { foreach (var hdr in column.header) { var formKey = hdr.text.Trim(); if (formKey.Contains("Token")) { continue; } // then concatenate the result; StringBuilder sb = new StringBuilder(); foreach (var value in column.entries) { for (int i = 0; i < value.Count; i++) { sb.Append(value[i].text); // You could replace this for a newline depending on your scenario. sb.Append(" "); } } // Get keys List <string> allKeys = (from kvp in duplicatePair select kvp.Key).ToList(); var formKeyNew = formKey; // Count the # of keys for current Key pair if (allKeys.Contains(formKey, StringComparer.OrdinalIgnoreCase)) { List <string> allValues = (from kvp in duplicatePair where kvp.Key.ToUpper() == formKey.ToUpper() select kvp.Value).ToList(); var count = allValues.Count(); if (count > 0) { formKeyNew = formKey + (count).ToString(); } } duplicatePair.Add(formKey, sb.ToString()); CreateTableEntity(entityTable, storageConnectionString, sourceFile, entityIndex, formKeyNew, sb.ToString(), string.Concat("Page", page), formType); entityIndex++; formEntities.Add(formKeyNew, sb.ToString()); } } } } } // Could not find it in that page. return(formEntities); }