/
afanasevn
/
PdfEncoder
Обзор
Документация
Войти
/
afanasevn
/
PdfEncoder
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/PdfEncoder.Infrastructure/Configuration/TessdataPathResolver.cs
104 строки
3 KB
IBS\NAfanasev
Parse results functional update
07 июл 2026, 00:06
07 июл 2026, 00:06
8e97443
Код
Авторство
О чём код?
namespace PdfEncoder.Infrastructure.Configuration; /// <summary> /// Разрешает путь к tessdata относительно корня репозитория (для отладки из bin/ и VS). /// </summary> public static class TessdataPathResolver { private const string RusDataFile = "rus.traineddata"; private const string EngDataFile = "eng.traineddata"; private static string? _cachedDataPath; /// <summary> /// Возвращает абсолютный путь к tessdata с rus+eng traineddata. /// </summary> /// <param name="configuredPath">Значение из <c>Tesseract__DataPath</c>.</param> public static string Resolve(string configuredPath) { if (_cachedDataPath is not null) { return _cachedDataPath; } var resolved = TryResolveConfiguredPath(configuredPath) ?? FindRepoTessdata() ?? Path.GetFullPath(configuredPath); _cachedDataPath = resolved; return resolved; } /// <summary> /// True, если найден каталог tessdata с rus и eng traineddata. /// </summary> public static bool IsAvailable(string configuredPath = "./tessdata") { var path = TryResolveConfiguredPath(configuredPath) ?? FindRepoTessdata(); return path is not null; } private static string? TryResolveConfiguredPath(string configuredPath) { if (string.IsNullOrWhiteSpace(configuredPath)) { return null; } if (Path.IsPathRooted(configuredPath) && HasRequiredDataFiles(configuredPath)) { return configuredPath; } var fromCurrentDirectory = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), configuredPath)); if (HasRequiredDataFiles(fromCurrentDirectory)) { return fromCurrentDirectory; } var fromBaseDirectory = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, configuredPath)); if (HasRequiredDataFiles(fromBaseDirectory)) { return fromBaseDirectory; } return null; } private static string? FindRepoTessdata() { foreach (var startPath in new[] { Directory.GetCurrentDirectory(), AppContext.BaseDirectory }) { var directory = new DirectoryInfo(startPath); while (directory is not null) { var tessdataPath = Path.Combine(directory.FullName, "tessdata"); if (HasRequiredDataFiles(tessdataPath)) { return tessdataPath; } if (IsRepositoryRoot(directory)) { break; } directory = directory.Parent; } } return null; } private static bool IsRepositoryRoot(DirectoryInfo directory) { return File.Exists(Path.Combine(directory.FullName, "global.json")) || File.Exists(Path.Combine(directory.FullName, "PdfEncoder.slnx")); } private static bool HasRequiredDataFiles(string tessdataPath) { return Directory.Exists(tessdataPath) && File.Exists(Path.Combine(tessdataPath, RusDataFile)) && File.Exists(Path.Combine(tessdataPath, EngDataFile)); } }