Extraction de texte par zone à l'aide de Java

Extraire le texte d’une zone de page rectangulaire

Utilisez TextSearchOptions avec un Rectangle pour limiter l’extraction à une zone définie sur une page.

  1. Ouvrez le PDF source dans une instance Document.

  2. Créez un TextAbsorber pour collecter le texte de la zone de page sélectionnée.

  3. Créez TextSearchOptions pour le rectangle cible Rectangle et activez setLimitToPageBounds(true) pour que l’extraction reste dans la zone de page visible.

  4. Appliquez les options de recherche configurées à l’absorbeur et visitez la Page cible.

  5. Écrivez le texte extrait dans le fichier de sortie.

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());
    }
}

Extraire des paragraphes avec des informations géométriques

Utilisez ParagraphAbsorber pour inspecter les rectangles de section et les polygones de paragraphe avec le texte extrait.

  1. Ouvrez le PDF source dans une instance Document.

  2. Créez un ParagraphAbsorber et visitez la page cible Page pour créer des informations de balisage de page.

  3. Lisez le premier résultat du balisage de page et parcourez ses sections et paragraphes.

  4. Collectez chaque rectangle de section, polygone de paragraphe et le texte de paragraphe reconstruit à partir de ses lignes TextFragment.

  5. Créez le rapport de sortie avec la géométrie et les détails du texte extraits.

  6. Écrivez les détails extraits dans le fichier de sortie.

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());
    }
}