aboutsummaryrefslogtreecommitdiff
path: root/OcrClient
diff options
context:
space:
mode:
Diffstat (limited to 'OcrClient')
-rw-r--r--OcrClient/Models/OcrResponse.cs25
-rw-r--r--OcrClient/OcrClient.csproj1
-rw-r--r--OcrClient/Services/IOcrClient.cs2
-rw-r--r--OcrClient/Services/OcrClient.cs19
-rw-r--r--OcrClient/Services/YandexOcrClient.cs70
5 files changed, 96 insertions, 21 deletions
diff --git a/OcrClient/Models/OcrResponse.cs b/OcrClient/Models/OcrResponse.cs
index 2afc041..2b26ab7 100644
--- a/OcrClient/Models/OcrResponse.cs
+++ b/OcrClient/Models/OcrResponse.cs
@@ -2,4 +2,27 @@ namespace OcrClient.Models;
public class OcrResponse
{
-} \ No newline at end of file
+ public Result? Result { get; set; }
+}
+public class Result
+{
+ public TextAnnotation? TextAnnotation { get; set; }
+}
+public class TextAnnotation
+{
+ public List<Table>? Tables { get; set; }
+}
+
+public class Table
+{
+ public string? RowCount { get; set; }
+ public string? ColumnCount { get; set; }
+ public List<Cell>? Cells { get; set; }
+}
+
+public class Cell
+{
+ public string? RowIndex { get; set; }
+ public string? ColumnIndex { get; set; }
+ public string? Text { get; set; }
+}
diff --git a/OcrClient/OcrClient.csproj b/OcrClient/OcrClient.csproj
index 4f78021..cdd654f 100644
--- a/OcrClient/OcrClient.csproj
+++ b/OcrClient/OcrClient.csproj
@@ -8,6 +8,7 @@
</PropertyGroup>
<ItemGroup>
+ <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.Net.Http" Version="4.3.4" />
</ItemGroup>
diff --git a/OcrClient/Services/IOcrClient.cs b/OcrClient/Services/IOcrClient.cs
index c8b1a86..9b281c9 100644
--- a/OcrClient/Services/IOcrClient.cs
+++ b/OcrClient/Services/IOcrClient.cs
@@ -4,5 +4,5 @@ namespace OcrClient.Services;
public interface IOcrClient
{
- public Task<OcrResponse> ProcessImage(string base64Image);
+ public Task<IEnumerable<object[,]>> ProcessImage(string base64Image, string xFolderId, string apiKey);
}
diff --git a/OcrClient/Services/OcrClient.cs b/OcrClient/Services/OcrClient.cs
deleted file mode 100644
index e4cfef3..0000000
--- a/OcrClient/Services/OcrClient.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using OcrClient.Models;
-using System.Net.Http;
-
-namespace OcrClient.Services;
-
-public class YandexOcrClient : IOcrClient
-{
- private readonly HttpClient _httpClient;
-
- public YandexOcrClient(HttpClient httpClient)
- {
- _httpClient = httpClient;
- }
-
- public Task<OcrResponse> ProcessImage(string base64Image)
- {
- throw new NotImplementedException();
- }
-} \ No newline at end of file
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