Java를 사용하여 PDF의 테이블에서 데이터 추출
Contents
[
Hide
]
PDF에서 테이블 추출
TableAbsorber를 사용하여 각 페이지에서 테이블을 찾고 행, 셀, 텍스트 조각 및 텍스트 세그먼트를 반복합니다.
Document인스턴스에서 소스 PDF를 여세요.- 테이블은 페이지별로 감지되므로 문서
Page개체를 반복하세요. - 각 페이지에 대해
TableAbsorber를 생성하고visit(page)를 호출하여 감지된 테이블 목록을 채우세요. - 감지된
AbsorbedTable,AbsorbedRow,AbsorbedCell,TextFragment및TextSegment개체를 반복하세요. - 조각 콘텐츠에서 추출된 행 텍스트를 작성하고 테이블 데이터를 인쇄하세요.
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);
}
}
}
}
}
특정 표시된 영역에서 테이블 추출
이 예에서는 정사각형 주석을 찾고, 해당 직사각형을 감지된 각 테이블과 비교하고, 표시된 영역 내부의 테이블만 출력합니다.
Document인스턴스에서 소스 PDF를 여세요.- 대상
Page를 가져오고 추출 영역을 표시하는 사각형Annotation을 찾으세요. TableAbsorber를 만들고visit(page)를 호출하여 해당 페이지의 테이블을 감지하세요.- 감지된 각
AbsorbedTableRectangle을 주석 직사각형 경계와 비교하세요. - 일치하는
AbsorbedRow및AbsorbedCell개체를 반복하고 행 텍스트를 재구성하세요. - 표시된 영역에 대한 테이블 데이터만 인쇄하세요.
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로 내보내기
Document인스턴스에서 소스 PDF를 여세요.- 내보내기를 위해
ExcelSaveOptions를 만드세요. - Excel 출력 형식을
XLSX으로 설정하세요. 감지된 테이블 레이아웃이 Excel 통합 문서로 작성됩니다. - 문서를 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);
}
}