public async Task RecognizeCustomFormsFromUri() { string endpoint = TestEnvironment.Endpoint; string apiKey = TestEnvironment.ApiKey; FormRecognizerClient client = new FormRecognizerClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); string formUri = FormRecognizerTestEnvironment.CreateUri("Form_1.jpg"); string modelId = "<your model id>"; #region Snippet:FormRecognizerSample3RecognizeCustomFormsFromUri Response <IReadOnlyList <RecognizedForm> > forms = await client.StartRecognizeCustomFormsFromUri(modelId, new Uri(formUri)).WaitForCompletionAsync(); foreach (RecognizedForm form in forms.Value) { Console.WriteLine($"Form of type: {form.FormType}"); foreach (FormField field in form.Fields.Values) { Console.WriteLine($"Field '{field.Name}: "); if (field.LabelText != null) { Console.WriteLine($" Label: '{field.LabelText.Text}"); } Console.WriteLine($" Value: '{field.ValueText.Text}"); Console.WriteLine($" Confidence: '{field.Confidence}"); } } #endregion }
// </snippet_trainlabels_response> // <snippet_analyze> // Analyze PDF form data private static async Task AnalyzePdfForm( FormRecognizerClient recognizerClient, Guid modelId, string formUrl) { Response<IReadOnlyList<RecognizedForm>> forms = await recognizerClient .StartRecognizeCustomFormsFromUri(modelId.ToString(), new Uri(formUrl)) .WaitForCompletionAsync(); // </snippet_analyze> // <snippet_analyze_response> foreach (RecognizedForm form in forms.Value) { Console.WriteLine($"Form of type: {form.FormType}"); foreach (FormField field in form.Fields.Values) { Console.WriteLine($"Field '{field.Name}: "); if (field.LabelText != null) { Console.WriteLine($" Label: '{field.LabelText.Text}"); } Console.WriteLine($" Value: '{field.ValueText.Text}"); Console.WriteLine($" Confidence: '{field.Confidence}"); } } }
public override void Run(CancellationToken cancellationToken) { var op = _client.StartRecognizeCustomFormsFromUri(_modelId, CreateUri(TestFile.Form1), cancellationToken: cancellationToken); while (!op.HasCompleted) { Thread.Sleep(TimeSpan.FromSeconds(1)); op.UpdateStatus(cancellationToken); } }
public async Task RecognizeCustomFormsFromUri() { string endpoint = TestEnvironment.Endpoint; string apiKey = TestEnvironment.ApiKey; string trainingFileUrl = TestEnvironment.BlobContainerSasUrl; // Firstly, create a trained model we can use to recognize the custom form. Please note that // models can also be trained using a graphical user interface such as the Form Recognizer // Labeling Tool found here: // https://docs.microsoft.com/azure/cognitive-services/form-recognizer/quickstarts/label-tool FormTrainingClient trainingClient = new FormTrainingClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); CustomFormModel model = await trainingClient.StartTraining(new Uri(trainingFileUrl), useTrainingLabels : false).WaitForCompletionAsync(); // Proceed with the custom form recognition. FormRecognizerClient client = new FormRecognizerClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); Uri formUri = FormRecognizerTestEnvironment.CreateUri("Form_1.jpg"); string modelId = model.ModelId; #region Snippet:FormRecognizerSample3RecognizeCustomFormsFromUri //@@ string modelId = "<modelId>"; RecognizedFormCollection forms = await client.StartRecognizeCustomFormsFromUri(modelId, formUri).WaitForCompletionAsync(); foreach (RecognizedForm form in forms) { Console.WriteLine($"Form of type: {form.FormType}"); foreach (FormField field in form.Fields.Values) { Console.WriteLine($"Field '{field.Name}: "); if (field.LabelData != null) { Console.WriteLine($" Label: '{field.LabelData.Text}"); } Console.WriteLine($" Value: '{field.ValueData.Text}"); Console.WriteLine($" Confidence: '{field.Confidence}"); } } #endregion // Delete the model on completion to clean environment. trainingClient.DeleteModel(model.ModelId); }
// </snippet_trainlabels_response> // <snippet_analyze> // Analyze PDF form data private static async Task AnalyzePdfForm( FormRecognizerClient recognizerClient, String modelId, string formUrl) { RecognizedFormCollection forms = await recognizerClient .StartRecognizeCustomFormsFromUri(modelId, new Uri(formUrl)) .WaitForCompletionAsync(); // </snippet_analyze> // <snippet_analyze_response> foreach (RecognizedForm form in forms) { Console.WriteLine($"Form of type: {form.FormType}"); foreach (FormField field in form.Fields.Values) { Console.WriteLine($"Field '{field.Name}: "); if (field.LabelData != null) { Console.WriteLine($" Label: '{field.LabelData.Text}"); } Console.WriteLine($" Value: '{field.ValueData.Text}"); Console.WriteLine($" Confidence: '{field.Confidence}"); } Console.WriteLine("Table data:"); foreach (FormPage page in form.Pages) { for (int i = 0; i < page.Tables.Count; i++) { FormTable table = page.Tables[i]; Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns."); foreach (FormTableCell cell in table.Cells) { Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) contains {(cell.IsHeader ? "header" : "text")}: '{cell.Text}'"); } } } } }
// Analyze PDF form data private static async Task AnalyzePdfForm( FormRecognizerClient formClient, string modelId, string pdfFormFile) { Response <RecognizedFormCollection> forms = await formClient .StartRecognizeCustomFormsFromUri(modelId.ToString(), new Uri(pdfFormFile)) .WaitForCompletionAsync(); foreach (RecognizedForm form in forms.Value) { Console.WriteLine($"Form of type: {form.FormType}"); foreach (FormField field in form.Fields.Values) { Console.WriteLine($"Field '{field.Name}: "); if (field.LabelData != null) { Console.WriteLine($" Label: '{field.LabelData.Text}"); } Console.WriteLine($" Value: '{field.ValueData.Text}"); Console.WriteLine($" Confidence: '{field.Confidence}"); } } }
public static async Task RunAsync([EventGridTrigger] EventGridEvent eventGridEvent, ILogger log) { //Extracting content type and url of the blob triggering the function var jsondata = JsonConvert.SerializeObject(eventGridEvent.Data); var tmp = new { contentType = "", url = "" }; var data = JsonConvert.DeserializeAnonymousType(jsondata, tmp); //Checking if the trigger was iniatiated for a PDF File. if (data.contentType == "application/pdf") { var pdfUrl = data.url; string endpoint = System.Environment.GetEnvironmentVariable("FormsRecognizerEndpoint", EnvironmentVariableTarget.Process); string apiKey = System.Environment.GetEnvironmentVariable("FormsRecognizerKey", EnvironmentVariableTarget.Process); string contosoStorageConnectionString = System.Environment.GetEnvironmentVariable("ContosoStorageConnectionString", EnvironmentVariableTarget.Process); string cosmosEndpointUrl = System.Environment.GetEnvironmentVariable("CosmosDBEndpointUrl", EnvironmentVariableTarget.Process); string cosmosPrimaryKey = System.Environment.GetEnvironmentVariable("CosmosDBPrimaryKey", EnvironmentVariableTarget.Process); //Create a SAS Link to give Forms Recognizer read access to the document BlobServiceClient blobServiceClient = new BlobServiceClient(contosoStorageConnectionString); BlobContainerClient container = new BlobContainerClient(contosoStorageConnectionString, "claims"); string blobName = pdfUrl.Split('/').Last(); BlobClient blob = container.GetBlobClient(blobName); BlobSasBuilder sasBuilder = new BlobSasBuilder() { BlobContainerName = blob.GetParentBlobContainerClient().Name, BlobName = blob.Name, Resource = "b" }; sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddHours(1); sasBuilder.SetPermissions(BlobSasPermissions.Read); Uri sasUri = blob.GenerateSasUri(sasBuilder); var credential = new AzureKeyCredential(apiKey); //Get the latest trained model var formTrainingClient = new FormTrainingClient(new Uri(endpoint), credential); Pageable <CustomFormModelInfo> formsModels = formTrainingClient.GetCustomModels(); var latestModel = (from inc in formsModels orderby inc.TrainingCompletedOn descending select inc).FirstOrDefault(); //Run the document through the model var formRecognizerClient = new FormRecognizerClient(new Uri(endpoint), credential); var options = new RecognizeCustomFormsOptions() { IncludeFieldElements = true }; RecognizeCustomFormsOperation operation = formRecognizerClient.StartRecognizeCustomFormsFromUri(latestModel.ModelId, sasUri, options); Azure.Response <RecognizedFormCollection> operationResponse = await operation.WaitForCompletionAsync(); RecognizedFormCollection forms = operationResponse.Value; //Insert documents into CosmosDB var cosmosClient = new CosmosClient(cosmosEndpointUrl, cosmosPrimaryKey); var cosmosDatabase = (await cosmosClient.CreateDatabaseIfNotExistsAsync("Contoso")).Database; var cosmosContainer = (await cosmosDatabase.CreateContainerIfNotExistsAsync("Claims", "/InsuredID")).Container; Model.ClaimsDocument processedDocument = new Model.ClaimsDocument(); processedDocument.DocumentDate = new DateTime(int.Parse(blobName.Substring(0, 4)), int.Parse(blobName.Substring(4, 2)), int.Parse(blobName.Substring(6, 2))); processedDocument.PatientName = forms[0].Fields["PatientName"].ValueData?.Text; processedDocument.InsuredID = forms[0].Fields["InsuredID"].ValueData?.Text; processedDocument.Diagnosis = forms[0].Fields["Diagnosis"].ValueData?.Text; decimal.TryParse(forms[0].Fields["TotalCharges"].ValueData?.Text, out decimal totalCharges); processedDocument.TotalCharges = totalCharges; DateTime.TryParse(forms[0].Fields["PatientBirthDate"].ValueData?.Text, out DateTime patientBirthDate); processedDocument.PatientBirthDate = patientBirthDate; decimal.TryParse(forms[0].Fields["AmountPaid"].ValueData?.Text, out decimal amountPaid); processedDocument.AmountPaid = amountPaid; decimal.TryParse(forms[0].Fields["AmountDue"].ValueData?.Text, out decimal amountDue); processedDocument.AmountDue = amountDue; processedDocument.FileName = blobName; if (processedDocument.InsuredID == null) { processedDocument.Id = Guid.NewGuid().ToString(); } else { processedDocument.Id = processedDocument.InsuredID; } try { ItemResponse <Model.ClaimsDocument> cosmosResponse = await cosmosContainer.CreateItemAsync(processedDocument, new PartitionKey(processedDocument.InsuredID)); } catch (CosmosException ex) when(ex.StatusCode == System.Net.HttpStatusCode.Conflict) { //Conflicting EnsurerID is silently ignored for demo purposes. } } log.LogInformation(eventGridEvent.Data.ToString()); }