使用 Java 的基于区域的提取
Contents
[
Hide
]
从矩形页面区域提取文本
使用 TextSearchOptions 带有一个 Rectangle 将提取限制在页面的指定区域。
- 使用 Document 实例打开源 PDF。
- 创建一个 TextAbsorber 用于从选定的页面区域收集文本。
- 创建 TextSearchOptions 针对目标 Rectangle 并启用
setLimitToPageBounds(true)因此,提取保持在可见页面框内。 - 将配置好的搜索选项应用于吸收器并访问目标 Page。
- 将提取的文本缓冲区写入输出文件。
public static void extractTextFromRegion(Path inputFile, Path outputFile, int pageNumber, Rectangle rectangle)
throws Exception {
try (Document document = new Document(inputFile.toString())) {
TextAbsorber absorber = new TextAbsorber();
TextSearchOptions options = new TextSearchOptions(rectangle);
options.setLimitToPageBounds(true);
absorber.setTextSearchOptions(options);
document.getPages().get_Item(pageNumber).accept(absorber);
Files.writeString(outputFile, absorber.getText());
}
}
提取带有几何信息的段落
使用 ParagraphAbsorber 检查节矩形和段落多边形以及提取的文本。
- 使用 Document 实例打开源 PDF。
- 创建一个 ParagraphAbsorber 并访问目标 Page 以构建页面标记信息。
- 读取第一个页面标记结果并遍历其章节和段落。
- 收集每个章节矩形、段落多边形,以及从中重建的段落文本。 TextFragment 行。
- 构建带有几何和提取文本详细信息的输出报告。
- 将提取的详细信息写入输出文件。
public static void extractParagraphsWithGeometry(Path inputFile, Path outputFile) throws Exception {
try (Document document = new Document(inputFile.toString())) {
ParagraphAbsorber absorber = new ParagraphAbsorber();
absorber.visit(document.getPages().get_Item(1));
PageMarkup pageMarkup = absorber.getPageMarkups().get(0);
StringBuilder text = new StringBuilder();
int sectionIndex = 1;
for (MarkupSection section : pageMarkup.getSections()) {
text.append("Section ").append(sectionIndex)
.append(": rectangle = ").append(section.getRectangle()).append("\n");
int paragraphIndex = 1;
for (MarkupParagraph paragraph : section.getParagraphs()) {
text.append(" Paragraph ").append(paragraphIndex)
.append(": polygon = ").append(Arrays.toString(paragraph.getPoints())).append("\n");
StringBuilder paragraphText = new StringBuilder();
for (List<TextFragment> line : paragraph.getLines()) {
for (TextFragment fragment : line) {
paragraphText.append(fragment.getText());
}
paragraphText.append("\r\n");
}
text.append(" Text: ").append(paragraphText).append("\n\n");
paragraphIndex++;
}
sectionIndex++;
}
Files.writeString(outputFile, text.toString());
}
}