Извлечение абзаца из PDF
Извлечение текста из PDF-документа в форме абзацев
Мы можем получить текст из PDF-документа, выполнив поиск определенного текста (используя “обычный текст” или “регулярные выражения”) на одной странице или во всем документе, или мы можем получить полный текст одной страницы, диапазона страниц или всего документа. Однако, в некоторых случаях вам требуется извлечь абзацы из PDF-документа или текст в виде абзацев. Мы реализовали функциональность для поиска разделов и абзацев в тексте страниц PDF-документа. Мы представили класс ParagraphAbsorber (как TextFragmentAbsorber и TextAbsorber), который можно использовать для извлечения абзацев из PDF-документов. Существует два следующих способа, которыми вы можете использовать ParagraphAbsorber:
1- Путем обведения границ разделов и абзацев текста на странице PDF:
public static void ExtractParagraph() {
// Путь к каталогу с документами.
Document doc = new Document(_dataDir + "input.pdf");
Page page = doc.getPages().get_Item(2);
ParagraphAbsorber absorber = new ParagraphAbsorber();
absorber.visit(page);
PageMarkup markup = absorber.getPageMarkups().get(0);
for (MarkupSection section : markup.getSections()) {
DrawRectangleOnPage(section.getRectangle(), page);
for (MarkupParagraph paragraph : section.getParagraphs()) {
DrawPolygonOnPage(paragraph.getPoints(), page);
}
}
doc.save(_dataDir + "output_out.pdf");
}
private static void DrawRectangleOnPage(Rectangle rectangle, Page page) {
page.getContents().add(new GSave());
page.getContents().add(new ConcatenateMatrix(1, 0, 0, 1, 0, 0));
page.getContents().add(new SetRGBColorStroke(0, 1, 0));
page.getContents().add(new SetLineWidth(2));
page.getContents()
.add(new Re(rectangle.getLLX(), rectangle.getLLY(), rectangle.getWidth(), rectangle.getHeight()));
page.getContents().add(new ClosePathStroke());
page.getContents().add(new GRestore());
}
private static void DrawPolygonOnPage(Point[] polygon, Page page) {
page.getContents().add(new GSave());
page.getContents().add(new ConcatenateMatrix(1, 0, 1, 0, 0));
page.getContents().add(new SetRGBColorStroke(0, 0, 1));
page.getContents().add(new SetLineWidth(1));
page.getContents().add(new MoveTo(polygon[0].getX(), polygon[0].getY()));
for (int i = 1; i < polygon.length; i++) {
page.getContents().add(new LineTo(polygon[i].getX(), polygon[i].getY()));
}
page.getContents().add(new LineTo(polygon[0].getX(), polygon[0].getY()));
page.getContents().add(new ClosePathStroke());
page.getContents().add(new GRestore());
}
2- Путем итерации по коллекции абзацев и получения их текста:
public static void ExtractParagraph02() {
// Открыть существующий PDF файл
Document doc = new Document(_dataDir + "input.pdf");
// Инициализация ParagraphAbsorber
ParagraphAbsorber absorber = new ParagraphAbsorber();
absorber.visit(doc);
for (PageMarkup markup : absorber.getPageMarkups()) {
int i = 1;
for (MarkupSection section : markup.getSections()) {
int j = 1;
for (MarkupParagraph paragraph : section.getParagraphs()) {
StringBuilder paragraphText = new StringBuilder();
for (java.util.List<TextFragment> line : paragraph.getLines()) {
for (TextFragment fragment : line) {
paragraphText.append(fragment.getText());
}
paragraphText.append("\r\n");
}
paragraphText.append("\r\n");
System.out.println("Абзац " + j + " раздела " + i + " на странице" + ":" + markup.getNumber());
System.out.println(paragraphText.toString());
j++;
}
i++;
}
}
}