Extraire des données d'un tableau dans un PDF avec Python

Extraire des tables d’un PDF de manière programmatique

Utiliser TableAbsorber pour détecter les tableaux sur chaque page d’un Document. Après avoir visité une page, parcourir table_list, puis parcourez chaque ligne et chaque cellule pour reconstruire le contenu du tableau sous un format de texte lisible.

  1. Ouvrez le PDF en tant que Document.
  2. Parcourir les pages de document.pages.
  3. Créer un TableAbsorber pour chaque page et appeler visit(page).
  4. Parcourir les tables, les lignes et les cellules détectées.
  5. Lire les fragments de texte de chaque cellule et assembler la sortie de ligne extraite.
import aspose.pdf as apdf
from os import path

path_infile = path.join(self.dataDir, infile)

# Open PDF document
document = apdf.Document(path_infile)

# Iterate through each page in the document
for page in document.pages:
    absorber = apdf.text.TableAbsorber()
    absorber.visit(page)

    for table in absorber.table_list:
        print("Table")
        for row in table.row_list:
            row_text = []
            for cell in row.cell_list:
                cell_text = []
                for fragment in cell.text_fragments:
                    cell_text.append("".join(seg.text for seg in fragment.segments))
                row_text.append("|".join(cell_text))
            print("|".join(row_text))

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

Si vous devez extraire uniquement les tableaux situés à l’intérieur d’une région marquée, combinez TableAbsorber avec un SquareAnnotation. Dans cet exemple, le rectangle d’annotation est utilisé comme limite, et seules les tables entièrement contenues dans cette région sont traitées.

  1. Ouvrez le PDF en tant que Document.
  2. Sélectionnez la page cible.
  3. Trouvez l’annotation carrée qui marque la région d’intérêt.
  4. Créer un TableAbsorber et visitez la page.
  5. Comparez chaque rectangle de table détecté avec le rectangle d’annotation.
  6. Traitez uniquement les tables qui se trouvent entièrement à l’intérieur de la zone marquée.
import aspose.pdf as apdf
from os import path

# The path to the documents directory
path_infile = path.join(self.dataDir, infile)

# Open PDF document
document = apdf.Document(path_infile)

# Get the first page (index starts from 1 in Aspose.PDF)
page = document.pages[1]

# Find the first square annotation
square_annotation = next(
    (
        ann
        for ann in page.annotations
        if ann.annotation_type == apdf.annotations.AnnotationType.SQUARE
    ),
    None,
)

if square_annotation is None:
    print("No square annotation found.")
    return

# Initialize the TableAbsorber
absorber = apdf.text.TableAbsorber()
absorber.visit(page)

# Iterate through tables on the page
for table in absorber.table_list:
    table_rect = table.rectangle
    annotation_rect = square_annotation.rect

    # Check if the table is inside the annotation region
    is_in_region = (
        annotation_rect.llx < table_rect.llx
        and annotation_rect.lly < table_rect.lly
        and annotation_rect.urx > table_rect.urx
        and annotation_rect.ury > table_rect.ury
    )

    if is_in_region:
        for row in table.row_list:
            row_text = []
            for cell in row.cell_list:
                cell_text = []
                for fragment in cell.text_fragments:
                    cell_text.append("".join(seg.text for seg in fragment.segments))
                row_text.append("|".join(cell_text))
            print("|".join(row_text))

Exporter les données du tableau du PDF en CSV

Lorsque vous avez besoin des données extraites dans un format convivial pour les feuilles de calcul, enregistrez le PDF en utilisant ExcelSaveOptions et définissez le format de sortie sur CSV. Le fichier résultant peut être ouvert dans Excel, Google Sheets ou importé dans des flux de travail analytiques.

  1. Ouvrez le PDF source en tant que Document.
  2. Créer un ExcelSaveOptions instance.
  3. Définir excel_save.format à ExcelSaveOptions.ExcelFormat.CSV.
  4. Enregistrez le document vers le chemin CSV cible.
import aspose.pdf as apdf
from os import path

path_infile = path.join(self.dataDir, infile)
path_outfile = path.join(self.dataDir, outfile)

document = apdf.Document(path_infile)
excel_save = apdf.ExcelSaveOptions()
excel_save.format = apdf.ExcelSaveOptions.ExcelFormat.CSV
document.save(path_outfile, excel_save)