Извлечение данных из таблицы в PDF с помощью Java

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

Используйте TableAbsorber, чтобы найти таблицы на каждой странице и перебрать строки, ячейки, текстовые фрагменты и текстовые сегменты.

  1. Откройте исходный PDF в экземпляре Document.
  2. Переберите страницы Page документа, поскольку таблицы обнаруживаются постранично.
  3. Создайте TableAbsorber для каждой страницы и вызовите visit(page) для заполнения списка обнаруженных таблиц.
  4. Переберите обнаруженные объекты AbsorbedTable, AbsorbedRow, AbsorbedCell, TextFragment и TextSegment.
  5. Постройте извлечённый текст строки из содержимого фрагмента и выведите данные таблицы.
public static void extractTablesFromPdf(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        for (Page page : document.getPages()) {
            TableAbsorber absorber = new TableAbsorber();
            absorber.visit(page);

            for (AbsorbedTable table : absorber.getTableList()) {
                System.out.println("Table");
                for (AbsorbedRow row : table.getRowList()) {
                    StringBuilder rowText = new StringBuilder();
                    for (AbsorbedCell cell : row.getCellList()) {
                        if (rowText.length() > 0) {
                            rowText.append("|");
                        }
                        StringBuilder cellText = new StringBuilder();
                        for (TextFragment fragment : cell.getTextFragments()) {
                            StringBuilder fragmentText = new StringBuilder();
                            for (TextSegment segment : fragment.getSegments()) {
                                fragmentText.append(segment.getText());
                            }
                            if (cellText.length() > 0) {
                                cellText.append("|");
                            }
                            cellText.append(fragmentText);
                        }
                        rowText.append(cellText);
                    }
                    System.out.println(rowText);
                }
            }
        }
    }
}

Извлечение таблицы из конкретной отмеченной области

В этом примере выполняется поиск квадратной аннотации и сравнение её прямоугольника с каждой обнаруженной таблицей. Выводятся только таблицы, находящиеся внутри отмеченной области.

  1. Откройте исходный PDF в экземпляре Document.
  2. Получите нужную страницу Page и найдите квадратную аннотацию Annotation, которая отмечает область извлечения.
  3. Создайте TableAbsorber и вызовите visit(page) для обнаружения таблиц на этой странице.
  4. Сравните границы каждой обнаруженной таблицы AbsorbedTable, представленные объектом Rectangle, с границами прямоугольника аннотации.
  5. Переберите объекты AbsorbedRow и AbsorbedCell таблиц в отмеченной области и восстановите текст строк.
  6. Выведите данные таблицы только для отмеченной области.
public static void extractTableFromSpecificArea(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        Page page = document.getPages().get_Item(1);

        Annotation squareAnnotation = null;
        for (Annotation annotation : page.getAnnotations()) {
            if (annotation.getAnnotationType() == AnnotationType.Square) {
                squareAnnotation = annotation;
                break;
            }
        }

        if (squareAnnotation == null) {
            System.out.println("No square annotation found.");
            return;
        }

        TableAbsorber absorber = new TableAbsorber();
        absorber.visit(page);

        for (AbsorbedTable table : absorber.getTableList()) {
            Rectangle tableRect = table.getRectangle();
            Rectangle annotationRect = squareAnnotation.getRect();

            boolean isInRegion = annotationRect.getLLX() < tableRect.getLLX()
                    && annotationRect.getLLY() < tableRect.getLLY()
                    && annotationRect.getURX() > tableRect.getURX()
                    && annotationRect.getURY() > tableRect.getURY();

            if (isInRegion) {
                for (AbsorbedRow row : table.getRowList()) {
                    StringBuilder rowText = new StringBuilder();
                    for (AbsorbedCell cell : row.getCellList()) {
                        if (rowText.length() > 0) {
                            rowText.append("|");
                        }
                        StringBuilder cellText = new StringBuilder();
                        for (TextFragment fragment : cell.getTextFragments()) {
                            StringBuilder fragmentText = new StringBuilder();
                            for (TextSegment segment : fragment.getSegments()) {
                                fragmentText.append(segment.getText());
                            }
                            if (cellText.length() > 0) {
                                cellText.append("|");
                            }
                            cellText.append(fragmentText);
                        }
                        rowText.append(cellText);
                    }
                    System.out.println(rowText);
                }
            }
        }
    }
}

Экспорт таблиц в Excel

  1. Откройте исходный PDF в экземпляре Document.
  2. Создайте ExcelSaveOptions для экспорта.
  3. Установите формат вывода Excel в XLSX, чтобы сохранить обнаруженную структуру таблицы в виде книги Excel.
  4. Вызовите document.save(outputFile.toString(), excelSave) для экспорта документа в формат Excel.
public static void exportTablesToExcel(Path inputFile, Path outputFile) {
    try (Document document = new Document(inputFile.toString())) {
        ExcelSaveOptions excelSave = new ExcelSaveOptions();
        excelSave.setFormat(ExcelSaveOptions.ExcelFormat.XLSX);
        document.save(outputFile.toString(), excelSave);
    }
}