GdPicture OCR помогает извлекать текст из сканов, фотографий и PDF, создавать документы с поисковым слоем, распознавать выбранные области, учитывать несколько языков, возвращать координаты и уверенность слов, а перед запуском исправлять перекос, поворот и помехи на изображении.
Рабочий процесс строится вокруг объекта GdPictureOCR: ему указывают каталог языковых ресурсов, добавляют нужные словари, передают идентификатор изображения через SetImage, задают контекст страницы или отдельной зоны и запускают RunOCR. Результат хранится под строковым идентификатором, по которому можно получить сплошной текст, слова, символы, строки, блоки, таблицы, поля формы и пары ключ — значение.
Для PDF предусмотрен другой практический маршрут: документ открывают через GdPicturePDF, выбирают страницу, проверяют наличие готового текстового слоя и вызывают OcrPage либо обработку диапазона страниц. Распознанные символы помещаются невидимым слоем поверх изображения страницы, поэтому файл начинает поддерживать поиск и копирование без заметного изменения внешнего вида скана.
Скачать GdPicture OCR
- Редактирование PDF
- Русский интерфейс
- Просто новичкам
- Нужна среда разработки
- OCR-ресурсы отдельно
- Пробный вывод с метками
Первое распознавание и устройство демонстрационного окна
В демонстрационном окне OCR верхняя панель отведена под путь к словарям, код языка, тайм-аут и выбор режима разметки. Центральную часть занимает изображение документа, справа выводится список контекстов вроде целой страницы, одной колонки, блока, строки, слова или одиночного символа. Такая компоновка наглядно показывает главное правило: качество результата определяется не только словарём, но и тем, насколько точно движку описана структура входного фрагмента.
Команда открытия помещает файл в область просмотра, после чего пользователь может выделить прямоугольник мышью и распознавать не весь лист, а только выбранный участок. На счёте это позволяет отдельно прочитать номер, дату или сумму, не заставляя движок разбирать логотип, таблицу и мелкий служебный текст. Для повторной проверки одной зоны достаточно оставить то же изображение, изменить набор символов или контекст и снова выполнить распознавание.
Результат простого запуска обычно выводится в текстовое окно или передаётся вызывающему коду. Полезно одновременно рисовать рамки слов на копии изображения: несовпадение рамки с печатной строкой быстро обнаруживает ошибку ориентации, неверный DPI либо слишком агрессивную очистку. Если рамки стоят правильно, а символы ошибочны, следующими кандидатами для проверки становятся язык, whitelist и словарные штрафы.

