Java での PDF のテーブルからデータの抽出

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);
    }
}