안녕하세요! 어느덧 데이터 엔지니어링 시리즈의 네 번째 시간입니다.
지난 3탄에서는 보안을 위한 비식별화(Redaction)를 다뤘는데요. 오늘은 데이터 분석가와 엔지니어들의 영원한 숙제인 "PDF 내 표(Table) 데이터 추출"을 다뤄보려 합니다. 텍스트와 표가 뒤섞인 PDF에서 표만 깔끔하게 골라내 Pandas DataFrame으로 변환할 수 있다면, 소중한 시간을 모델 최적화에 더 쓸 수 있겠죠?
1. 왜 PDF 표 추출은 유독 힘들까?
PDF는 내부적으로 '표'라는 객체가 따로 존재하지 않습니다. 단순히 선(Line)과 글자의 좌표 정보가 흩어져 있을 뿐입니다.
- 구조 유실: 텍스트 추출기를 그냥 돌리면 행과 열이 무시된 채 한 줄의 긴 문자열로 나옵니다.
- 복잡한 구조: 셀 병합(Merged Cells)이 있거나 테두리 선이 없는 표(Ghost Table)는 기존 라이브러리들이 맥을 못 춥니다.
2. PyMuPDF Pro의 'find_tables' 전략
이파피루스 기술 블로그에서 소개하는 방식은 단순히 텍스트를 읽는 것이 아니라, 문서의 그래픽 요소와 텍스트 정렬을 분석하여 논리적인 표 구조를 재구성하는 것입니다.
특히 PyMuPDF의 find_tables() 모듈을 사용하면 복잡한 파이프라인 없이도 표를 구조화된 데이터로 바꿀 수 있습니다.
코드 맛보기: PDF 표를 Pandas로 바로 읽기
Python
import fitz # PyMuPDF
import pandas as pd
def extract_tables_to_df(pdf_path, page_num):
doc = fitz.open(pdf_path)
page = doc[page_num] # 특정 페이지 선택
# 1. 페이지 내의 표 구조 찾기
tabs = page.find_tables()
if not tabs.tables:
print("표를 찾지 못했습니다.")
return None
# 2. 첫 번째 표를 추출하여 리스트로 변환
table_data = tabs[0].extract()
# 3. Pandas DataFrame으로 즉시 변환
df = pd.DataFrame(table_data[1:], columns=table_data[0])
return df
# 실행 예시
# df = extract_tables_to_df("report.pdf", 0)
# print(df.head())
3. 분석 효율을 높이는 3가지 핵심 팁
- 전용 파싱 전략 (Strategy) 설정: 표의 경계선 유무에 따라
join_lines나vertical_strategy옵션을 조절하면, 선이 없는 복잡한 표도 놀라운 정확도로 잡아낼 수 있습니다. - 청킹(Chunking)과의 연동: 2탄에서 다룬 '스마트 청킹'과 결합해 보세요. 표 데이터를 마크다운(
to_markdown) 형식으로 변환하여 청크에 넣으면, RAG 모델이 표의 행/열 관계를 완벽하게 이해하게 됩니다. - 데이터 정제 자동화: 추출 시 발생하는 불필요한 줄바꿈(
\n)이나 특수문자를Pandas의replace()함수로 일괄 정리하면 곧바로 학습용 데이터셋으로 활용 가능합니다.
실무적인 제언
데이터 사이언티스트에게 '표 노가다'는 가장 피하고 싶은 작업 중 하나입니다. 하지만 고성능 PDF 엔진을 활용해 [추출 -> Pandas 변환 -> 전처리] 파이프라인을 자동화해두면, 대규모 비정형 데이터셋 구축 속도가 차원이 달라집니다.
더 자세한 표 추출 옵션과 고급 파싱 테크닉은 아래 원문에서 확인하실 수 있습니다.
**
원문 참고:**'PyMuPDF Pro'로 PDF 문서에서 표 추출하기: 샘플 코드 포함
지난 시리즈 보기: