aboutsummaryrefslogtreecommitdiff
path: root/OcrClient/Services/YandexOcrClient.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OcrClient/Services/YandexOcrClient.cs')
-rw-r--r--OcrClient/Services/YandexOcrClient.cs70
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