Extraire des données d'un tableau dans un PDF
Extraire des tableaux d’un PDF par programmation
Étant donné que le PDF est le format le plus courant pour l’échange de documents, considérons un document avec plusieurs ensembles de données nécessitant une analyse. Dans cet article, nous décrirons l’extraction de tableaux d’un PDF.
Aspose.PDF pour C++ fournit aux développeurs les outils nécessaires pour extraire des données de tableaux dans des documents PDF.
Cet exemple démontre l’utilisation de la classe TableAbsorber pour récupérer des données tabulaires à partir de tableaux dans un fichier PDF.
L’exemple suivant montre l’extraction de tableau de toutes les pages :
void ExtractTable() {
std::clog << __func__ << ": Start" << std::endl;
// Chaîne pour le nom du chemin
String _dataDir("C:\\Samples\\Parsing\\");
// Chaîne pour le nom du fichier
String infilename("sample-table.pdf");
auto document = MakeObject<Document>(_dataDir + infilename);
auto absorber = MakeObject<TableAbsorber>();
// Scanner les pages
for (auto page : document->get_Pages()) {
absorber->Visit(page);
for (auto table : absorber->get_TableList()) {
std::cout << "Table" << std::endl;
// Itérer à travers la liste des lignes
for (auto row : table->get_RowList()) {
// Itérer à travers la liste des cellules
for (auto cell : row->get_CellList()) {
String sb;
for (auto fragment : cell->get_TextFragments()) {
sb += fragment->get_Text();
}
std::cout << sb << "|";
}
std::cout << std::endl;
}
}
}
std::clog << __func__ << ": Finish" << std::endl;
}
Extraire un tableau dans une zone spécifique de la page PDF
Chaque tableau absorbé a une propriété Rectangle qui décrit la position du tableau sur la page.
Donc, si vous avez besoin d’extraire des tableaux situés dans une région spécifique, vous devez travailler avec des coordonnées spécifiques.
L’exemple suivant montre comment extraire un tableau marqué avec une annotation carrée :
void ExtractMarkedTable()
{
std::clog << __func__ << ": Start" << std::endl;
// Chaîne pour le nom du chemin
String _dataDir("C:\\Samples\\Parsing\\");
// Chaîne pour le nom du fichier
String infilename("sample-table.pdf");
auto document = MakeObject<Document>(_dataDir + infilename);
auto absorber = MakeObject<TableAbsorber>();
auto page = document->get_Pages()->idx_get(1);
auto sqa = MakeObject<Aspose::Pdf::Annotations::SquareAnnotation>(page, Rectangle::get_Trivial());
auto annotationSelector = MakeObject<Aspose::Pdf::Annotations::AnnotationSelector>(sqa);
auto list = annotationSelector->get_Selected();
if (list->get_Count() == 0) {
std::cerr << "Tableaux marqués non trouvés.." << std::endl;
return;
}
auto squareAnnotation = System::DynamicCast<Aspose::Pdf::Annotations::SquareAnnotation>(list->idx_get(1));
absorber->Visit(page);
for (auto table : absorber->get_TableList())
{
auto isInRegion =
(squareAnnotation->get_Rect()->get_LLX() < table->get_Rectangle()->get_LLX()) &&
(squareAnnotation->get_Rect()->get_LLY() < table->get_Rectangle()->get_LLY()) &&
(squareAnnotation->get_Rect()->get_URX() > table->get_Rectangle()->get_URX()) &&
(squareAnnotation->get_Rect()->get_URY() > table->get_Rectangle()->get_URY());
if (isInRegion)
{
for (auto row : table->get_RowList()) {
// Itérer à travers la liste des cellules
for (auto cell : row->get_CellList()) {
String sb;
for (auto fragment : cell->get_TextFragments()) {
sb += fragment->get_Text();
}
std::cout << sb << "|";
}
std::cout << std::endl;
}
}
}
std::clog << __func__ << ": Finish" << std::endl;
}
Extraire les données de tableau à partir de PDF et les stocker dans un fichier CSV
L’exemple suivant montre comment extraire un tableau et le stocker sous forme de fichier CSV. Pour voir comment convertir un PDF en feuille de calcul Excel, veuillez vous référer à l’article Convertir PDF en Excel.
void ExtractTableSaveCSV()
{
std::clog << __func__ << ": Start" << std::endl;
// Chaîne pour le chemin
String _dataDir("C:\\Samples\\Parsing\\");
// Chaîne pour le nom de fichier
String infilename("sample-table.pdf");
String outfilename("PDFToXLS_out.csv");
// Ouvrir le document
auto document = MakeObject<Document>(_dataDir + infilename);
// Instancier l'objet d'option de sauvegarde Excel
auto excelSave = MakeObject<ExcelSaveOptions>();
excelSave->set_Format(ExcelSaveOptions::ExcelFormat::CSV);
// Enregistrer la sortie au format XLS
document->Save(_dataDir + outfilename, excelSave);
std::clog << __func__ << ": Finish" << std::endl;
}