Как я могу получить позицию указанного ключевого слова в iText7? - PullRequest
0 голосов
/ 23 апреля 2019

Я хочу найти все подходящие ключевые слова в файле PDF и получить их позицию на странице, которую они нашли.

Я только что нашел какой-то код в iText5, который выглядит так, как мне нужно

for (i = 1; i <= pageNum; i++)
    {
        pdfReaderContentParser.processContent(i, new RenderListener()
        {

            @Override
            public void renderText(TextRenderInfo textRenderInfo)
            {
                String text = textRenderInfo.getText();
                if (null != text && text.contains(KEY_WORD))
                {
                    Float boundingRectange = textRenderInfo
                            .getBaseline().getBoundingRectange();
                    resu = new float[3];
                    System.out.println("======="+text);
                    System.out.println("h:"+boundingRectange.getHeight());
                    System.out.println("w:"+boundingRectange.width);
                    System.out.println("centerX:"+boundingRectange.getCenterX());
                    System.out.println("centerY:"+boundingRectange.getCenterY());
                    System.out.println("x:"+boundingRectange.getX());
                    System.out.println("y:"+boundingRectange.getY());
                    System.out.println("maxX:"+boundingRectange.getMaxX());
                    System.out.println("maxY:"+boundingRectange.getMaxY());
                    System.out.println("minX:"+boundingRectange.getMinX());
                    System.out.println("minY:"+boundingRectange.getMinY());
                    resu[0] = boundingRectange.x;
                    resu[1] = boundingRectange.y;
                    resu[2] = i;
                }
            }

            @Override
            public void renderImage(ImageRenderInfo arg0)
            {
            }

            @Override
            public void endTextBlock()
            {

            }

            @Override
            public void beginTextBlock()
            {
            }
        });

Но я не знаю, как с этим справиться в iText7.

1 Ответ

0 голосов
/ 25 апреля 2019

iText7 имеет надстройку pdf2Data , которая может легко помочь вам в достижении вашей цели (и помочь в других случаях извлечения данных).

Допустим, вы хотите извлечь позиции слова Header. Мы идем в демонстрационное приложение https://pdf2data.online, загружаем наш шаблон (любой файл, содержащий слова, которые вы хотите извлечь), и идем в редактор полей данных, который выглядит следующим образом:

pdf2Data data field editor

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

data field configuration

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

Теперь вы можете просмотреть информацию о том, как включить pdf2Data в ваш проект, на этой странице: https://pdf2data.online/gettingStarted, примерно код, который вам нужен, следующий:

LicenseKey.loadLicenseFile("license.xml");

Template template = Pdf2DataExtractor.parseTemplateFromPDF("Template.pdf");
Pdf2DataExtractor extractor = new Pdf2DataExtractor(template);
ParsingResult result = extractor.recognize("toParse.pdf");
for (ResultElement element : result.getResults("Headers")) {
    Rectangle bbox = element.getBbox();
    int page = element.getPage();
    System.out.println(MessageFormat.format("Coordinates on page {0}: [{1}, {2}, {3}, {4}]",
            page, bbox.getX(), bbox.getY(), bbox.getX() + bbox.getWidth(), bbox.getY() + bbox.getHeight()));
}

Пример вывода:

Coordinates on page 1: [38.5, 788.346, 77.848, 799.446]
Coordinates on page 1: [123.05, 788.346, 162.398, 799.446]
Coordinates on page 1: [207.6, 788.346, 246.948, 799.446]
Coordinates on page 2: [38.5, 788.346, 77.848, 799.446]
Coordinates on page 2: [123.05, 788.346, 162.398, 799.446]
Coordinates on page 2: [207.6, 788.346, 246.948, 799.446]

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

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