PDF에서 표를 추출하기 위한 무료 Java PDF 라이브러리
PDF 파일에서 표를 프로그래밍 방식으로 추출하는 오픈소스 Java API입니다. 추출된 표를 CSV로 쉽게 변환하고 잠긴 PDF 표를 구조화된 데이터 형식으로 변환합니다.
Tabula-Java란 무엇인가요?
PDF 파일은 비즈니스 세계 어디에나 있습니다—보고서, 청구서, 연구 논문, 재무제표 등. 하지만 지속적인 문제가 있습니다: 이러한 문서에서 표 데이터를 추출하는 것은 악명 높게 어렵습니다. 복사‑붙여넣기는 종종 데이터가 뒤섞이고, 수동 재입력은 번거롭고 오류가 발생하기 쉽습니다. 여기서 Tabula-Java가 등장합니다. Tabula-Java는 PDF 문서에서 표를 프로그래밍 방식으로 추출하는 강력한 오픈 소스 라이브러리입니다. 견고한 PDF 처리 기반 위에 구축된 이 Java 라이브러리는 잠긴 PDF 표를 실제로 활용할 수 있는 구조화된 데이터 형식으로 변환합니다. 데이터 파이프라인을 구축하든, 보고서 처리를 자동화하든, 혹은 PDF 표와 씨름하는 데 지쳤든, Tabula-Java는 우아한 솔루션을 제공합니다.
일반적인 PDF 파서가 모든 것을 비구조화된 텍스트로 처리하는 것과 달리, Tabula-Java는 표 구조를 이해합니다. 행, 열, 셀을 인식하여 데이터 포인트 간의 관계를 보존합니다. 이 구분은 매우 중요합니다—예를 들어 "John 42 Engineer"와 같은 텍스트 블롭을 얻는 것과 적절한 필드 구분이 된 구조화된 레코드를 얻는 것의 차이와 같습니다. 이 라이브러리는 순수 Java 구현으로 동작하여 엔터프라이즈 애플리케이션, 백엔드 서비스 및 수동 개입 없이 신뢰할 수 있는 자동 PDF 표 추출이 필요한 모든 시스템에 적합합니다. 이는 인기 있는 Tabula 데스크톱 애플리케이션의 엔진이며, 전 세계 언론인, 연구자 및 데이터 분석가들이 수년간 실제 사용을 통해 검증했습니다. 지능형 탐지 알고리즘, 유연한 추출 모드 및 직관적인 API 덕분에 PDF에 갇힌 표 형식 데이터를 다루는 모든 사람에게 필수 도구입니다.
Tabula-Java 시작하기
프로젝트에 Maven 의존성을 추가하려면 다음 명령을 사용하십시오.
OpenPDF Maven 의존성
<dependency>
<groupId>technology.tabula</groupId>
<artifactId>tabula</artifactId>
<version>1.0.5.</version>
</dependency>
Gradle을 통해 Tabula-Java 설치
implementation 'technology.tabula:tabula:1.0.5' Java API를 통한 기본 테이블 추출
오픈 소스 Tabula-Java 라이브러리를 사용하는 가장 간단한 방법은 기본 탐지 알고리즘을 사용하여 PDF에서 모든 테이블을 자동으로 감지하도록 하는 것입니다. 이는 명확하고 스프레드시트와 같은 테이블이 있는 PDF에 잘 작동합니다. PDF 문서에서 모든 테이블을 추출하는 간단한 예제로 시작해 보겠습니다. 이 예제는 기본 워크플로를 보여줍니다. 우리는 Apache PDFBox (Tabula-Java의 기반 PDF 엔진)를 사용하여 PDF를 로드하고, 추출 알고리즘을 생성한 뒤 페이지를 순회합니다.
Java API를 통해 PDF에서 표를 추출하는 방법?
import technology.tabula.*;
import technology.tabula.extractors.SpreadsheetExtractionAlgorithm;
import org.apache.pdfbox.pdmodel.PDDocument;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class BasicExtraction {
public static void main(String[] args) throws IOException {
// Load the PDF document
File pdfFile = new File("data_report.pdf");
PDDocument document = PDDocument.load(pdfFile);
// Create an extraction algorithm
SpreadsheetExtractionAlgorithm extractor = new SpreadsheetExtractionAlgorithm();
// Create a page iterator
ObjectExtractor objectExtractor = new ObjectExtractor(document);
PageIterator pages = objectExtractor.extract();
// Process each page
while (pages.hasNext()) {
Page page = pages.next();
// Extract tables from the page
List<Table> tables = extractor.extract(page);
// Print each table
for (Table table : tables) {
System.out.println("Found table with " + table.getRowCount() + " rows");
// Iterate through rows
for (List row : table.getRows()) {
for (RectangularTextContainer cell : row) {
System.out.print(cell.getText() + "\t");
}
System.out.println();
}
}
}
document.close();
}
}
특정 페이지 영역에서 테이블 추출
종종 모든 것을 추출하고 싶지는 않습니다. 페이지의 특정 위치에 있는 특정 테이블에서 데이터가 필요할 수 있습니다. Tabula-Java는 좌표를 사용하여 "선택 영역"을 정의할 수 있게 해줍니다. Rectangle 클래스는 PDF 좌표 공간(72포인트가 1인치에 해당)에서 페이지의 특정 영역을 정의합니다. getArea() 메서드는 추출 전에 페이지를 해당 영역으로 잘라내어, 특정 위치의 데이터만 필요할 때 정확도와 성능을 향상시킵니다. 다음은 이 작업을 수행하는 방법을 보여주는 매우 유용한 예제입니다.
Java API를 사용하여 특정 페이지 영역에서 표를 추출하는 방법?
import technology.tabula.Rectangle;
public class RegionExtraction {
public static void extractRegion(String pdfPath) throws IOException {
File pdfFile = new File(pdfPath);
PDDocument document = PDDocument.load(pdfFile);
ObjectExtractor objectExtractor = new ObjectExtractor(document);
Page page = objectExtractor.extract(1);
// Define the region (x, y, width, height)
// Coordinates are in points (72 points = 1 inch)
Rectangle region = new Rectangle(50, 100, 500, 400);
Page subPage = page.getArea(region);
SpreadsheetExtractionAlgorithm extractor = new SpreadsheetExtractionAlgorithm();
List<Table> tables = extractor.extract(subPage);
// Process the extracted table
for (Table table ; tables) {
System.out.println("Extracted " + table.getRowCount() + " rows from region");
}
document.close();
}
}
Java API를 사용한 테이블을 CSV로 변환
일반적인 사용 사례는 추출된 테이블을 스프레드시트 애플리케이션이나 데이터베이스에서 사용하기 위해 CSV 형식으로 직접 내보내는 것입니다. CSVWriter 클래스는 특수 문자에 대한 올바른 이스케이프와 다중 행 셀 내용 처리를 포함한 CSV 포맷팅의 모든 복잡성을 처리합니다. 이를 통해 CSV 입력을 기대하는 데이터 처리 파이프라인에 Tabula-Java를 쉽게 통합할 수 있습니다. 아래는 Java 애플리케이션 내에서 테이블을 효율적으로 처리하는 방법을 보여주는 Java 코드 예제입니다.
Java API를 통해 추출된 표를 CSV 형식으로 내보내는 방법?
import technology.tabula.writers.CSVWriter;
import java.io.FileWriter;
public class CSVExtraction {
public static void exportToCSV(String pdfPath, String csvPath) throws IOException {
File pdfFile = new File(pdfPath);
PDDocument document = PDDocument.load(pdfFile);
SpreadsheetExtractionAlgorithm extractor = new SpreadsheetExtractionAlgorithm();
ObjectExtractor objectExtractor = new ObjectExtractor(document);
Page page = objectExtractor.extract(1);
List<Table< tables = extractor.extract(page);
// Write to CSV file
if (!tables.isEmpty()) {
Table table = tables.get(0);
try (FileWriter writer = new FileWriter(csvPath)) {
CSVWriter csvWriter = new CSVWriter();
csvWriter.write(writer, table);
}
}
document.close();
}
}
Java API를 통한 다중 페이지 처리
많은 실제 PDF에는 여러 페이지에 걸쳐 테이블이 분산되어 있습니다. 이 라이브러리는 동시에 여러 페이지를 처리하는 기능을 포함하고 있어 개발자가 문서의 모든 페이지를 순회하면서 발견된 테이블을 추출하고 보고할 수 있습니다. 페이지 번호는 1부터 시작하며(0이 아님), 이는 사람이 일반적으로 페이지 번호를 참조하는 방식과 일치합니다.