Extraire les données de tableaux PDF avec Java

Extraire des tableaux d’un PDF

Utilisez TableAbsorber pour rechercher des tableaux sur chaque page et parcourir les lignes, les cellules, les fragments de texte et les segments de texte.

  1. Ouvrez le PDF source dans une instance Document.

  2. Parcourez les pages Page car les tableaux sont détectés page par page.

  3. Créez un TableAbsorber pour chaque page et appelez visit(page) pour remplir la liste des tableaux détectés.

  4. Parcourez les objets AbsorbedTable, AbsorbedRow, AbsorbedCell, TextFragment et TextSegment détectés.

  5. Reconstituez le texte de chaque ligne à partir du contenu du fragment et affichez les données du tableau.

public static void extractTablesFromPdf(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        for (Page page : document.getPages()) {
            TableAbsorber absorber = new TableAbsorber();
            absorber.visit(page);

            for (AbsorbedTable table : absorber.getTableList()) {
                System.out.println("Table");
                for (AbsorbedRow row : table.getRowList()) {
                    StringBuilder rowText = new StringBuilder();
                    for (AbsorbedCell cell : row.getCellList()) {
                        if (rowText.length() > 0) {
                            rowText.append("|");
                        }
                        StringBuilder cellText = new StringBuilder();
                        for (TextFragment fragment : cell.getTextFragments()) {
                            StringBuilder fragmentText = new StringBuilder();
                            for (TextSegment segment : fragment.getSegments()) {
                                fragmentText.append(segment.getText());
                            }
                            if (cellText.length() > 0) {
                                cellText.append("|");
                            }
                            cellText.append(fragmentText);
                        }
                        rowText.append(cellText);
                    }
                    System.out.println(rowText);
                }
            }
        }
    }
}

Extraire un tableau d’une zone marquée spécifique

Cet exemple recherche une annotation carrée, compare son rectangle à chaque tableau détecté et génère uniquement les tableaux situés à l’intérieur de la région marquée.

  1. Ouvrez le PDF source dans une instance Document.

  2. Obtenez la page cible Page et localisez l’annotation carrée Annotation qui marque la région d’extraction.

  3. Créez un TableAbsorber et appelez visit(page) pour détecter les tableaux sur cette page.

  4. Pour chaque tableau AbsorbedTable détecté, comparez son rectangle Rectangle aux limites du rectangle de l’annotation.

  5. Parcourez les objets AbsorbedRow et AbsorbedCell correspondants et reconstruisez le texte de la ligne.

  6. Affichez les données du tableau pour la région marquée uniquement.

public static void extractTableFromSpecificArea(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        Page page = document.getPages().get_Item(1);

        Annotation squareAnnotation = null;
        for (Annotation annotation : page.getAnnotations()) {
            if (annotation.getAnnotationType() == AnnotationType.Square) {
                squareAnnotation = annotation;
                break;
            }
        }

        if (squareAnnotation == null) {
            System.out.println("No square annotation found.");
            return;
        }

        TableAbsorber absorber = new TableAbsorber();
        absorber.visit(page);

        for (AbsorbedTable table : absorber.getTableList()) {
            Rectangle tableRect = table.getRectangle();
            Rectangle annotationRect = squareAnnotation.getRect();

            boolean isInRegion = annotationRect.getLLX() < tableRect.getLLX()
                    && annotationRect.getLLY() < tableRect.getLLY()
                    && annotationRect.getURX() > tableRect.getURX()
                    && annotationRect.getURY() > tableRect.getURY();

            if (isInRegion) {
                for (AbsorbedRow row : table.getRowList()) {
                    StringBuilder rowText = new StringBuilder();
                    for (AbsorbedCell cell : row.getCellList()) {
                        if (rowText.length() > 0) {
                            rowText.append("|");
                        }
                        StringBuilder cellText = new StringBuilder();
                        for (TextFragment fragment : cell.getTextFragments()) {
                            StringBuilder fragmentText = new StringBuilder();
                            for (TextSegment segment : fragment.getSegments()) {
                                fragmentText.append(segment.getText());
                            }
                            if (cellText.length() > 0) {
                                cellText.append("|");
                            }
                            cellText.append(fragmentText);
                        }
                        rowText.append(cellText);
                    }
                    System.out.println(rowText);
                }
            }
        }
    }
}

Exporter des tableaux vers Excel

  1. Ouvrez le PDF source dans une instance Document.

  2. Créez ExcelSaveOptions pour l’exportation.

  3. Définissez le format de sortie Excel sur XLSX afin que la disposition du tableau détectée soit écrite sous forme de classeur Excel.

  4. Appelez document.save(outputFile.toString(), excelSave) pour exporter le document au format Excel.

public static void exportTablesToExcel(Path inputFile, Path outputFile) {
    try (Document document = new Document(inputFile.toString())) {
        ExcelSaveOptions excelSave = new ExcelSaveOptions();
        excelSave.setFormat(ExcelSaveOptions.ExcelFormat.XLSX);
        document.save(outputFile.toString(), excelSave);
    }
}