70 lines
2.1 KiB
C#
70 lines
2.1 KiB
C#
|
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;
|
||
|
}
|
||
|
}
|