Поле тайм-аута соответствует свойству Timeout и ограничивает продолжительность следующего запуска в миллисекундах. Нулевое значение означает отсутствие установленного лимита, но для серверной очереди безопаснее задавать предел и отдельно учитывать прерванные задания. Тайм-аут не исправляет тяжёлую страницу: если одно изображение систематически не укладывается, уменьшите разрешение до рабочего диапазона, ограничьте ROI или отключите ненужное определение ориентации.
После каждого вызова нужно проверять GetStat, а не считать непустой идентификатор достаточным признаком успеха. Статус фиксирует ошибку последней операции, поэтому его читают сразу после AddLanguage, SetImage, RunOCR и методов получения результата. Такой порядок исключает ситуацию, когда приложение сообщает об ошибке распознавания, хотя фактически раньше не нашло словарь или не приняло изображение.
Подключение ресурсов и проверка языковых файлов
Свойство ResourcesFolder должно указывать на каталог, где доступны словари и остальные данные движка. Ошибка в одной букве пути проявляется уже на AddLanguage: язык не добавляется, а последующий запуск либо завершается статусом ошибки, либо работает не с тем набором ресурсов, который ожидал разработчик. В публикации приложения каталог следует копировать вместе с нужными файлами и проверять его существование при старте службы.
Методы GetAvailableLanguageCount, GetAvailableLanguage и GetAvailableLanguages позволяют построить диагностику без догадок. Перед показом списка языков интерфейс может прочитать фактическое содержимое указанного каталога, а не держать жёстко заданный перечень. Это особенно важно на нескольких узлах обработки: один сервер может получить новый языковой файл, тогда как другой останется с неполной поставкой.
Вызов AddLanguage добавляет известный язык во внутренний набор объекта. Для смешанного документа допускается последовательно добавить несколько языков, но каждый дополнительный словарь увеличивает пространство выбора и время обработки. Практический подход — определять язык из метаданных задания или типа формы, а общий многоязычный профиль оставлять для документов, где язык действительно заранее неизвестен.
Для пользовательской терминологии предусмотрен AddCustomDictionary. Его стоит применять к артикулам, фамилиям, отраслевым сокращениям и названиям, которые регулярный словарь ошибочно исправляет на обычные слова. Пользовательский словарь не заменяет качественный скан: он помогает выбрать правдоподобный вариант из уже распознанных очертаний, но не восстановит букву, полностью уничтоженную бликом или линией формы.
Метод ResetSelectedDictionaries очищает ранее добавленные языки и пользовательские словари, а ResetParameters возвращает параметры объекта к исходным значениям. Эти операции полезны в пуле долгоживущих обработчиков: без сброса задание на русском языке может неожиданно унаследовать ограничения символов или словари от предыдущего английского счёта. После сброса нужные значения задают заново в явном порядке.
Распознавание изображения через GdPictureOCR
Минимальная последовательность состоит из загрузки изображения через GdPictureImaging, передачи полученного идентификатора в SetImage, запуска RunOCR и чтения результата по возвращённому ID. SetImage обязателен перед первым распознаванием и позволяет повторно применять разные зоны и наборы символов к одному изображению без повторной загрузки файла. Идентификатор изображения остаётся собственностью объекта обработки изображений и освобождается отдельно.
Метод RunOCR использует параметры, накопленные в текущем объекте: языки, контекст, ROI, фильтры символов, режим скорости, ориентацию, устранение перекоса и тайм-аут. Поэтому конфигурацию лучше собирать в одном месте до вызова, а не менять свойства в разных ветках кода. В журнал задания полезно записывать фактический набор параметров, чтобы воспроизвести спорный результат на том же изображении.
Полученный идентификатор не является распознанным текстом. Он указывает на структуру, закреплённую за тем же экземпляром GdPictureOCR, и нужен всем методам чтения. GetOCRResultText возвращает форматированную строку без пустых распознанных строк, тогда как методы блоков, абзацев, строк, слов и символов сохраняют пространственную организацию и подходят для анализа макета.
После выгрузки данных вызывают ReleaseOCRResult для конкретного ID либо ReleaseOCRResults для всех накопленных результатов. Уничтожение объекта также освобождает связанные результаты, однако откладывать очистку до конца большого пакета невыгодно: каждая страница удерживает служебные структуры, координаты и альтернативы символов. Изображение затем освобождают через соответствующий метод GdPictureImaging.
Если одно изображение распознаётся несколько раз, освобождайте предыдущий результат после сравнения, а не перед ним. Например, первый проход выполняют с контекстом документа, второй — по ROI с ограничением на цифры; затем приложение сопоставляет значение, уверенность и координаты, выбирает вариант и удаляет оба результата. Такой цикл сохраняет преимущества повторного SetImage без неограниченного роста памяти.
Выбор области интереса и система координат
Метод SetROI задаёт прямоугольник изображения, который будет включён в следующий запуск. Координаты измеряются в пикселях исходного изображения, начало находится в левом верхнем углу. Это важно при работе с масштабированным просмотрщиком: экранный прямоугольник нельзя передавать напрямую, сначала его преобразуют с учётом масштаба, прокрутки, поворота и фактических размеров страницы.
ROI ускоряет распознавание и снижает количество ложных слов, когда на странице нужна одна стабильная зона. На унифицированной анкете можно создать профиль с координатами полей, последовательно менять прямоугольник и для каждого поля выбирать свой Context и CharacterSet. Номер счёта распознаётся как короткая строка из цифр и латиницы, а адрес — как многострочный блок с широким набором символов.
После обработки зоны необходимо вызвать ResetROI, прежде чем переходить к целой странице. Иначе следующий документ может дать правдоподобный, но неполный текст, потому что движок продолжит видеть только старый прямоугольник. В пакетном коде безопаснее устанавливать ROI для каждого задания явно, а для режима полной страницы всегда выполнять сброс перед RunOCR.
Координаты распознанных слов позволяют проверить, что результат относится к ожидаемому полю. Если значение 150.96 найдено далеко от подписи TOTAL, его нельзя автоматически принимать за итоговую сумму. Сопоставление прямоугольников, направления чтения и уверенности формирует более надёжное правило, чем поиск первого числа нужного формата в полном тексте.
Шаблонные координаты чувствительны к смещению листа и изменению масштаба сканирования. Перед применением фиксированных зон полезно выровнять документ по опорным элементам, исправить перекос и привести изображение к согласованному размеру. Для форм с заметным растяжением или несколькими макетами лучше использовать обнаружение структуры и пары ключ — значение, а ROI оставить для финального уточнения.
Контекст страницы, блока, строки и символа
Свойство Context сообщает движку ожидаемый тип разметки. Для обычного письма подходит режим документа или страницы, для узкой колонки — колонка, для подписи под полем — отдельная строка, а для маркировки на детали — слово или одиночный символ. Неверный контекст заставляет алгоритм искать структуру, которой нет, и часто искажает порядок чтения либо объединяет соседние элементы.
Режим целого документа полезен, когда на странице несколько абзацев и таблица, но он тратит время на сегментацию всего полотна. Если приложение уже знает координаты поля, сочетание ROI и контекста строки обычно устойчивее: движку не требуется решать, где заканчивается логотип и начинается значение. Для вертикальных надписей выбирают соответствующий вариант блока, а не поворачивают весь документ без необходимости.
Одиночный символ и короткое слово требуют особенно строгой проверки масштаба. Контекст уменьшает число допустимых гипотез разметки, но не увеличивает количество пикселей в знаке. Если высота цифры всего несколько пикселей, сначала получают страницу с большим эффективным DPI или вырезают исходный участок без последующего растягивания с потерей резкости.
Контекст строки удобен для MRZ, MICR и серийных номеров, однако специализированные режимы распознавания дают дополнительные знания о допустимой структуре. Например, строка машиночитаемой зоны содержит фиксированный набор символов и контрольные цифры, а банковская строка использует специальный шрифт. Обычный контекст строки применяют как запасной тест, но не как полноценную замену специализированному профилю.
При диагностике полезно прогнать проблемную зону в двух соседних контекстах и сравнить не только текст, но и среднюю уверенность, число слов и их рамки. Если режим блока создаёт пять слов, а режим строки — одно длинное слово без пробелов, правильный вариант определяется бизнес-структурой поля. Автоматический выбор можно закрепить тестами на эталонном наборе документов.
Ограничение допустимых символов
Свойство CharacterSet действует как whitelist: движок возвращает только перечисленные символы. Для числового идентификатора задают цифры, для кода — цифры и заглавные латинские буквы, для денежного поля добавляют десятичный разделитель и знак минуса. Ограничение уменьшает путаницу между O и 0, I и 1, но ошибочно составленный список безвозвратно исключает правильный знак.
CharacterBlackList запрещает отдельные символы, сохраняя весь остальной алфавит. Этот вариант полезен, когда поле в целом свободное, но известно, что знак @ или определённая кавычка недопустимы. Whitelist лучше для узких кодов, blacklist — для обычного текста с несколькими нежелательными вариантами; одновременно применять чрезмерные ограничения не стоит.
Ограничение символов не заменяет проверку формата после OCR. Дата из восьми цифр может быть распознана без ошибок на уровне знаков, но содержать невозможный месяц. После чтения приложение разбирает значение, проверяет диапазоны, контрольную сумму, длину или регулярное выражение и только затем принимает результат. Низкая уверенность должна переводить поле в ручную проверку, а не просто удаляться.
Для каждой зоны храните допустимый алфавит вместе с версией шаблона формы. Когда поставщик добавит букву в номер заказа, старый whitelist начнёт стабильно выдавать укороченные значения, и это будет выглядеть как ухудшение OCR. Отдельный журнал отброшенных символов и сравнение длины с ожидаемой быстро показывают, что проблема находится в ограничении, а не в качестве изображения.
Если поле содержит русские и латинские буквы, визуально похожие символы требуют нормализации по контексту. Нельзя безусловно заменять кириллическую С на латинскую C: в названии компании это будет искажением, а в артикуле с формально заданным латинским алфавитом — полезной коррекцией. Правило применяется после распознавания и должно учитывать язык конкретного поля.
Ориентация, перекос и предварительная обработка
EnableOrientationDetection включает автоматическое определение стандартного поворота страницы. Функция помогает при пакетах, где листы попадают в сканер разной стороной, но заметно увеличивает время распознавания. Если источник гарантирует правильную ориентацию, её лучше отключить; если нет, сохраняйте значение GetPageRotation в журнал и проверяйте неожиданные повороты на образцах с малым количеством текста.
EnableSkewDetection отвечает за оценку небольшого наклона строк. После распознавания угол доступен через GetPageSkewAngle, что позволяет контролировать качество подачи бумаги. Сильный геометрический изгиб фотографии не равен обычному перекосу: одной коррекции угла недостаточно, страницу следует заранее выпрямить или переснять с камерой, расположенной параллельно листу.
EnablePreprocessing включает подготовку изображения внутри OCR-прохода, а EnableVigorousDespeckle усиливает удаление точечного шума. Агрессивное удаление полезно на факсах и старых копиях, но способно съесть точки над буквами, десятичные разделители и тонкие штрихи. Поэтому тяжёлую очистку проверяют отдельно на мелком шрифте и финансовых полях, где один исчезнувший знак меняет значение.
Предварительная обработка средствами GdPictureImaging даёт больше контроля: можно работать с копией, сравнивать исходник и результат, удалять границы, линии и отверстия, выравнивать контраст, переводить в градации серого или битональный вид. Не применяйте длинную цепочку фильтров автоматически ко всем документам. Оптимальный набор для ровного офисного скана отличается от набора для фотографии квитанции на цветном фоне.
Проверяйте промежуточное изображение визуально и метриками. Хорошая подготовка делает штрихи букв непрерывными, фон однородным, а межсимвольные промежутки различимыми. Если после бинаризации соседние буквы слиплись, повышенная резкость не исправит сегментацию; нужно изменить порог или вернуться к полутоновому варианту. Для каждого класса документов храните исходник, подготовленную копию и итоговый текст эталонных страниц.
Разрешение и растеризация страниц PDF
Для OcrPage документация рекомендует 300 DPI; диапазон 200–300 DPI обычно даёт оптимальный результат для листа A4, а значения выше 300 заметно увеличивают потребление памяти. Это не означает, что любой файл становится качественным после указания 300: параметр определяет разрешение растеризации страницы, но не восстанавливает детали, уже потерянные в низкокачественном скане.
При ручном маршруте страницу выбирают через SelectPage и визуализируют в объект изображения с заданным DPI. 300 DPI удобно для мелкого офисного текста, 200–240 DPI может быть достаточно для крупного шрифта и ускоряет большой пакет. Решение принимают по замерам на собственных документах: сравнивают точность, время и пиковую память, а не выбирают максимальное число автоматически.
Размер растра растёт пропорционально DPI по каждой оси, поэтому объём несжатых пикселей увеличивается примерно квадратично. Переход с 200 на 300 DPI даёт в 2,25 раза больше пикселей, ещё до учёта служебных структур OCR. На многостраничном документе нельзя одновременно держать изображения всех страниц: страницу визуализируют, распознают, извлекают результат, освобождают и только затем переходят к следующей.
Если PDF уже содержит качественный текст, повторная растеризация ухудшает его свойства. Перед OCR вызывают PageHasText и выбирают политику: пропустить страницу, обработать только области изображений либо осознанно заменить слой. Простое правило OCR всё опасно для гибридных документов, где часть страниц создана из текста, а часть получена сканированием.
Шрифты с тонкими засечками, светло-серый текст и мелкие индексы требуют проверки при выбранном DPI. Увеличение разрешения полезно лишь до тех пор, пока исходная страница содержит соответствующую детализацию. Для фотографии с размытием лучше сначала исправить перспективу и контраст; многократное программное увеличение создаёт больше пикселей, но не добавляет достоверных контуров.
PDF с невидимым поисковым слоем
OcrPage распознаёт выбранную страницу и добавляет невидимый текст. Внешний вид сохраняется за счёт изображения страницы, а текстовый слой используется поиском, выделением и копированием. После сохранения результат проверяют в независимом просмотрщике: ищут несколько слов, копируют фрагмент из разных колонок и убеждаются, что выделение совпадает с печатными строками.
Метод выполняет растеризацию текущей страницы. Существующий видимый текст становится частью изображения, а прежний невидимый слой удаляется до нового OCR. Это ключевое ограничение: повторный вызов не просто добавляет ещё один слой, а перестраивает содержимое страницы. Для исходно цифрового PDF такой маршрут может увеличить размер, ухудшить масштабирование текста и лишить документ исходной структуры.
Перед обработкой зашифрованного файла нужно снять разрешённое владельцем шифрование или выбрать другой маршрут, потому что OcrPage предназначен для незашифрованных документов. Ошибку нельзя обходить повторными вызовами с теми же параметрами. Сначала проверяют статус загрузки, права документа и политику безопасности, затем создают рабочую копию с контролируемым доступом.
Архивный сценарий требует не только распознавания, но и проверки требуемой разновидности PDF/A. Возможность создать поисковый PDF/A не освобождает от валидатора: шрифты, цветовые профили, метаданные и запрещённые элементы должны соответствовать выбранному профилю. Сохраняйте отчёт валидатора рядом с пакетом документов, особенно если файл предназначен для длительного хранения или регламентированной передачи.
Качество слоя оценивают отдельно от визуального качества страницы. Скан может выглядеть идеально, но текст копируется в неправильном порядке из-за сложной таблицы; наоборот, слегка шумный лист может давать корректный полнотекстовый поиск. Для архивного поиска важны полнота слов и координаты, для повторного использования — порядок строк и таблиц, поэтому один показатель точности не покрывает все задачи.
Постраничная обработка PDF и контроль статусов
Надёжный цикл начинает работу с LoadFromFile, получает количество страниц, выбирает каждую через SelectPage и проверяет результат операции. Нумерация страниц в API начинается с единицы, поэтому цикл от нуля приведёт к ошибке на первом шаге. После выбора страницы полезно убедиться, что GetPageCount не вернул ноль и что статус остался OK.
PageHasText отделяет сканированные страницы от уже текстовых. В интерактивной программе можно предложить пропуск, а в автоматической очереди политика задаётся параметром задания: пропустить, заменить или отправить на проверку. Решение следует логировать по каждой странице, иначе при жалобе на отсутствие поиска невозможно понять, была ли страница распознана или намеренно пропущена.
После успешного OcrPage текст страницы доступен через GetPageText. Его удобно записывать в отдельный индекс или журнал контроля, но не следует считать этот текст идентичным визуальному порядку для сложной вёрстки. Таблицы, колонки и подписи проверяют по координатам либо извлекают специализированными методами, а сплошную строку используют для полнотекстового поиска.
Сохранение выполняют только после завершения нужных страниц и проверяют статус SaveToFile. Пишите сначала во временный файл на том же томе, открывайте его повторно, сверяйте количество страниц и наличие текста, затем атомарно заменяйте назначение. Такой порядок защищает исходник от обрыва питания, нехватки места или ошибки записи в середине документа.
События BeforePageOcr, OcrPagesProgress и OcrPagesDone подходят для индикатора выполнения и управляемой отмены многостраничной операции. Обработчик события не должен выполнять тяжёлую работу в том же потоке, иначе прогресс сам станет причиной замедления. В журнал достаточно передавать номер страницы, процент, длительность и итоговый статус.
Языки, смешанные документы и направление письма
GdPicture OCR поддерживает большой набор языков, включая сценарии с Unicode и письмом справа налево. Однако наличие словаря не гарантирует правильный порядок строк: направление блока доступно отдельно, а интерфейс и хранилище должны корректно обрабатывать двунаправленный текст. Проверяйте не только отображение, но и копирование, сериализацию и поиск по словам арабского или ивритского фрагмента.
В PDF-методе несколько словарей объединяются строкой с разделителем +, например английский и французский. В объекте GdPictureOCR языки добавляются вызовами AddLanguage. Не подключайте все словари на всякий случай: похожие алфавиты увеличивают неоднозначность, а иероглифические модели заметно расширяют вычислительную нагрузку.
GetWordRecognitionLanguage возвращает язык, использованный для конкретного слова. Это позволяет подсветить неожиданные переключения внутри строки и строить статистику по документу. Если артикул распознан как слово другого языка, его лучше проверять через whitelist и формат, а не доверять словарной принадлежности; коды часто отсутствуют в обычных словарях.
Свойства LoadMainDictionary и LoadFreqWordsDictionary управляют загрузкой основных и частотных словарей. Отключение словарной поддержки может быть оправдано для серийных номеров, но ухудшит обычный текст. Штрафы LanguageModelPenaltyNonDictWords и LanguageModelPenaltyNonFreqDictWords меняют отношение к неизвестным словам и требуют тестирования на отраслевой лексике.
Для многоязычного архива полезно сначала классифицировать страницу по простым признакам или метаданным дела, затем применять узкий языковой профиль. Если классификация не уверена, запускают комбинированный профиль и анализируют язык слов. Такой каскад быстрее и точнее постоянного распознавания всеми моделями, а спорные страницы можно направить на ручную проверку.
Структурированный результат: блоки, абзацы и строки
Результат OCR хранит иерархию от блоков до символов. GetBlockCount сообщает число блоков, координаты читаются через GetBlockLeft, GetBlockTop, GetBlockRight и GetBlockBottom, а GetBlockType помогает отличать виды обнаруженного содержимого. Это основа для собственного просмотрщика результатов и восстановления порядка чтения.
Для блока доступны ориентация, направление письма, число абзацев и индекс первого абзаца. На странице с боковой подписью нельзя просто сортировать все слова по координате Y: вертикальный блок имеет другой порядок. Сначала обходят структуру блоков, учитывают направление, затем переходят к абзацам и строкам внутри каждого элемента.
Абзац содержит выравнивание, рамку, индекс первой строки и количество строк. Эти свойства полезны при экспорте в HTML или DOCX, где важно отделить заголовок от основного текста. Не пытайтесь восстановить точную типографику только по сплошной строке: пробелы и переносы без координат недостаточны для колонок, отступов и сложных форм.
Строковые методы возвращают число линий, значение каждой линии, рамку и диапазон слов. Пустые строки в стандартном текстовом результате не сохраняются, поэтому визуальные интервалы между абзацами восстанавливают по координатам. Если следующая строка начинается значительно ниже обычного межстрочного шага, экспортёр может создать новый абзац или дополнительный отступ.
GetSerializedResult выдаёт полную структуру в JSON внутреннего формата. Это удобно для передачи в другую службу и повторного анализа без нового OCR, но схему нужно версионировать в своём контракте. Не связывайте внешних потребителей напрямую со всеми внутренними полями: выделите стабильную модель данных и сохраняйте исходный JSON для диагностики.
Слова, символы, координаты и уверенность
GetWordCount задаёт границы обхода слов, GetWordValue возвращает текст, а четыре координатных метода описывают рамку в пикселях. Дополнительно доступны размер обнаруженного шрифта, язык, индекс строки, число пробелов перед словом и признак нахождения в словаре. Эти данные позволяют строить поисковый индекс с позициями и подсветкой на странице.
GetWordConfidence даёт уверенность конкретного слова, а GetAverageWordConfidence — среднее по результату. Среднее значение нельзя использовать как единственный порог: страница с десятками простых слов и одной ошибочной суммой может иметь высокий общий показатель. Критичные поля оценивают отдельно, учитывая рамку, формат и связь с подписью.
На уровне символов доступны значение, рамка, уверенность и альтернативные варианты. Методы альтернатив позволяют показать оператору, что движок колебался между 8 и B, и быстро подтвердить нужный знак. Автоматическая коррекция должна учитывать позицию в поле: буква допустима в префиксе артикула, но недопустима в контрольной цифре.
Минимальная и максимальная ширина или высота символа задаются свойствами MinCharWidth, MaxCharWidth, MinCharHeight и MaxCharHeight. Они помогают исключить слишком мелкий шум и крупные декоративные элементы, но значения относятся к пикселям текущего изображения. При смене DPI прежние пороги перестают соответствовать тому же физическому размеру шрифта.
ExpectedSymbolCount полезен для поля с заранее известной длиной, например кода из десяти знаков. Нулевое значение оставляет количество неопределённым. Даже при заданном числе символов проверяйте фактический результат: повреждённый знак может быть пропущен, а разделитель — принят за дополнительный символ. Поле с неверной длиной отправляют на повторный проход или ручную проверку.
Таблицы и ячейки
Методы GetTableCount, GetTableRowCount и GetTableColumnCount позволяют перейти от визуальной таблицы к сетке. Для каждой таблицы, строки, столбца и ячейки доступны прямоугольники, а GetTableCellText возвращает содержимое ячейки. Это значительно надёжнее попытки делить сплошной текст по нескольким пробелам.

