Файлы 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. Aspose.PDF for C++ API предоставляет множество дополнительных функций для работы с PDF-файлами. Вы можете подробно изучить API, посетив официальную документацию. Если у вас возникнут вопросы, свяжитесь с нами на нашем бесплатном форуме поддержки.