Статьи

Как инженер должен выжить в бухгалтерии

Одно из «удовольствий», связанных с собственным бизнесом, — это ведение бухгалтерского учета.

Теперь, чтобы выжить, я попробовал несколько вещей, таких как:

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

Почему мне нужно программное обеспечение для поиска дат в файлах PDF

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

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

Первый шаг: получить текст из PDF-файлов

Возможны две ситуации: PDF-файл уже содержит текст или PDF-файл — простое изображение, и нам необходимо распознать текст с помощью методов распознавания текста.

В первом случае все относительно просто. Мы используем PDFBox для извлечения текста:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
fun getTextInPdf(fileName: String): List<PieceOfText> {
    val reader = PdfReader(FileInputStream(File(fileName)))
    val n = reader.numberOfPages
    var i = 0
    val listener = MyTextRenderListener()
    val processor = PdfContentStreamProcessor(listener)
    while (i<n) {
        val page = reader.getPageN(i + 1)
        val resourcesDic = page.getAsDict(PdfName.RESOURCES)
        processor.processContent(ContentByteUtils.getContentBytesForPage(reader, i + 1), resourcesDic)
        i++
    }
    reader.close()
    return listener.process()
}

Но, конечно, реальная жизнь всегда приносит сюрпризы. Некоторые PDF-файлы содержат один блок на абзац (отлично!), В то время как другие содержат один блок на букву .   Это означает, что мы должны посмотреть на положение каждой отдельной буквы и посмотреть, является ли она смежной с другой. В этом случае нам нужно объединить их, чтобы получить слова.

Если у нас нет текста в PDF, нам нужно использовать методы распознавания текста. Я использовал tesseract, который написан на C ++. Чтобы использовать его в JVM, я использовал пресеты javacpp .

Как только мы получим блок текстов, нам нужно разделить его на последовательности слов. Эта часть относительно проста, но не так тривиальна, как ожидалось, потому что нам нужно отслеживать точное положение каждого отдельного слова. Таким образом, при разбиении блока на слова требуется некоторая математика, чтобы найти границы каждого слова.

Второй шаг: узнайте даты

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

Теперь даты могут быть в самых разных форматах. Учтите также, что у меня есть квитанции на английском (Великобритания и США), французском, немецком и итальянском языках.

Давайте посмотрим несколько примеров.

Сначала классический ДД / ММ / ГГ:

  • 15/04/2016
  • 18-06-2016
  • 01.04.2016

Иногда вы можете найти YY / MM / DD вместо этого:

  • 2016-05-13

Месяц может быть написан на любом языке:

  • 7 мая 2016 г.
  • 18 июня 2016 г.
  • 22 апреля 2016
  • 1 июля 2016
  • 12 августа 2016 г.

Это также может быть сокращено:

  • 14 апреля 2016 г.
  • 12 апреля 2016

Конечно, есть даты, которые нельзя точно узнать, потому что американцы в какой-то момент решили, что было бы неплохо поменять месяц и день в датах. Поэтому, если я прочитаю 3/3/2016, это может быть либо 2 марта, либо 3 февраля. Это означает, что некоторые даты неоднозначны.

Третий шаг: решить, какая дата является датой заказа

Теперь счет может содержать много разных дат. Рассмотрим этот пример:

selection_260

Одна дата — это голос заказа ( комманд по-французски), другая — дата регистрации компании. Это определенно дата, в которой мы не заинтересованы.

Есть и другие примеры:

selection_263

Или еще раз:

selection_264

selection_265

Как мы справимся с этими случаями?

Ну, мы используем серию эвристик, которые, кажется, работают в большинстве случаев. Один из самых сильных ищет близкие к дате слова, такие как фактура / счет-фактура / фаттура или приказ / командир / ордина. Мы также можем использовать размер шрифта и положение даты на странице.

Эти трюки работают всегда? Нет.

Они работают довольно часто? Да, они делают.

Выводы

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

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

В конце концов, я вполне доволен этим прототипом, потому что после некоторой настройки он, кажется, правильно угадывает более 90% времени. Не плохо, совсем не плохо.

О, хорошо, я думаю, что я должен вернуться к своему учету.

Есть идеи, которые вы хотели бы автоматизировать, чтобы облегчить свою жизнь?