Extraire les données de table du PDF

Extraire des tables de PDF par programmation

Extraire des tables de PDF n’est pas une tâche triviale car la table peut être créée de différentes manières.

Aspose.PDF pour Android via Java dispose d’un outil pour faciliter la récupération des tables. Pour extraire les données de table, vous devez effectuer les étapes suivantes :

  1. Ouvrir le document - instancier un objet Document;

  2. Créer un objet TableAbsorber.

  3. Décidez quelles pages doivent être analysées et appliquez visit aux pages souhaitées. Les données tabulaires seront scannées, et le résultat sera enregistré dans une liste de AbsorbedTable. Nous pouvons obtenir cette liste via la méthode getTableList.

  4. Pour obtenir les données, itérez à travers TableList et gérez la liste des lignes absorbées et la liste des cellules absorbées. Nous pouvons accéder à la première liste en appelant la méthode getTableList et à la seconde en appelant la méthode getCellList.

  5. Chaque AbsorbedCell contient des TextFragmentCollections. Vous pouvez les traiter pour vos propres besoins.

L’exemple suivant montre l’extraction de tableau de toutes les pages :

public void extractTable () {
        // Ouvrir le document
        try {
            document=new Document(inputStream);
        } catch (Exception e) {
            resultMessage.setText(e.getMessage());
            return;
        }
        com.aspose.pdf.TableAbsorber absorber=new com.aspose.pdf.TableAbsorber();

        File file=new File(fileStorage, "extracted-text.txt");
        FileOutputStream fileOutputStream;

        try {
            fileOutputStream=new FileOutputStream(file);

        } catch (FileNotFoundException e) {
            resultMessage.setText(e.getMessage());
            return;
        }

        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(fileOutputStream));
        // Scanner les pages
        for (Page page : (Iterable<? extends Page>) document.getPages()) {
            absorber.visit(page);
            for (com.aspose.pdf.AbsorbedTable table : absorber.getTableList()) {
                try {
                    bw.write("Table");
                    bw.newLine();
                    // Itérer à travers la liste des rangées
                    for (com.aspose.pdf.AbsorbedRow row : table.getRowList()) {
                        // Itérer à travers la liste des cellules
                        for (com.aspose.pdf.AbsorbedCell cell : row.getCellList()) {
                            for (com.aspose.pdf.TextFragment fragment : cell.getTextFragments()) {
                                StringBuilder sb=new StringBuilder();
                                for (TextSegment seg :
                                        (Iterable<? extends TextSegment>) fragment.getSegments())
                                    sb.append(seg.getText());
                                bw.write(sb.toString() + "|");
                            }
                        }
                        bw.newLine();
                    }
                } catch (IOException e) {
                    resultMessage.setText(e.getMessage());
                    return;
                }
            }
        }
        try {
            bw.close();
        } catch (IOException e) {
            resultMessage.setText(e.getMessage());
            return;
        }
        resultMessage.setText(R.string.success_message);
    }

Extraire un tableau dans une zone spécifique de la page PDF

Chaque table absorbée a la propriété Rectangle qui décrit la position de la table sur la page.

Donc, si vous avez besoin d’extraire des tables situées dans une région spécifique, vous devez travailler avec des coordonnées spécifiques.

L’exemple suivant montre comment extraire une table marquée avec une annotation carrée :

public void extractMarkedTable () {
        // Ouvrir le document
        try {
            document=new Document(inputStream);
        } catch (Exception e) {
            resultMessage.setText(e.getMessage());
            return;
        }
        com.aspose.pdf.Page page=document.getPages().get_Item(1);

        com.aspose.pdf.AnnotationSelector annotationSelector=
                new com.aspose.pdf.AnnotationSelector(
                        new com.aspose.pdf.SquareAnnotation(page, com.aspose.pdf.Rectangle.getTrivial()));

        List list=annotationSelector.getSelected();
        if (list.size() == 0) {
            resultMessage.setText("Tables marquées non trouvées..");
            return;
        }

        com.aspose.pdf.SquareAnnotation squareAnnotation = (com.aspose.pdf.SquareAnnotation) list.get(0);

        com.aspose.pdf.TableAbsorber absorber=new com.aspose.pdf.TableAbsorber();
        absorber.visit(page);

        for (com.aspose.pdf.AbsorbedTable table : absorber.getTableList()) {
            {
                boolean isInRegion=(squareAnnotation.getRect().getLLX() < table.getRectangle().getLLX())
                        && (squareAnnotation.getRect().getLLY() < table.getRectangle().getLLY())
                        && (squareAnnotation.getRect().getURX() > table.getRectangle().getURX())
                        && (squareAnnotation.getRect().getURY() > table.getRectangle().getURY());

                if (isInRegion) {
                    File file=new File(fileStorage, "extracted-text.txt");
                    FileOutputStream fileOutputStream;

                    try {
                        fileOutputStream=new FileOutputStream(file);

                    } catch (FileNotFoundException e) {
                        resultMessage.setText(e.getMessage());
                        return;
                    }

                    BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(fileOutputStream));
                    try {
                        //Analyser le tableau
                        for (com.aspose.pdf.AbsorbedRow row : table.getRowList()) {
                            {
                                for (com.aspose.pdf.AbsorbedCell cell : row.getCellList()) {
                                    for (com.aspose.pdf.TextFragment fragment :
                                            cell.getTextFragments()) {
                                        bw.write(fragment.getText());
                                    }
                                    bw.write("|");
                                }
                                bw.newLine();
                            }
                        }
                        bw.close();
                        // -------------
                    } catch (IOException e) {
                        resultMessage.setText(e.getMessage());
                        return;
                    }
                    resultMessage.setText(R.string.success_message);
                }
            }
        }
    }

Extraire les données de table d’un PDF et les stocker dans un fichier CSV

L’exemple suivant montre comment extraire une table et la stocker en tant que fichier CSV. Pour savoir comment convertir un PDF en feuille de calcul Excel, veuillez vous référer à l’article Convertir un PDF en Excel.

 public void extractTableSaveCSV () {
        // Ouvrir le document
        try {
            document=new Document(inputStream);
        } catch (Exception e) {
            resultMessage.setText(e.getMessage());
            return;
        }

        File file=new File(fileStorage, "PDFToXLS_out.csv");
        // Instancier un objet d'options de sauvegarde Excel
        com.aspose.pdf.ExcelSaveOptions excelSave=new com.aspose.pdf.ExcelSaveOptions();
        excelSave.setFormat(com.aspose.pdf.ExcelSaveOptions.ExcelFormat.CSV);
        try {
            document.save(file.toString(), excelSave);
        } catch (Exception e) {
            resultMessage.setText(e.getMessage());
            return;
        }
        resultMessage.setText(R.string.success_message);
    }