Skip to content

a-poliakov/Pdf2Appeals

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Pdf2Appeals

Парсинг и преобразование PDF документа в набор бизнес-объектов (БО).

1. Разбор текста:

С помощью библиотеки можно получить непрерывный неформатированный текст со страницы документа (даже без переносов строк). Можно провести аналогию с формами в delphi или visual studio, на которые накидано много разных элементов (label-ы, image-ы, поля ввода и т.д.). Поэтому у каждого элемента "label", содержащего часть текста со страницы можно получить координаты начала по x и y, а также некоторую информацию о стилях. Исходя из этого нельзя задать точную последовательность, в которой label-ы расположены друг за другом, поэтому при разборе текста необходимо учитывать координаты элементов.

Промежуточным итогом разбора являеются строки (или части строк), символы в которых получены из label-ов, обладающих определенной степенью близости.

Затем полученные строки можно парсить: извлекать из них нужные данные. Будем исходить из предположения, что все строки располагаются друг за другом именно в том порядке, в котором мы читаем текст в документе. Но при разборе возможны проблемы, например:

у нас есть текст "Шифр: 123", этот текст может быть разнесен по строкам следующим образом:

  1. "Шифр:", " 123"
  2. "Шифр", ":", " 123"
  3. "Шифр", ": 123"

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

  1. Состояние должно начинаться обязательно с новой строки (чтобы исключить срабатывания внутри текста значения, например, внутри многострочного описания запроса
  2. Состояние должно начинаться с текста: <Ключ> [текст, не являющийся ключом или значением]<:><Значение>
  3. Начальное состояние не определено, при первой встрече строки, являющейся каким-то заданным состоянием, текущее состояние меняется на найденное
  4. Разбор ведется до конца страницы, последнее состояние не имеет переходов в другие состояния.

При парсинге мы также сохраняем номер страницы, на которой было описано обращение. Это необходимо для того, чтобы при повторном проходе по документу (при извлечении изображений), можно было определить, к какому обращению это изображение относится.

2. Разбор изображений:

Для реализации разбора и прикрепления изображений потребуется дополнительно 1 день на разработку. Изображения извлекаются из ресурсов страницы pdf-документа, к которой они прикреплены и никак не связаны с текстом, отображаемым на странице. Изображения извлекаются во внутреннем формате pdfbox, и затем могут быть преобразованы либо в файлы (с помощью функций pdfbox), либо в поток данных, который затем может быть сохранен где-то извне парсера.

Исходный формат изображений сохраняется (поддерживаются форматы .jpg, .png, .gif, .tiff, .bmp). У автоматически распознанных pdf-документов есть особенность (наблюдается в прикрепленном примере документа): система распознавания документа помимо распознанного текста прикрепляет к документу исходное изображение в ужатом качестве (насколько я понял, такие изображения прикреплять при парсинге не надо).

3. Реализация парсера:

Парсер pdf-документа состоит из следующих классов: TextExtractor - извлекает страницы и текст на них из pdf-документа Page - абстракция для хранения данных извлеченных из pdf страниц TextRow - "строка" текста, извлеченная с определенной страницы документа Для разбора извлеченных строк и страниц документа используются следующие интерфейсы:

/**
 * Парсер для распознаных страниц PDF в нужный нам тип
 */
public interface IParser  {
    List parse (List pages);
}

/**
 * Состояния парсера страниц PDF
 */
public interface IState {
    String getStateCode();
    String getStateTitle();
}

Для разбора документов в данной задаче созданы следующие реализации парсера:

  • AppealParser - парсер обращений
  • AppealState - возможные состояния, которые может принимать парсер
  • Appeal - модель обращения

About

Парсинг и преобразование PDF документа в бизнес-объекты (например, заявки)

Topics

Resources

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages