我想搜索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中处理它。
答案 0 :(得分:0)
iText7具有pdf2Data附加组件,可以轻松帮助您实现目标(并帮助处理其他数据提取案例)。
假设您要提取单词Header
的位置。我们转到https://pdf2data.online演示应用程序,上载我们的模板(包含您要提取的单词的任何文件),然后转到数据字段编辑器,如下所示:
现在,您可以使用选择器添加一个数据字段,该选择器将选择您感兴趣的数据。在这种情况下,您可以使用正则表达式选择器,该选择器通常非常灵活,但在我们这种情况下,设置非常简单:< / p>
您会看到编辑器应用程序突出显示了我们正在搜索的所有单词。现在,让我们回到第一步(在编辑器的右上角有一个图标可以返回到演示),然后下载我们的模板(链接到与上传文件相对应的图标底部)。
现在您可以在此页面上查看有关如何在项目中包括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可以立即解决这些情况,使您的负担减轻。