如何获得iText7中指定关键字的位置?

时间:2019-04-23 08:36:21

标签: java pdf itext7

我想搜索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 :(得分:0)

iText7具有pdf2Data附加组件,可以轻松帮助您实现目标(并帮助处理其他数据提取案例)。

假设您要提取单词Header的位置。我们转到https://pdf2data.online演示应用程序,上载我们的模板(包含您要提取的单词的任何文件),然后转到数据字段编辑器,如下所示:

pdf2Data data field editor

现在,您可以使用选择器添加一个数据字段,该选择器将选择您感兴趣的数据。在这种情况下,您可以使用正则表达式选择器,该选择器通常非常灵活,但在我们这种情况下,设置非常简单:< / p>

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可以立即解决这些情况,使您的负担减轻。