Перед экспортом проверяют согласованность размеров: число строк и столбцов должно быть положительным, рамки ячеек не должны выходить за таблицу, а соседние элементы должны иметь разумное пересечение границ. Если распознавание ошибочно разделило одну ячейку на две, простой CSV потеряет смысл; спорную таблицу лучше сохранить вместе с координатами и изображением области.

IsHeaderCell помогает отличить заголовок от данных. При формировании XLSX заголовки можно вынести в первую строку, а типы столбцов определить по большинству значений. Нельзя безусловно преобразовывать все числа в числовой формат: банковский счёт, индекс и артикул могут начинаться с нуля и должны остаться строками.
Линии таблицы иногда мешают сегментации символов, особенно когда штрихи букв касаются рамки. Подготовка изображения может удалить горизонтальные и вертикальные линии, но тогда геометрия сетки должна быть сохранена до фильтрации или восстановлена по исходнику. Хороший конвейер держит две копии: очищенную для текста и исходную для проверки структуры.
Сложные таблицы с объединёнными ячейками, вложенными заголовками и текстом в несколько строк требуют собственной логики восстановления. Рамка и текст ячейки дают базовые элементы, но бизнес-смысл возникает после сопоставления заголовков, единиц измерения и повторяющихся групп. Точность таблиц следует измерять отдельно от точности обычного текста.
Поля формы и пары ключ — значение
Во время OCR движок может автоматически извлекать поля формы и пары ключ — значение. GetFormFieldCount возвращает число полей, а методы ключа, значения, типа и прямоугольников дают структурированный результат. Пары доступны через GetKeyValuePairCount, строки ключа и значения, тип данных, уверенность, рамки и признак сильной семантической связи.
На счёте ключами становятся подписи вроде DATE, TOTAL PRICE или IBAN, а значениями — соседние данные. В отличие от фиксированного ROI, связь может сохраниться при небольшом смещении блока. Однако результат всё равно зависит от читаемости подписи и геометрии: если ключ распознан неверно или на странице несколько одинаковых слов, пару необходимо проверять по координатам и типу.

