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

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

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

Aspose.PDF для Android через Java имеет инструмент, который облегчает извлечение таблиц. Чтобы извлечь данные таблицы, выполните следующие шаги:

  1. Откройте документ - создайте объект Document;

  2. Создайте объект TableAbsorber.

  3. Определите, какие страницы необходимо анализировать, и примените visit к нужным страницам. Табличные данные будут отсканированы, и результат будет сохранен в список AbsorbedTable. Мы можем получить этот список с помощью метода getTableList.

  4. Чтобы получить данные, итерации выполняются через TableList и обрабатывается список absorbed rows и список поглощенных ячеек. Мы можем получить доступ к первому списку, вызвав метод getTableList, а ко второму, вызвав метод getCellList.

  5. Каждый AbsorbedCell содержит TextFragmentCollections. Вы можете обрабатывать его для своих собственных целей.

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

public void extractTable () {
        // Открыть документ
        try {
            document=new Document(inputStream);
        } catch (Exception e) {
            resultMessage.setText(e.getMessage());
            return;
        }
        com.aspose.pdf.TableAbsorber absorber=new com.aspose.pdf.TableAbsorber();

        File file=new File(fileStorage, "extracted-text.txt");
        FileOutputStream fileOutputStream;

        try {
            fileOutputStream=new FileOutputStream(file);

        } catch (FileNotFoundException e) {
            resultMessage.setText(e.getMessage());
            return;
        }

        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(fileOutputStream));
        // Сканировать страницы
        for (Page page : (Iterable<? extends Page>) document.getPages()) {
            absorber.visit(page);
            for (com.aspose.pdf.AbsorbedTable table : absorber.getTableList()) {
                try {
                    bw.write("Таблица");
                    bw.newLine();
                    // Перебрать список строк
                    for (com.aspose.pdf.AbsorbedRow row : table.getRowList()) {
                        // Перебрать список ячеек
                        for (com.aspose.pdf.AbsorbedCell cell : row.getCellList()) {
                            for (com.aspose.pdf.TextFragment fragment : cell.getTextFragments()) {
                                StringBuilder sb=new StringBuilder();
                                for (TextSegment seg :
                                        (Iterable<? extends TextSegment>) fragment.getSegments())
                                    sb.append(seg.getText());
                                bw.write(sb.toString() + "|");
                            }
                        }
                        bw.newLine();
                    }
                } catch (IOException e) {
                    resultMessage.setText(e.getMessage());
                    return;
                }
            }
        }
        try {
            bw.close();
        } catch (IOException e) {
            resultMessage.setText(e.getMessage());
            return;
        }
        resultMessage.setText(R.string.success_message);
    }

Извлечение таблицы в определенной области страницы PDF

Каждая поглощенная таблица имеет свойство Rectangle, которое описывает положение таблицы на странице.

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

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

public void extractMarkedTable () {
        // Открыть документ
        try {
            document=new Document(inputStream);
        } catch (Exception e) {
            resultMessage.setText(e.getMessage());
            return;
        }
        com.aspose.pdf.Page page=document.getPages().get_Item(1);

        com.aspose.pdf.AnnotationSelector annotationSelector=
                new com.aspose.pdf.AnnotationSelector(
                        new com.aspose.pdf.SquareAnnotation(page, com.aspose.pdf.Rectangle.getTrivial()));

        List list=annotationSelector.getSelected();
        if (list.size() == 0) {
            resultMessage.setText("Помеченные таблицы не найдены..");
            return;
        }

        com.aspose.pdf.SquareAnnotation squareAnnotation = (com.aspose.pdf.SquareAnnotation) list.get(0);

        com.aspose.pdf.TableAbsorber absorber=new com.aspose.pdf.TableAbsorber();
        absorber.visit(page);

        for (com.aspose.pdf.AbsorbedTable table : absorber.getTableList()) {
            {
                boolean isInRegion=(squareAnnotation.getRect().getLLX() < table.getRectangle().getLLX())
                        && (squareAnnotation.getRect().getLLY() < table.getRectangle().getLLY())
                        && (squareAnnotation.getRect().getURX() > table.getRectangle().getURX())
                        && (squareAnnotation.getRect().getURY() > table.getRectangle().getURY());

                if (isInRegion) {
                    File file=new File(fileStorage, "extracted-text.txt");
                    FileOutputStream fileOutputStream;

                    try {
                        fileOutputStream=new FileOutputStream(file);

                    } catch (FileNotFoundException e) {
                        resultMessage.setText(e.getMessage());
                        return;
                    }

                    BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(fileOutputStream));
                    try {
                        //Разбор таблицы
                        for (com.aspose.pdf.AbsorbedRow row : table.getRowList()) {
                            {
                                for (com.aspose.pdf.AbsorbedCell cell : row.getCellList()) {
                                    for (com.aspose.pdf.TextFragment fragment :
                                            cell.getTextFragments()) {
                                        bw.write(fragment.getText());
                                    }
                                    bw.write("|");
                                }
                                bw.newLine();
                            }
                        }
                        bw.close();
                        // -------------
                    } catch (IOException e) {
                        resultMessage.setText(e.getMessage());
                        return;
                    }
                    resultMessage.setText(R.string.success_message);
                }
            }
        }
    }

Извлечение данных таблицы из PDF и сохранение в CSV файл

Следующий пример показывает, как извлечь таблицу и сохранить её как CSV файл. Чтобы узнать, как конвертировать PDF в таблицу Excel, пожалуйста, обратитесь к статье Конвертация PDF в Excel.

 public void extractTableSaveCSV () {
        // Открыть документ
        try {
            document=new Document(inputStream);
        } catch (Exception e) {
            resultMessage.setText(e.getMessage());
            return;
        }

        File file=new File(fileStorage, "PDFToXLS_out.csv");
        // Создать объект параметров сохранения Excel
        com.aspose.pdf.ExcelSaveOptions excelSave=new com.aspose.pdf.ExcelSaveOptions();
        excelSave.setFormat(com.aspose.pdf.ExcelSaveOptions.ExcelFormat.CSV);
        try {
            document.save(file.toString(), excelSave);
        } catch (Exception e) {
            resultMessage.setText(e.getMessage());
            return;
        }
        resultMessage.setText(R.string.success_message);
    }