таблица разбора iTextSharp - PullRequest
0 голосов
/ 11 ноября 2019

Использование iTextSharp v5.5.13

У меня огромное количество PDF-файлов, которые мне нужно проанализировать. Около 5% из них имеют таблицу с данными, которые мне также нужны.

Таблица выглядит следующим образом: enter image description here

Большую часть времени мне нужна строкаразобрать как
2 januari 15 januari € 49,49 € 21,57 € 15,09 € 34,39

Я могу работать с этим. Я делю по пробелам, и это работает.
Но иногда в названии месяца есть дополнительный пробел: janu ari

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

var rect = new System.util.RectangleJ(70, 425, 460, 200);
RenderFilter[] filter = { new RegionTextRenderFilter(rect) };
ITextExtractionStrategy strategy =
    new FilteredTextRenderListener(new MyLocationTextExtractionStrategy(), filter);
var lines = PdfTextExtractor.GetTextFromPage(reader, pageNumber, strategy).Split('\n');

Мое переопределение выглядит так:

public class MyLocationTextExtractionStrategy : LocationTextExtractionStrategy
{
    protected override bool IsChunkAtWordBoundary(TextChunk chunk, TextChunk previousChunk)
    {
        var dist = chunk.DistanceFromEndOf(previousChunk);
        return dist < -chunk.CharSpaceWidth || dist > chunk.CharSpaceWidth / 2.0f;
    }
}

Я нашел это Google. Но это не решает мою проблему.
В случае janu ari dist больше -chunk.CharSpaceWidth, и я не уверен, что делать дальше.

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

1 Ответ

1 голос
/ 11 ноября 2019

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

В этом случае ваши данные всегда:

  • 2 группы:
    • 1 или 2 цифры (день месяца)
    • некоторые символы (название месяца)
  • 4 группы:
    • Символ евро
    • несколько цифр (хотя бы одна)
    • запятая
    • 2 цифры

В 2 januari 15 januari € 49,49 € 21,57 € 15,09 € 34,39 пробелы являются символами разделения, но с такими хорошо структурированными данными вы неТ даже нужны пробелы. Так что просто отбросьте их, и тогда ваши данные станут 2januari15januari€49,49€21,57€15,09€34,39.

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

  • 2группы:
    • [0-9]{1,2}
    • [a-z]*
  • 4 группы:
    • [0-9]{1,}
    • ,
    • [0-9]{2}

Как вы сами писали в комментариях, один из возможных регулярных результатовВыражение может быть:

new Regex(@"([0-9]{1,2})([a-z]*)([0-9]{1,2})([a-z]*)(€[0-9]{1,},[0-9]{2})(€[0-9]{1,},[0-9]{2})(€[0-9]{1,},[0-9]{2})(€[0-9]{1,},[0-9]{2})")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...