Извлечение данных из таблицы в PDF

Программное извлечение таблиц из PDF

Поскольку PDF является наиболее распространенным форматом для обмена документами, давайте рассмотрим документ с несколькими наборами данных, которые нуждаются в анализе. В этой статье мы опишем извлечение таблиц из PDF.

Aspose.PDF для C++ предоставляет разработчикам инструменты, необходимые для извлечения данных из таблиц в документах PDF.

Этот пример демонстрирует использование класса TableAbsorber для получения табличных данных из таблиц в файле PDF.

Следующий пример показывает извлечение таблицы со всех страниц:

void ExtractTable() {
    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>();

    // Сканирование страниц
    for (auto page : document->get_Pages()) {
        absorber->Visit(page);
        for (auto table : absorber->get_TableList()) {
        std::cout << "Table" << std::endl;
        // Итерация по списку строк
        for (auto row : table->get_RowList()) {
            // Итерация по списку ячеек
            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()) {
            // Перебор списка ячеек
            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 _dataDir("C:\\Samples\\Parsing\\");

    // Строка для имени файла
    String infilename("sample-table.pdf");
    String outfilename("PDFToXLS_out.csv");

    // Открыть документ
    auto document = MakeObject<Document>(_dataDir + infilename);

    // Создать объект параметров сохранения в Excel
    auto excelSave = MakeObject<ExcelSaveOptions>();
    excelSave->set_Format(ExcelSaveOptions::ExcelFormat::CSV);

    // Сохранить вывод в формате XLS
    document->Save(_dataDir + outfilename, excelSave);
    std::clog << __func__ << ": Finish" << std::endl;
}