diff options
Diffstat (limited to 'OcrClient/Services/YandexOcrClient.cs')
-rw-r--r-- | OcrClient/Services/YandexOcrClient.cs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/OcrClient/Services/YandexOcrClient.cs b/OcrClient/Services/YandexOcrClient.cs new file mode 100644 index 0000000..8568e38 --- /dev/null +++ b/OcrClient/Services/YandexOcrClient.cs @@ -0,0 +1,70 @@ +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using Newtonsoft.Json; +using OcrClient.Models; + +namespace OcrClient.Services; + +public class YandexOcrClient : IOcrClient +{ + private readonly HttpClient _httpClient; + public YandexOcrClient(HttpClient httpClient) + { + _httpClient = httpClient; + _httpClient.BaseAddress = new Uri("https://ocr.api.cloud.yandex.net/ocr/v1/"); + } + + public async Task<IEnumerable<object[,]>> ProcessImage(string base64Image, string xFolderId, string apiKey) + { + using StringContent jsonContent = new( + JsonConvert.SerializeObject(new + { + mimeType = "PNG", + languageCodes = new string[] { "ru", "en" }, + model = "table", + content = base64Image + }), + Encoding.UTF8, + "application/json"); + _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Api-Key", apiKey); + _httpClient.DefaultRequestHeaders.Add("x-folder-id", xFolderId); + _httpClient.DefaultRequestHeaders.Add("x-data-logging-enable", "true"); + + using HttpResponseMessage response = await _httpClient.PostAsync("recognizeText", jsonContent); + response.EnsureSuccessStatusCode(); + + string jsonResponse = await response.Content.ReadAsStringAsync(); + OcrResponse? deserialized = JsonConvert.DeserializeObject<OcrResponse>(jsonResponse); + + if (deserialized != null) + { + var tables = deserialized?.Result?.TextAnnotation?.Tables ?? Enumerable.Empty<Table>(); + if (tables.Any()) + { + List<object[,]> result = new(); + foreach (var table in tables) + { + if (table.Cells == null || table.Cells.Count == 0) + { + continue; + } + int columnCount = int.Parse(table.ColumnCount); + int rowCount = int.Parse(table.RowCount); + object[,] cells = new object[rowCount, columnCount]; + + foreach (Cell cell in table.Cells) + { + int rowIndex = int.Parse(cell.RowIndex); + int columnIndex = int.Parse(cell.ColumnIndex); + cells[rowIndex, columnIndex] = double.TryParse(cell.Text, out double v) ? + v : cell.Text ?? string.Empty; + } + result.Add(cells); + } + return result; + } + } + return null; + } +}
\ No newline at end of file |