Парсинг и преобразование PDF документа в набор бизнес-объектов (БО).
С помощью библиотеки можно получить непрерывный неформатированный текст со страницы документа (даже без переносов строк). Можно провести аналогию с формами в delphi или visual studio, на которые накидано много разных элементов (label-ы, image-ы, поля ввода и т.д.). Поэтому у каждого элемента "label", содержащего часть текста со страницы можно получить координаты начала по x и y, а также некоторую информацию о стилях. Исходя из этого нельзя задать точную последовательность, в которой label-ы расположены друг за другом, поэтому при разборе текста необходимо учитывать координаты элементов.
Промежуточным итогом разбора являеются строки (или части строк), символы в которых получены из label-ов, обладающих определенной степенью близости.
Затем полученные строки можно парсить: извлекать из них нужные данные. Будем исходить из предположения, что все строки располагаются друг за другом именно в том порядке, в котором мы читаем текст в документе. Но при разборе возможны проблемы, например:
у нас есть текст "Шифр: 123", этот текст может быть разнесен по строкам следующим образом:
- "Шифр:", " 123"
- "Шифр", ":", " 123"
- "Шифр", ": 123"
Поэтому при парсинге используется конечный автомат, который имеет следующие ограничения:
- Состояние должно начинаться обязательно с новой строки (чтобы исключить срабатывания внутри текста значения, например, внутри многострочного описания запроса
- Состояние должно начинаться с текста: <Ключ> [текст, не являющийся ключом или значением]<:><Значение>
- Начальное состояние не определено, при первой встрече строки, являющейся каким-то заданным состоянием, текущее состояние меняется на найденное
- Разбор ведется до конца страницы, последнее состояние не имеет переходов в другие состояния.
При парсинге мы также сохраняем номер страницы, на которой было описано обращение. Это необходимо для того, чтобы при повторном проходе по документу (при извлечении изображений), можно было определить, к какому обращению это изображение относится.
Для реализации разбора и прикрепления изображений потребуется дополнительно 1 день на разработку. Изображения извлекаются из ресурсов страницы pdf-документа, к которой они прикреплены и никак не связаны с текстом, отображаемым на странице. Изображения извлекаются во внутреннем формате pdfbox, и затем могут быть преобразованы либо в файлы (с помощью функций pdfbox), либо в поток данных, который затем может быть сохранен где-то извне парсера.
Исходный формат изображений сохраняется (поддерживаются форматы .jpg, .png, .gif, .tiff, .bmp). У автоматически распознанных pdf-документов есть особенность (наблюдается в прикрепленном примере документа): система распознавания документа помимо распознанного текста прикрепляет к документу исходное изображение в ужатом качестве (насколько я понял, такие изображения прикреплять при парсинге не надо).
Парсер 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 - модель обращения