Тип данных помогает отличить дату, номер телефона, валюту, адрес электронной почты и обычную строку. Это не заменяет бизнес-валидацию: распознанное значение может соответствовать синтаксису даты, но относиться не к дате счёта. Приложение сопоставляет публичное имя поля, текст ключа, положение, тип и уверенность, затем применяет правила конкретного документа.
GetKeyValuePairIsStrong показывает, установлена ли сильная семантическая связь. Слабую пару не следует молча отбрасывать: она может быть единственным вариантом на необычном шаблоне. Лучше разделить результаты на автоматические, требующие подтверждения и отклонённые, а пороги подобрать по накопленной статистике ошибок.
На визуальном экране контроля рамки ключей и значений показывают разными стилями, а нижняя панель выводит текст и уверенность. Оператор должен видеть не только итоговую строку, но и участок документа, откуда она получена. Это сокращает время проверки и помогает отличить ошибку OCR от неверного сопоставления пары.

Для счетов разных поставщиков начните с общей KVP-модели, затем добавьте правила нормализации названий. Например, TOTAL, AMOUNT DUE и ИТОГО могут отображаться в одно внутреннее поле, но только после проверки валюты и положения. Не связывайте поле исключительно с точным текстом ключа: OCR-ошибка в одной букве иначе разрушит весь сценарий.
Специализированное распознавание ICR, MICR и MRZ
Режимы ICR рассчитаны на ограниченные рукописные сценарии, а не на свободный курсивный текст страницы. Контексты включают числовые ячейки, одну или две цифры, строку чисел и другие специализированные варианты. Лучшие результаты получаются, когда форма задаёт отдельные коробки, штрихи не касаются границ, а изображение имеет достаточный контраст.
Для банковских документов используются контексты MICRLineCMC7 и MICRLineE13B. Они учитывают характерные символы и структуру строки внизу чека. Перед запуском область ограничивают нижней частью документа, устраняют сильный перекос и проверяют, что защитный фон не сливается со знаками. Полученные маршрутизационные и счётные номера обязательно проходят контрольные правила банка.
MRZ предназначен для машиночитаемой зоны паспортов и удостоверений. Зона состоит из строк с фиксированным алфавитом и контрольными цифрами, поэтому её распознают отдельно от остальной страницы. Кадр сначала выравнивают, исключают блики ламинации и проверяют, что обе или три строки полностью попали в изображение, включая символы-заполнители по краям.
Специализированные режимы могут требовать дополнительных файлов ресурсов. Их наличие проверяют при развёртывании так же строго, как языковые словари: тестовая страница должна запускаться на каждом узле после обновления. Ошибка работает на компьютере разработчика, но не на сервере часто связана не с кодом, а с отсутствующим ресурсом или неверным относительным путём.
Результат ICR, MICR или MRZ нельзя смешивать с обычным сплошным текстом без указания происхождения. В модели данных сохраняют тип распознавания, координаты зоны, уверенность, проверку контрольных цифр и изображение фрагмента. Это обеспечивает аудит и позволяет повторно обработать только проблемное поле, не распознавая весь документ.
Сканирование перед OCR
GdPicture позволяет получить изображение со сканера через TWAIN, настроить источник, разрешение, цветность, устройство подачи и двусторонний режим, а затем передать кадр в OCR. Для офисного текста обычно выбирают 300 DPI и оттенки серого либо битональный режим после проверки качества. Цвет сохраняют, когда фон, печати или выделения важны для последующей обработки.
Автоподатчик требует обработки событий конца бумаги, замятия и пустой страницы. Не создавайте PDF до проверки каждого кадра: перевёрнутый или пустой лист лучше пометить на этапе получения. При двустороннем сканировании контролируют порядок лицевой и оборотной сторон, чтобы поисковый текст и нумерация страниц соответствовали оригиналу.
Интерфейс источника можно показывать оператору или скрывать и задавать параметры программно. Скрытый режим ускоряет повторяющиеся задания, но драйверы разных сканеров по-разному поддерживают возможности. При запуске сохраняйте согласованные значения DPI, цветности и размера бумаги, а неподдерживаемую настройку обрабатывайте как отдельную диагностируемую ошибку.
Пустые страницы определяют до OCR, иначе движок потратит время на шум и может вернуть случайные символы. Критерий пустоты должен учитывать оборотный просвет и печати: слишком строгий порог удалит слабую страницу. Для спорных листов сохраняют миниатюру и отправляют на проверку, а не исключают без следа.
После получения изображения создают страницу PDF, добавляют скан и вызывают OCR для поискового слоя. Важно освобождать идентификатор изображения после добавления и распознавания, закрывать источник TWAIN и корректно завершать сессию даже при ошибке. Иначе следующий пакет может не увидеть устройство или получить занятый драйвер.
Просмотр документа и выбор страниц
Компонент GdViewer помогает встроить просмотр страницы перед OCR. В простом окне пользователь выбирает файл, увеличивает фрагмент колесом мыши, перемещает страницу и выделяет область. Для распознавания важно переводить экранное выделение в координаты изображения; визуальный масштаб не должен менять фактический ROI.

