Java를 사용하여 PDF의 테이블에서 데이터 추출

PDF에서 테이블 추출

TableAbsorber를 사용하여 각 페이지에서 테이블을 찾고 행, 셀, 텍스트 조각 및 텍스트 세그먼트를 반복합니다.

  1. Document 인스턴스에서 소스 PDF를 여세요.
  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. Document 인스턴스에서 소스 PDF를 여세요.
  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. Document 인스턴스에서 소스 PDF를 여세요.
  2. 내보내기를 위해 ExcelSaveOptions를 만드세요.
  3. Excel 출력 형식을 XLSX으로 설정하세요. 감지된 테이블 레이아웃이 Excel 통합 문서로 작성됩니다.
  4. 문서를 Excel 형식으로 내보내려면 document.save(outputFile.toString(), excelSave)를 호출하세요.
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);
    }
}