Файли PDF є стандартним форматом для обміну документами через Інтернет. Такі документи, як рахунки-фактури та посібники з продуктів, зазвичай надаються у формі PDF-файлів. Можуть виникнути ситуації, коли у вас є кілька рахунків-фактур, що містять табличні дані, які потрібно витягнути та обробити далі. Ефективніше буде отримати ці дані програмним шляхом. З цією метою ця стаття навчить вас видобувати дані з PDF-таблиць за допомогою C++.
- C++ API для видобування даних із таблиць у файлах PDF
- Витягуйте дані з PDF-таблиць за допомогою C++
- Вилучення даних із таблиці в певній частині сторінки PDF
C++ API для видобування даних із таблиць у файлах PDF
Aspose.PDF for C++ — це бібліотека C++, яка дозволяє створювати, читати та оновлювати файли PDF. Крім того, API підтримує вилучення даних із таблиць у файлах PDF. Ви можете встановити API через NuGet або завантажити його безпосередньо з розділу завантаження.
PM> Install-Package Aspose.PDF.Cpp
Витягуйте дані з PDF-таблиць за допомогою C++
Нижче наведено кроки для отримання даних із таблиць PDF.
- Завантажте PDF-документ за допомогою класу Document.
- Переглядайте сторінки документа за допомогою методу Document->getPages().
- На кожній ітерації створіть екземпляр класу TableAbsorber і вкажіть сторінку для вилучення таблиць за допомогою TableAbsorber->Visit(System::SharedPtr) сторінка) метод.
- Отримайте таблиці за допомогою методу TableAbsorber->getTableList() і повторіть їх.
- Для кожного AbsorbedTable повторіть рядки за допомогою методу AbsorbedTable->getRowList().
- Для кожного AbsorbedRow виконайте ітерацію клітинок за допомогою методу AbsorbedRow->getCellList().
- Отримайте TextFragmentCollection для кожної AbsorbedCell за допомогою методу AbsorbedCell->getTextFragments() і прокрутіть його.
- Отримайте TextSegmentCollection для кожного TextFragment за допомогою методу TextFragment->getSegments() і прокрутіть його.
- Отримайте текст із кожного TextSegment і роздрукуйте його.
Наведений нижче зразок коду показує, як отримати дані з таблиць PDF за допомогою C++.
// Завантажте документ PDF
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Table_input3.pdf");
// Переглядайте сторінки документа
for (auto page : pdfDocument->get_Pages())
{
// Створіть екземпляр класу TableAbsorber
auto absorber = MakeObject<TableAbsorber>();
absorber->Visit(page);
// Перебирайте таблиці
for (auto table : absorber->get_TableList())
{
Console::WriteLine(u"Table");
// Перебирайте рядки
for (auto row : table->get_RowList())
{
// Ітерація по клітинках
for (auto cell : row->get_CellList())
{
// Повторюйте фрагменти тексту
for (auto fragment : cell->get_TextFragments())
{
String string = u"";
// Ітерація по сегментах тексту
for (auto seg : fragment->get_Segments())
{
// Отримати текст
string = String::Concat(string, seg->get_Text());
}
// Роздрукуйте текст
Console::WriteLine(string);
}
}
Console::WriteLine();
}
}
}
Вилучення даних із таблиці в певній області сторінки PDF
Щоб отримати дані з таблиці в певній області сторінки PDF, виконайте наведені нижче дії.
- Завантажте PDF-документ за допомогою класу Document.
- Отримайте сторінку, що містить таблицю, за допомогою методу Document->getPages()->idxget(int32t index).
- Перегляньте анотації та отримайте квадратну анотацію.
- Створіть екземпляр класу TableAbsorber і вкажіть сторінку для вилучення таблиць за допомогою TableAbsorber->Visit(System::SharedPtr) сторінка).
- Отримайте таблиці за допомогою методу TableAbsorber->getTableList() і повторіть їх.
- Якщо таблиця знаходиться в регіоні, виконайте такі дії:
- Перебирайте рядки AbsorbedTable за допомогою методу AbsorbedTable->getRowList().
- Для кожного AbsorbedRow виконайте ітерацію клітинок за допомогою методу AbsorbedRow->getCellList().
- Отримайте TextFragmentCollection для кожної AbsorbedCell за допомогою методу AbsorbedCell->getTextFragments() і прокрутіть його.
- Отримайте TextSegmentCollection для кожного TextFragment за допомогою методу TextFragment->getSegments() і прокрутіть його.
- Отримайте текст із кожного TextSegment і роздрукуйте його.
Наведений нижче зразок коду демонструє, як отримати дані з таблиці в певній області сторінки PDF за допомогою C++.
// Завантажте документ PDF
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Table_input4.pdf");
// Отримайте першу сторінку документа
auto page = pdfDocument->get_Pages()->idx_get(1);
// Переглядайте анотації на сторінці
for (auto annotation : page->get_Annotations())
{
// Перевірте тип анотації
if (annotation->get_AnnotationType() == Annotations::AnnotationType::Square)
{
System::SharedPtr<SquareAnnotation> squareAnnotation = DynamicCast<SquareAnnotation>(annotation);
// Створіть екземпляр класу TableAbsorber
auto absorber = MakeObject<TableAbsorber>();
absorber->Visit(page);
// Перебирайте таблиці
for (auto table : absorber->get_TableList())
{
// Перевірте, чи знаходиться таблиця в регіоні
if ((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())
)
{
// Перебирайте рядки
for (auto row : table->get_RowList())
{
// Ітерація по клітинках
for (auto cell : row->get_CellList())
{
// Повторюйте фрагменти тексту
for (auto fragment : cell->get_TextFragments())
{
String string = u"";
// Ітерація по сегментах тексту
for (auto seg : fragment->get_Segments())
{
// Отримати текст
string = String::Concat(string, seg->get_Text());
}
// Роздрукуйте текст
Console::WriteLine(string);
}
}
Console::WriteLine();
}
}
}
break;
}
}
Отримайте безкоштовну ліцензію
Щоб спробувати API без оціночних обмежень, ви можете подати запит на безкоштовну тимчасову ліцензію.
Висновок
У цій статті ви дізналися, як видобувати дані з PDF-таблиць за допомогою C++. Крім того, ви навчилися витягувати дані з таблиці в певній частині сторінки PDF. API Aspose.PDF for C++ надає багато додаткових функцій для роботи з файлами PDF. Ви можете детально вивчити API, відвідавши офіційну документацію. У разі будь-яких запитань зв’яжіться з нами на нашому безкоштовному форумі підтримки.