Навигационные методы отображают первую, предыдущую, следующую, последнюю или указанную страницу. В интерфейсе номер страницы должен обновляться после любого перехода, включая щелчок по миниатюре. Если OCR запускается в фоне, сохраняйте номер и идентификатор документа в задании, чтобы поздний результат не прикрепился к странице, которую пользователь уже сменил.
Контрол ThumbnailEx показывает миниатюры и синхронизируется с просмотрщиком. Это удобно для выбора диапазона сканированных страниц: оператор быстро замечает пустой лист, поворот или другой тип документа. Выбранные страницы можно отправлять в очередь с единым языковым профилем, а остальные оставить без изменений.

Дерево закладок помогает ориентироваться в больших PDF, но закладка не гарантирует наличие текстового слоя. После перехода к разделу следует отдельно проверять PageHasText. Если документ уже содержит закладки и цифровой текст, массовая растеризация может ухудшить его структуру, поэтому OCR применяют только к действительно сканированным страницам.

Интерфейс контроля полезно дополнить переключателями исходник, подготовленное изображение, рамки слов и поисковый слой. Так оператор видит, на каком этапе возникла ошибка. Для KVP рядом показывают список пар и переход к рамке, а для таблиц — сетку ячеек. Эти элементы строятся на координатах результата и не требуют повторного OCR.
Экспорт текста, HTML, DOCX и XLSX
SaveAsText сохраняет распознанный результат в текстовый файл. Такой экспорт подходит для индексации и простых документов, но не сохраняет точную геометрию страницы. Перед записью выбирают кодировку Unicode, нормализуют переводы строк и определяют, как разделять страницы. Идентификатор документа и номер страницы лучше хранить отдельно от текста, а не вставлять служебные строки внутрь содержимого.
SaveAsHTML использует структуру и расположение элементов для представления документа в разметке. Результат проверяют на таблицах, колонках и письме справа налево; автоматическая разметка может быть семантически несовершенной даже при верных словах. Перед публикацией HTML следует очистить, экранировать и пропустить через правила безопасности приложения.
SaveAsDOCX удобен, когда пользователю нужно редактировать распознанный документ, а SaveAsXLSX — для таблиц. Эти форматы требуют оценки не только символов, но и структуры: таблица с правильными значениями в неверных столбцах непригодна. Создайте набор контрольных файлов с объединёнными ячейками, многострочными заголовками и смешанными типами данных.
Экспорт не отменяет доступ к низкоуровневым данным. Для критичной системы полезно одновременно сохранить готовый файл, сплошной текст и сериализованную структуру результата. Если пользователь обнаружит ошибку в DOCX, разработчик сможет определить, был ли неправильно распознан символ, строка или уже этап построения документа.
Не перезаписывайте исходное изображение экспортом. Храните связь между оригиналом, подготовленной копией, результатом OCR и производными файлами через устойчивый идентификатор. При изменении настроек можно повторить распознавание и сравнить версии, не теряя юридически значимый исходник.
Многопоточность и пакетная очередь
Свойство MaxThreadCount ограничивает число потоков, которые экземпляр может выделить; по умолчанию оно связано с числом логических процессоров. Максимум не всегда оптимален: одновременно растеризованные страницы конкурируют за память, а дисковая подсистема может стать узким местом. Замеры проводят на типичном пакете, фиксируя страницы в минуту, пиковую память и задержку отдельных заданий.
Метод OcrPage обрабатывает страницу одним потоком, тогда как пакет можно распараллелить на уровне документов или использовать операции со встроенной многопоточностью. Не передавайте один изменяемый объект нескольким заданиям без подтверждённой схемы использования. Безопаснее выделять экземпляр на рабочий поток, задавать его параметры и освобождать результаты внутри того же контекста.
Очередь должна иметь ограниченную глубину и механизм обратного давления. Если загрузчик принимает тысячи PDF быстрее, чем OCR успевает их обрабатывать, накопятся растры и временные файлы. Храните в очереди путь и параметры, а изображение создавайте только после получения свободного рабочего места. Большие документы можно дробить на диапазоны с последующей упорядоченной сборкой.
Приоритеты полезны для интерактивных запросов: одна выбранная пользователем страница не должна ждать окончания ночного архива. При этом нельзя позволять коротким заданиям бесконечно вытеснять пакетные. Отдельные очереди, квоты потоков и лимиты памяти дают предсказуемую задержку без перегрузки узла.
Для повторов различайте временные и постоянные ошибки. Нехватка памяти, занятый файл или кратковременный сбой хранилища допускают повтор с задержкой; отсутствующий словарь, зашифрованный PDF или недопустимая страница требуют исправления входных данных. Бесконечный повтор одной и той же ошибки создаёт нагрузку и скрывает первопричину.
Режим скорости, точности и ограничения времени
OCRMode позволяет выбирать приоритет скорости или точности. Решение принимают по классу документа: крупный печатный текст для индекса можно обрабатывать быстрее, а мелкие суммы, серийные номера и архивные материалы — в режиме точности. Разные режимы следует сравнивать на одном эталонном наборе и фиксировать не только среднюю точность, но и ошибки критичных полей.
Определение ориентации имеет собственный уровень точности от 1 до 10 через OrientationDetectionAccuracyLevel. Повышение уровня улучшает тщательность проверки ценой времени. Для потока с редкими повёрнутыми страницами можно сначала применять быстрый уровень, а сомнительные случаи повторять с более высоким; для заранее нормализованного сканера функцию отключают.
Тайм-аут задаётся для последующих операций и должен учитывать размер страницы, число языков, контекст и производительность узла. Единый предел для маленькой квитанции и чертежа формата A3 создаёт ложные ошибки. Вычисляйте профиль по площади растра и классу документа, а превышение записывайте вместе с параметрами и временем подготовки изображения.
При выборе скорости нельзя скрывать ухудшение качества усреднением. Отчёт должен показывать долю полностью правильных ключевых полей, количество страниц без текста, распределение уверенности и частые замены символов. Ускорение на 30 процентов невыгодно, если ручная проверка счётов увеличилась вдвое.
Стабильную конфигурацию закрепляют тестами производительности и точности. После обновления пакетов или смены серверного процессора прогоняют тот же набор и сравнивают допустимые интервалы. Это обнаруживает изменение поведения до поступления производственных документов и даёт основание выбрать новый режим осознанно.
Развёртывание и совместимость среды выполнения
При подключении через NuGet различают пакет с компонентами для Windows и пакет API для кроссплатформенных сценариев. OCR-ресурсы распространяются отдельно и должны попасть в выходной каталог либо быть доступны по заданному пути. Сборка, которая успешно компилируется без словарей, может упасть только при первом AddLanguage, поэтому проверка ресурсов входит в запуск приложения.
Для проектов на современном .NET доступны Windows, Linux и macOS на поддерживаемых архитектурах, но отдельные функции просмотра, WPF, WinForms, TWAIN или COM зависят от платформы. Конвейер OCR без пользовательского интерфейса следует тестировать отдельно от слоя просмотра и сканирования. Нельзя переносить Windows-специфичный код получения изображения на Linux только заменой основного пакета.
На Linux важна версия GLIBC, а в контейнере — наличие нативных зависимостей и файлов ресурсов. Проверка должна выполняться в том же базовом образе, который используется в производстве. Если разработчик тестирует на полном дистрибутиве, а контейнер построен на минимальном образе, ошибка загрузки нативной библиотеки проявится уже после публикации.
Для Windows учитывают разрядность процесса и драйвера сканера. TWAIN-источник определённой разрядности может быть недоступен приложению другой разрядности, даже если OCR работает. Разделите диагностику: сначала перечислите источники сканирования, затем получите тестовый кадр, после чего отдельно запустите OCR. Это помогает не приписывать ошибку драйвера движку распознавания.
Ресурсные файлы следует публиковать неизменёнными и проверять контрольными суммами внутри процесса поставки. Антивирус, скрипт очистки или неверный фильтр публикации может удалить крупный словарь как неиспользуемый. Простой тест после установки должен перечислить языки, распознать короткую эталонную строку и проверить ожидаемый текст.
Лицензия и поведение пробного запуска
Пробный режим предназначен для проверки API и качества на своих документах, но вывод может содержать водяные знаки и напоминания. Эти метки нельзя путать с ошибкой OCR или дефектом исходного PDF. Тестовый отчёт должен отдельно фиксировать точность распознанных данных и визуальные ограничения пробного вывода.
Регистрационный ключ задают до создания производственного результата и не хранят в исходном коде или общедоступном конфигурационном файле. Используйте секреты среды, ограничьте доступ службы и не выводите ключ в журнал. При ошибке регистрации останавливайте задание до обработки, иначе пакет может быть создан с нежелательными метками.
Функции лицензируются по компонентам и сценарию использования, поэтому перед внедрением нужно сопоставить требуемые операции: OCR, PDF, просмотр, сканирование, таблицы, KVP, ICR или дополнительные технологии. Наличие метода в справке не гарантирует, что выбранное право использования покрывает все элементы решения. Проверку проводят на тестовом ключе с тем же набором возможностей.
В автоматической среде отслеживайте срок действия временного ключа и результат регистрации при старте каждого экземпляра. Если ключ перестал приниматься, очередь должна перейти в состояние ошибки и сохранить входные документы, а не выдавать частично обработанные файлы. Оповещение лучше отправлять до накопления большого пакета.
При оценке не удаляйте водяной знак программными средствами и не пытайтесь обходить ограничения. Правильный путь — запросить подходящий тестовый ключ, подтвердить качество и затем использовать лицензию, соответствующую развёртыванию. Это сохраняет воспроизводимость результатов и исключает юридические риски.
Контроль качества распознавания
Эталонный набор должен включать реальные классы документов: чистые сканы, копии с шумом, фотографии с перспективой, таблицы, мелкий шрифт, смешанные языки, печати и рукописные числовые поля. Для каждой страницы храните проверенный текст и критичные значения. Случайные рекламные образцы не показывают качество на собственных бланках и терминологии.
Для сплошного текста считают долю ошибочных символов и слов, но для форм важнее точность полей. Ошибка одной цифры в сумме критичнее десяти ошибок в рекламном абзаце. Разделите метрики на полнотекстовый поиск, ключевые значения, таблицы, порядок чтения и геометрию рамок; для каждого типа задайте свой допустимый порог.
Уверенность движка калибруют на фактических ошибках. Соберите слова с показателями 40, 60, 80 и 95 процентов и посмотрите, какая доля действительно верна. Если документы отличаются по качеству, единый порог может быть недостаточен: для MRZ с контрольными цифрами допустим более низкий OCR-порог при успешной проверке, а для свободного текста потребуется другой критерий.
Сохраняйте причину ручной коррекции: неверный символ, неправильная зона, пропущенное поле, ошибочная пара, порядок колонок или дефект изображения. Эта разметка показывает, где улучшать конвейер. Если большинство ошибок связано с перекошенной подачей, добавление словаря не поможет; если страдают артикула, полезнее whitelist и пользовательский словарь.
Регрессионный тест запускают после изменения DPI, предобработки, языков, версии пакетов или правил постобработки. Результаты сравнивают с предыдущим базовым уровнем по каждому классу. Улучшение счетов не должно незаметно ухудшить паспорта или таблицы; профиль конфигурации можно разделить по типам документов.
Типовые ошибки и их устранение
Язык не добавляется
Если AddLanguage возвращает ошибку, сначала проверьте ResourcesFolder, существование нужного файла, права чтения и фактический список из GetAvailableLanguages. Не переходите сразу к RunOCR. В контейнере убедитесь, что ресурсы скопированы в опубликованный образ, а регистр букв пути совпадает с файловой системой.
Результат пустой или состоит из случайных знаков
Проверьте, что SetImage получил действительный идентификатор, ROI не остался от предыдущего задания, контекст соответствует разметке, а whitelist не исключил все буквы. Затем визуально откройте изображение в фактическом разрешении и проверьте ориентацию. Пустой результат на белой странице нормален; пустой результат на читаемом тексте требует проверки статуса и параметров.
Страница распознаётся медленно
Снизьте DPI до проверенного диапазона, ограничьте ROI, отключите ненужное определение ориентации, сократите число языков и проверьте режим скорости. Высокий DPI и несколько больших словарей умножают объём работы. Запишите отдельно время растеризации и OCR: иногда задержка возникает при загрузке PDF или медленном сетевом хранилище.
Поиск в PDF работает неверно
Убедитесь, что страница действительно прошла OCR и файл был сохранён без ошибки. Скопируйте фрагмент в текстовый редактор и сравните порядок символов, затем проверьте координаты слов. Если исходная страница уже имела текст, выясните, была ли она пропущена или растеризована повторно. Для сложных колонок скорректируйте сегментацию, а не только язык.
Память растёт от страницы к странице
Освобождайте каждый OCR-результат, идентификатор изображения и объект PDF в правильной области жизни. Не храните растры всех страниц одновременно и ограничьте параллелизм. Сериализованный результат или нужные поля можно сохранить, после чего внутренние структуры движка больше не нужны. Профилировщик должен показывать стабильный уровень после завершения задания.
Цифры путаются с буквами
Для числовой зоны задайте CharacterSet, используйте контекст строки или слова, увеличьте эффективный размер символов и проверьте контраст. Затем примените формат, длину и контрольную сумму. Не заменяйте символы глобально во всём документе: правило для номера счёта не подходит к обычному тексту.
Таблица разбивается неправильно
Сравните исходное и очищенное изображение, проверьте линии, объединённые ячейки и наклон. Получите рамки таблицы, строк, столбцов и ячеек, а не только текст. Если линия касается символов, попробуйте отдельную копию без линий для OCR и сохраните геометрию из исходника. Сложный заголовок может потребовать правил объединения.
PDF зашифрован или страница уже содержит текст
Не повторяйте OcrPage без изменения условий. Для зашифрованного документа получите разрешённую рабочую копию, для текстовой страницы выберите пропуск или осознанную замену. PageHasText и статус загрузки должны входить в предварительную проверку каждого документа.
Практические сценарии
Архив сканированных договоров
Пакет договоров сначала классифицируют по языку и качеству, затем страницы без текста распознают при 300 DPI и сохраняют с невидимым слоем. Для каждого файла проверяют число страниц, поиск по номеру договора и фамилии, соответствие PDF/A выбранному профилю и отсутствие ошибок сохранения. Сплошной текст отправляют в индекс, а исходный скан сохраняют неизменным.
Счета и банковские документы
Страница проходит коррекцию перекоса и KVP-распознавание. Приложение получает ключ, значение, тип, уверенность, рамки и признак сильной связи; суммы и даты дополнительно валидируются, IBAN и другие номера проверяются по правилам. Слабые пары показываются оператору вместе с фрагментом изображения. Табличные позиции извлекаются через сетку ячеек, а не из сплошной строки.
Фиксированная анкета
Для каждой версии формы задают координаты полей, контекст и допустимые символы. Перед применением зон лист выравнивают по опорным элементам и приводят к ожидаемому размеру. После каждого ROI выполняют OCR, записывают значение, уверенность и рамку, затем сбрасывают область. Поля с неверной длиной или низкой уверенностью отправляются на проверку.
Паспортная машиночитаемая зона
Изображение выравнивают, находят нижнюю зону и запускают MRZ-контекст на полном наборе строк. Результат разбирают по формату, проверяют контрольные цифры и сопоставляют даты. Если проверка не проходит, повторяют распознавание на немного изменённом ROI или подготовленной копии; свободный OCR всей страницы не используется как окончательный источник паспортных данных.
Поток со сканера в поисковый PDF
Приложение открывает TWAIN-источник, получает страницы из автоподатчика, отбраковывает пустые, исправляет поворот, добавляет изображения в PDF и распознаёт каждую страницу. После сохранения файл повторно открывается, проверяется число страниц и наличие текста. В любой ветке закрывается источник и освобождаются изображения, чтобы следующий пакет мог начать работу.
Индексирование смешанной папки
Служба определяет тип файла, визуализирует поддерживаемые документы в изображения, выбирает языковой профиль и сохраняет текст с координатами. Цифровые PDF с готовым слоем не растеризуются без необходимости. Для изображений создаётся отдельная запись индекса, а при необходимости — производный поисковый PDF. Ошибки ресурсов и форматов попадают в отдельную очередь, а не теряются.
Безопасность и защита документов
Обработку можно разместить в собственной инфраструктуре, чтобы исходные документы не отправлялись во внешний OCR API. Это полезно для паспортов, финансовых документов и медицинских записей, но безопасность зависит от реализации: временные файлы, журналы, дампы ошибок и резервные копии должны защищаться так же, как исходники.
Не записывайте полный распознанный текст в обычный технический журнал. Для диагностики достаточно идентификатора задания, статуса, времени, языка, DPI и обезличенных метрик. Если нужен фрагмент, используйте контролируемое хранилище с ограниченным сроком и доступом. Ключи лицензии и пути с персональными данными также исключают из открытых логов.
Временный PDF создают в каталоге с ограниченными правами и удаляют после атомарной публикации результата. При аварии периодический очиститель удаляет устаревшие файлы, но не затрагивает активные задания. Имена файлов лучше строить из случайных идентификаторов, а исходное имя хранить в базе с подходящими правами.
Сериализованный OCR-результат содержит весь текст и координаты, поэтому его нельзя считать безобидной телеметрией. Шифруйте его при хранении, ограничивайте срок и очищайте вместе с документом. Для аналитики качества используйте обезличенные признаки либо специально подготовленный набор без персональных данных.
Проверяйте входные файлы до обработки: ограничивайте размер, количество страниц, разрешение изображений и допустимые форматы. Повреждённый или намеренно огромный документ может исчерпать память ещё на растеризации. Очередь должна иметь лимиты, тайм-ауты и изоляцию ошибок, чтобы один файл не остановил остальные задания.
Сравнение GdPicture OCR с аналогами
| Программа | Лучше подходит для | Главное ограничение |
|---|---|---|
| GdPicture OCR | Встраивания OCR, PDF, таблиц, KVP и координат в .NET-процессы | Требует разработки и отдельных ресурсов |
| PDF Commander | Ручного распознавания, правки и сохранения PDF в русскоязычном интерфейсе | Не предназначен для встраивания как OCR API |
| ABBYY FineReader PDF | Интерактивной проверки OCR и преобразования сканов в редактируемые форматы | Ориентирован на работу пользователя, а не на собственный .NET-конвейер |
| Tesseract OCR | Открытых проектов с прямым доступом к OCR-движку и языковым моделям | Нет встроенного графического интерфейса и полного PDF-процесса |
| OCRmyPDF | Автоматического добавления поискового слоя в существующие PDF | Сфокусирован на PDF и не заменяет широкий документный API |
| IronOCR | Быстрого подключения OCR изображений и PDF в .NET | Не охватывает весь набор просмотра, сканирования и PDF-операций GdPicture |
GdPicture OCR выбирают, когда приложение должно не только получить строку, но и управлять сканированием, растеризацией PDF, зонами, таблицами, формами, координатами и производными документами. PDF Commander и ABBYY FineReader PDF удобнее сотруднику, который хочет открыть файл, проверить результат глазами и сохранить его без написания кода. Tesseract подходит команде, готовой самостоятельно собирать интерфейс, подготовку изображений и PDF-обвязку. OCRmyPDF рационален для командного добавления текстового слоя в архивные PDF, а IronOCR — для более узкой .NET-задачи извлечения текста с простым API.
Сравнивать решения только по числу языков недостаточно. Для форм важны координаты, KVP и таблицы; для архива — сохранение внешнего вида, PDF/A и контроль страниц с готовым текстом; для ручной работы — редактор и проверка; для инфраструктуры — поддерживаемая среда, ресурсы и управляемая многопоточность. Выбор должен повторять реальный маршрут документа от получения до проверки результата.
Приёмочный контроль результата OCR
Качество нельзя оценивать одной общей долей совпавших символов. Для обычного текста отдельно считают ошибки символов и слов, для форм — долю правильно заполненных полей, для таблиц — совпадение структуры строк и столбцов, для KVP — правильность пары ключ–значение, а для поискового PDF — возможность найти контрольные термины на нужных страницах. Такой набор метрик показывает, где именно помогает настройка GdPicture OCR, а где проблему создаёт исходное изображение или последующая логика приложения.
Проверочный набор формируют из реальных классов документов и сохраняют исходные страницы без повторного сжатия. В него включают ровные сканы, фотографии с перспективой, страницы с поворотом, бледный текст, фоновые сетки, печати, смешанные языки, мелкий шрифт и страницы с уже существующим текстовым слоем. Для каждого образца фиксируют эталонный текст, рамки критичных слов и ожидаемые значения полей. Иначе изменение предобработки может улучшить один вид документов и незаметно ухудшить другой.
Уверенность OCR используют как признак маршрутизации, а не как абсолютную гарантию. Порог подбирают на размеченной выборке отдельно для свободного текста, чисел, дат, идентификаторов и обязательных полей. После GetWordConfidence или получения уверенности поля приложение сравнивает значение с форматом, словарём или контрольной суммой. Низкая уверенность отправляет фрагмент на проверку, а высокая не отменяет валидацию: правдоподобная замена одной цифры может пройти распознавание уверенно, но изменить номер документа.
Для геометрического результата проверяют не только наличие координат, но и их привязку к исходной странице. Рамка слова должна покрывать нужный фрагмент после учёта масштаба, поворота и преобразований, выполненных до OCR. Несколько контрольных точек на краях и в центре страницы помогают обнаружить систематическое смещение. Это особенно важно для подсветки найденного текста в просмотрщике, закрытия персональных данных, переноса значений в поля и повторного показа оператору именно той области, которую распознал движок.
Таблицы принимают по структуре: числу ожидаемых колонок, порядку заголовков, принадлежности текста ячейке и сохранению пустых позиций. Простого сравнения строк недостаточно, потому что одинаковый текст может оказаться в соседнем столбце. При тестировании сохраняют рамки таблицы, строк, столбцов и ячеек, затем сопоставляют их с эталоном. Документы с объединёнными ячейками, разорванными линиями и многострочными заголовками выделяют в отдельную группу, чтобы правила восстановления структуры не маскировали ошибки обычных таблиц.
Поисковый PDF проверяют после сохранения и повторного открытия независимым просмотрщиком. Контроль включает число страниц, возможность найти слова с разными регистрами, соответствие позиции найденного текста изображению, копирование фрагмента и отсутствие заметного изменения внешнего вида. Для многоязычных документов ищут термины на каждом языке. Если требуется PDF/A, соответствие профилю подтверждают специализированной проверкой; успешный статус OCR и открывающийся файл сами по себе не доказывают архивную корректность.
Производительность измеряют на странице и на документе, отдельно отмечая время растеризации PDF, предобработки, OCR, построения структуры и сохранения результата. Вместе со средним временем записывают медиану, медленные выбросы, пиковую память и число тайм-аутов. Тест повторяют с реальным MaxThreadCount и ограничением параллельных заданий. Ускорение считается полезным только тогда, когда не растут ошибки, расход памяти и доля документов, переданных оператору.
Проверочный маршрут перед внедрением
- Соберите набор реальных изображений и PDF, включая худшие по качеству экземпляры, и разметьте правильный текст и критичные поля.
- Разделите документы по типам, языкам и требованиям к результату: текст, поисковый PDF, таблица, KVP, MRZ или числовая зона.
- Зафиксируйте DPI, предобработку, контекст, языки, допустимые символы, тайм-аут и режим точности для каждого профиля.
- Проверьте наличие ресурсов, регистрацию, загрузку файлов, статусы каждой операции и освобождение результатов на каждом целевом узле.
- Измерьте точность слов, полей, таблиц и координат, время страницы, пиковую память и долю документов, ушедших на ручную проверку.
- Проверьте поисковый слой и экспорт в независимых приложениях, а PDF/A — профильным валидатором.
- Настройте журнал без содержимого документов, ограниченную очередь, повтор временных ошибок и отдельный канал для постоянных проблем.
- Закрепите эталонный прогон как регрессионный тест для любых изменений пакетов, ресурсов и параметров.
Готовый процесс должен одинаково хорошо отвечать на три вопроса: что было передано движку, почему результат принят и как воспроизвести ошибку. Для этого сохраняют профиль параметров, статусы, координаты, уверенность и связь с исходной страницей, а не только конечную строку. Тогда GdPicture OCR становится управляемым элементом документного конвейера: скан можно подготовить, распознать, проверить, превратить в поисковый PDF или структурированные данные и безопасно обработать исключения без ручного поиска причины.