استخراج البيانات من الجدول في PDF
استخراج الجداول من PDF برمجيًا
نظرًا لأن PDF هو التنسيق الأكثر شيوعًا لتبادل المستندات، لننظر في مستند يحتوي على عدة مجموعات بيانات تحتاج إلى تحليل. في هذه المقالة، سنصف استخراج الجداول من PDF.
يوفر Aspose.PDF لـ C++ للمطورين الأدوات التي يحتاجونها لاستخراج البيانات من الجداول في مستندات PDF.
يظهر هذا المثال استخدام الفئة TableAbsorber لاسترجاع البيانات الجدولية من الجداول في ملف PDF.
يوضح المثال التالي استخراج الجداول من جميع الصفحات:
void ExtractTable() {
std::clog << __func__ << ": Start" << std::endl;
// String for path name
String _dataDir("C:\\Samples\\Parsing\\");
// String for file name
String infilename("sample-table.pdf");
auto document = MakeObject<Document>(_dataDir + infilename);
auto absorber = MakeObject<TableAbsorber>();
// Scan pages
for (auto page : document->get_Pages()) {
absorber->Visit(page);
for (auto table : absorber->get_TableList()) {
std::cout << "Table" << std::endl;
// Iterate throught list of rows
for (auto row : table->get_RowList()) {
// Iterate throught list of cell
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;
}
استخراج جدول في منطقة محددة من صفحة PDF
كل جدول مستوعب لديه خاصية Rectangle التي تصف موضع الجدول على الصفحة.
لذلك، إذا كنت بحاجة إلى استخراج الجداول الموجودة في منطقة معينة، يجب عليك العمل مع إحداثيات محددة.
المثال التالي يوضح كيفية استخراج الجدول الذي تم تمييزه بتعليق مربع:
void ExtractMarkedTable()
{
std::clog << __func__ << ": Start" << std::endl;
// سلسلة لاسم المسار
String _dataDir("C:\\Samples\\Parsing\\");
// سلسلة لاسم الملف
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 << "لم يتم العثور على الجداول المميزة.." << 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()) {
// Iterarate throught list of cell
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;
}
استخراج بيانات الجدول من PDF وتخزينها في ملف CSV
يوضح المثال التالي كيفية استخراج الجدول وتخزينه كملف CSV. لرؤية كيفية تحويل PDF إلى جدول بيانات Excel يرجى الرجوع إلى مقال تحويل PDF إلى Excel.
void ExtractTableSaveCSV()
{
std::clog << __func__ << ": Start" << std::endl;
// String for path name
String _dataDir("C:\\Samples\\Parsing\\");
// String for file name
String infilename("sample-table.pdf");
String outfilename("PDFToXLS_out.csv");
// Open document
auto document = MakeObject<Document>(_dataDir + infilename);
// Instantiate ExcelSave Option object
auto excelSave = MakeObject<ExcelSaveOptions>();
excelSave->set_Format(ExcelSaveOptions::ExcelFormat::CSV);
// Save the output in XLS format
document->Save(_dataDir + outfilename, excelSave);
std::clog << __func__ << ": Finish" << std::endl;
}