извлечение данных флажков из PDF-файлов с помощью Azure Read/OCR API

У меня есть тысячи форм опроса, которые мне нужно отсканировать, а затем загрузить в мою систему C#, чтобы извлечь данные и ввести их в базу данных. Опросы представляют собой смесь рукописных 1) текстовых полей и 2) флажков. В настоящее время я использую Azure Read Api для извлечения рукописного текста, который должен работать нормально, например. вопрос № 4 ниже возвращает «Python» и «кодирование».

Итак, мой вопрос; даст ли какой-либо Azure API (Read или OCR и т. д.) возможность извлекать данные, для которых установлен флажок? например см. вопрос № 1 ниже. Мне нужна строка, говорящая «не согласен», возможно ли это с любым API Azure или мне нужно искать в другом месте? Если да, то какой API или библиотеку я могу использовать для получения рукописных данных флажка?

Может ли кто-нибудь с iText7 или IronOCR сказать мне, позволят ли эти библиотеки извлечь данные флажка ниже?

Пример опроса:

введите здесь описание изображения


person darego101    schedule 08.11.2019    source источник
comment
если вы не попросите отметить «X» в качестве ответа, я не думаю, что это сработает для вас. Вам нужно будет использовать своего рода проверку пикселей, чтобы выяснить, помечен ли он как ответ или нет.   -  person Thiago Custodio    schedule 09.11.2019
comment
Спасибо Тьяго. Как проще всего использовать проверку пикселей в PDF-файлах?   -  person darego101    schedule 09.11.2019
comment
@Thiago Как вы думаете, может быть, я мог бы сделать что-то вроде: использовать проверку пикселей для каждого флажка, и если возвращается что-то кроме «o», это означает, что поле помечено?   -  person darego101    schedule 09.11.2019
comment
Неважно, только что заметил, что некоторые поля квадратные, поэтому читатель не вернет в них «о». Можно ли проверить наличие пробелов, если я передам пиксельные шнуры внутри ящиков?   -  person darego101    schedule 09.11.2019
comment
У вас есть только 1 тип формы с 2 страницами? Если это так, ручная проверка каждого флажка не должна быть слишком сложной - я бы сказал, утомительной!   -  person David C    schedule 09.11.2019
comment
nuget.org/packages/PDF.Core кажется, что это может быть полезно для твоя проблема.   -  person David C    schedule 09.11.2019
comment
Azure снова впечатляет. У них также есть предварительная версия продукта Form Recogniser: azure.microsoft. .com/en-in/services/cognitive-services/   -  person David C    schedule 09.11.2019
comment
@DavidC Спасибо за ответы. Я просмотрел Azure Form Recognizer и, к сожалению, в настоящее время он не поддерживает «флажки или переключатели». Мне придется заглянуть в IronPDF и посмотреть, предложит ли он мне что-нибудь с флажками.   -  person darego101    schedule 09.11.2019
comment
@DavidC, чтобы ответить на ваш первый вопрос, у меня есть 4 типа форм, каждая форма имеет 2 страницы. Не могли бы вы порекомендовать способ извлечения данных из флажков с помощью библиотеки IronOCR, которую вы связали?   -  person darego101    schedule 09.11.2019
comment
Я думаю, для того, что вам нужно сделать, вам нужно растрировать PDF в изображение, а затем найти известную точку привязки на странице для поиска. Затем найдите каждый из ваших флажков относительно этой точки привязки. Вам нужно будет установить границы вокруг каждого флажка, чтобы сказать, что если пиксели в пределах этих границ имеют › 10% пикселей, которые не являются белыми, тогда он отмечен. Что-то такое? Это немного медленно, утомительно и вручную, но достижимо! Изменить, ссылка на метод растеризации: ironpdf.com/examples/rasterize-a -pdf-в-изображения   -  person David C    schedule 11.11.2019
comment
@DavidC Привет снова, Дэвид, большое спасибо за это! Похоже, именно то, что я ищу. Если вы хотите опубликовать ответ с приведенным выше, я приму его как ответ   -  person darego101    schedule 11.11.2019
comment
Из любопытства, знаете ли вы простой способ найти границы x, y для моих PDF-файлов?   -  person darego101    schedule 11.11.2019
comment
У меня на Mac установлен GIMP, который показывает местоположение курсора в координатах x, y, хотя я уверен, что любой приличный редактор изображений также должен это делать. Я опубликую более полный ответ со всеми этими частями, хотя я все еще думаю, что мы немного далеки от законного ответа! :)   -  person David C    schedule 11.11.2019
comment
Теперь я намного ближе благодаря тебе! Я пытаюсь найти пример кода С#, чтобы проверить, превышает ли цвет пикселя x% на изображении. Это лучше всего работает с растровыми изображениями или я также могу использовать jpg?   -  person darego101    schedule 11.11.2019
comment
Если вы используете метод IronOCR Bitmap[] pageImages = pdf.ToBitmap();, он создаст массив растровых изображений. Когда у вас есть растровые изображения, вы можете использовать стандартные методы System.Drawing для растрового изображения. Одним из методов System.Drawing является bitmap.GetPixel(), который возвращает объект Color. docs.microsoft.com/ en-us/dotnet/api/   -  person David C    schedule 11.11.2019


Ответы (1)


Ответ на этот вопрос не слишком прост и включает в себя создание пользовательского кода для самостоятельного анализа PDF-файла с помощью сторонней библиотеки.

Поскольку ваши формы имеют известную форму, вы знаете расположение флажков. Вы должны создать словарь «Имя флажка» и «Данные флажка» для каждого флажка на странице. Объект данных может быть объектом, который выглядит так:

public class CheckboxData {
    public int startX { get; set; }
    public int startY { get; set; }
    public int endX { get; set; }
    public int endY { get; set; }
    public bool IsChecked { get; set; }
}

Я бы рекомендовал использовать IronOCR для растрировать PDF в изображение.

С вашим изображением перебирайте словарь флажков и, используя ограничивающие точки, перемещайте пиксель за пикселем и получайте цвет пикселя. Сохраните цвета в списке, а затем получите средний цвет всех пикселей в пределах флажка. Если среднее значение превышает пороговое значение для определения того, проверено ли оно, установите логическое значение IsChecked.

Для флажков в стиле радио вам, вероятно, понадобится другой объект данных и сохраните центральный пиксель круга. Для кругов вы должны сохранить centerX и centerY вместе с радиусом круга и использовать алгоритм круга Брезенхема, чтобы узнать, какие пиксели вокруг него нужно проверить.

Ниже приведен пример получения координат пикселя в GIMP для того места, где находится курсор. Получение пиксельных координат файла изображения

person David C    schedule 10.11.2019
comment
Еще раз спасибо, Дэвид, очень ценю помощь - person darego101; 11.11.2019
comment
Еще раз привет, приятель, у меня работает извлечение рукописного текста, так что теперь я собираюсь начать смотреть на флажки. Должен ли я также хранить средний порог цвета пикселя в CheckboxData? По словарю будет ли работать что-то вроде этого: Dictionary‹string, CheckboxData› checkboxes = new Dictionary‹string, CheckboxData›? строка является именем для определенного флажка? Я просто пытаюсь найти самый простой способ перебрать все изображения из моих обзоров. Я предполагаю, что bitmap.GetPixel() позволяет мне передавать шнуры xy из CheckboxData? Или как посоветуете сделать? - person darego101; 18.11.2019