Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
                    }
                }
        }
Exemplo n.º 4
0
        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);
        }