Как определить строку подписи в PDF-документе, а затем вставить подпись?

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

Мой первый подход заключался в том, чтобы попытаться прочитать документ с помощью iTextSharp, а затем вставить его подпись в поле, которое, скорее всего, было полем для подписи:

public string[] MassFieldEdit(IDictionary<string, string> userData, string originalDocument, string edittedDocument, bool flatten)
        {
            PdfReader reader = new PdfReader(originalDocument);
            reader.SelectPages("1-" + reader.NumberOfPages.ToString());
            using (PdfStamper stamper = new PdfStamper(reader, new FileStream(edittedDocument, FileMode.Create)))
            {
                AcroFields form = stamper.AcroFields;
                ICollection<string> fieldKeys = form.Fields.Keys;
                List<string> leftover = new List<string>(fieldKeys);
                foreach (string fieldKey in fieldKeys)
                {
                    foreach (KeyValuePair<string, string> s in user)
                    {
                        //Replace Form field with my custom data
                        if (fieldKey.ToLower().Contains(s.Key.ToLower()))
                        {
                            form.SetField(fieldKey, s.Value);
                            leftover.Remove(fieldKey);
                        }
                    }
                }
                //The below will make sure the fields are not editable in
                //the output PDF.
                stamper.FormFlattening = flatten;
                return leftover.ToArray();
            }
        }

Это работает, беря набор словарей, ключ которого является словом или фразой, проверяя его по полям PDF и затем вставляя значение в поля, если поле совпадает со словом или фразой в ключе.

Поле для подписи перед его редактированием моей программой.

Поле для подписи после.

Но проблема, с которой я столкнулся сейчас, заключается в том, что если поля не существует, тогда, хотя у него может быть «знак здесь» рядом с пунктирной линией, нет способа вставить текст в пунктирную линию, не зная точно, где находится пунктирная линия, и не может мой пользователь выбирает пунктирную линию, потому что это нарушает суть программы.

Я просмотрел ряд предыдущих вопросов и ответов, в том числе:

Честно говоря, я застрял, я впервые работаю с PDF-документами. Мне нужен способ обнаружить линию подписи, а затем вставить его имя в строку подписи с большей уверенностью, чем делать снимки по названиям полей. Как в ситуациях, когда существует правильно помеченное поле, так и в ситуациях, когда строка подписи может быть не более, чем строкой текста с надписью «подпишите здесь».

Мы будем благодарны за любую помощь, даже частичные решения и толчки в правильном направлении.


person Kris    schedule 07.08.2017    source источник
comment
Вам повезет, если вы получите настоящие поля, а не просто отсканированное изображение. Но каков источник форм? Подайте жалобу в ADA и исправьте формы.   -  person Garr Godfrey    schedule 07.08.2017
comment
Некоторые из примеров, которые он прислал мне, включают TWC Substitute W-9 и форму прямого депозита, а также другие официальные документы. Я ищу программное решение, которое будет работать для любого типа PDF-файла, содержащего строку подписи. Я рассмотрел подход оптического распознавания символов, но я хотел бы знать, есть ли уже доступное решение, прежде чем я пойду по этому пути.   -  person Kris    schedule 07.08.2017


Ответы (1)


Надежное решение (также известное как «решение для тяжелой работы»)

  1. Реализовать IEventListener (класс iText7)
  2. Используйте IEventListener, чтобы получать уведомления об инструкциях по отрисовке текста и операциях рисования линий.
  3. Инструкции по рендерингу не всегда появляются в логическом (читаемом) порядке. Исправьте это, реализовав компаратор для этих объектов.
  4. Сортировать по компаратору
  5. Используйте определение языка для определения языка (подход n-граммов прост, но его должно хватить)
  6. Атака по словарю. Ищите все слова, означающие «подпишите здесь», на любом языке, на котором написан документ (отсюда шаг 5)
  7. В случае нескольких кандидатов или отсутствия кандидатов используйте инструкции отрисовки линии, чтобы найти вероятного кандидата печально известной «пунктирной линии».

Этот подход непрост, но существует множество исследований в области распознавания структурных элементов в файлах pdf. В частности, если вы запустите поиск в Google Scholar, вы найдете множество полезных статей, в которых люди пытались обнаружить таблицы, списки, абзацы и т. Д.

person Joris Schellekens    schedule 07.08.2017