Каждая организация в процессе своей деятельности рано или поздно сталкивается с необходимостью охраны своих активов.
Компании заключают договоры на организацию пропускного режима, круглосуточной охраны офисов, производственных площадок, складов, грузов.
В желании как можно лучше защитить своё имущество, мы порой упускаем из виду целый ряд факторов влияющих на нерациональное расходование денежных средств:
- Один объект может охраняться несколькими видами охраны (физическая, пультовая) и, как следствие, время охраны пересекается;
- В периметре одного охраняемого объекта есть отдельные помещения, которые ставятся на самостоятельную охрану, т.е. дробление объекта на несколько частей;
- Охрана мелкого имущества не группой, а самостоятельными объектами.
Всё это рождает двойные расходы.
Как с помощью инструментов Abbyy Fine Reader и Python найти дублирование оплаты за охрану активов?
Для преобразования PDF в удобный вид используется Abbyy Fine reader, а точнее его часть — hot folder. Hot Folder это приложение-планировщик, входящий в состав пакета FineReader и позволяющий назначить время обработки документов из выбранной папки в то время, когда компьютер наименее загружен, например, ночью.

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

В качестве выходного формата мы указали TXT. Таким образом документы приняли вид привычных и простых для дальнейшей обработки файлов с «плоским текстом».

На следующем этапе в работу включается Python, который поможет автоматизировать процесс извлечения необходимой информации.
Зная примерную структуру сканированных документов, удалось отсечь часть ненужной информации, оставив только данные из приложения. В нашем случае полезная информация в файле следует после строки с текстом «стоимости услуг пультовой охраны и технического обслуживания»
#берем данные начиная с определенной строки
for n in range(0, len(text_lines)):
if text_lines[n].lower().__contains__('стоимости услуг пультовой охраны и технического обслуживания'):
text_lines = text_lines[n:]
break
Полученные строки анализируются с помощью регулярных выражений на предмет содержания в них информации об отделении (ВСП) или номера банкомата:
for n in range(0, len(text_lines)):
vsp = ''
row = text_lines[n].replace('г.\t', 'г. ').replace('с.\t', 'с. ').replace('д.\t', 'д. ').replace('\n', '')
col = row.split('\t')
if len(col) < 3:
continue
key = re.sub('^\d*,', '', col[2].replace(' ', ''))
try:
vsp = re.findall('(\d{4}\s*[/\\\]\s*\d{1,})', row)[0].replace('\\', '_').replace('/', '_')
if vsp in data:
data[vsp].append(row)
else:
data[vsp] = [row]
except:
pass
if vsp != '' or row.lower().__contains__('банкомат'):
if key in data:
data[key].append(row)
else:
data[key] = [row]
Подобный подход позволяет сопоставить каждую строку с соответствующим отделением или банкоматом. Если какому-либо банкомату или отделению соответствует более чем одна строка – это повод для проверки.
Всё гениальное – просто!