2026년 Tabula·Camelot·pdfplumber 비교: 실제 승자는 어느 파이썬 라이브러리인가?
출처: Dev.to
Python에서 PDF의 표를 추출해야 할 때, 지난 몇 년간 Stack Overflow 답변과 튜토리얼에서 가장 많이 언급되는 세 가지 라이브러리가 있습니다: Tabula, Camelot, 그리고 pdfplumber. 각각은 확실한 장점과 실제로 마주칠 수 있는 한계가 존재합니다 — 2022년에 들은 조언이 오늘날엔 오히려 잘못된 방향을 제시할 수도 있습니다.
이 가이드에서는 2026년에 각 라이브러리가 잘 동작하는 상황, 어디서 부딪히는지, 그리고 문서 유형에 맞는 올바른 선택을 하는 방법을 다룹니다. 마지막에는 코드를 전혀 쓰지 않는 것이 더 나은 경우도 알려드립니다.
| Library | 가장 적합한 경우 | 실패하는 경우 |
|---|---|---|
| Tabula | 원본 PDF의 스트림 표 | 격자형(lattice) 표, 스캔된 PDF |
| Camelot | 원본 PDF의 격자 표 | 스캔된 PDF, 복잡한 레이아웃 |
| pdfplumber | 복잡한 레이아웃, 디버깅 | 스캔된 PDF |
| 위의 어느 것도 아님 | 스캔/사진으로 된 PDF | ← OCR‑first 도구 사용 |
Tabula
Tabula는 Java 라이브러리이며, tabula-py가 이를 Python에서 사용할 수 있게 래핑합니다. 텍스트 레이어가 존재하는 PDF에서 공백과 텍스트 위치를 분석해 표 경계를 감지합니다. 두 가지 모드가 있습니다:
- Stream: 열 사이의 공백을 이용해 경계를 찾음
- Lattice: 그려진 선/테두리를 이용해 경계를 찾음
설정은 매우 간단합니다:
import tabula
# PDF의 모든 표 추출
tables = tabula.read_pdf("bank_statement.pdf", pages="all")
for df in tables:
print(df.head())
잘 동작하는 경우
- 열 간 간격이 일정하고 텍스트 기반인 깔끔한 PDF
- 은행 거래 내역, 정부 보고서 등 셀 경계 대신 공백으로 구분된 문서
실패하는 경우
- 다중 컬럼 레이아웃이 있어 스트림 파서가 혼란스러운 경우
- 헤더가 반복되는 여러 페이지에 걸친 표 (중복 헤더 행이 생김)
- 스캔하거나 이미지 기반인 PDF – 텍스트 레이어가 없으므로 추출 불가
- 선이 촘촘히 그어진 격자형 표 (Camelot의 lattice 모드가 더 적합)
2026년 유지 관리 현황
tabula-py는 커뮤니티가 유지하고 있으며, 기본 Java 라이브러리는 2018년 이후 큰 변화 없이 안정적으로 동작합니다. 활발한 개발은 없지만 핵심 사용 사례에서는 여전히 신뢰할 수 있습니다.
Camelot
Camelot은 표 감지에 보다 원칙적인 접근을 취합니다. lattice 모드는 선 감지 알고리즘을 사용해 명시적인 테두리를 찾고, stream 모드는 Tabula와 유사하게 공백을 분석합니다. 핵심 차이점은 lattice 모드가 셀에 선이 그려진 경우 훨씬 정확하다는 점입니다.
import camelot
# Lattice 모드 — 선이 보이는 표에 최적
tables = camelot.read_pdf("invoice.pdf", flavor="lattice")
print(tables[0].df)
# Stream 모드 — 공백으로 구분된 표에 최적
tables = camelot.read_pdf("statement.pdf", flavor="stream")
Camelot은 감지 결과를 시각화할 수 있어 디버깅 시간을 크게 단축합니다:
tables[0].plot()
잘 동작하는 경우
- 셀 경계가 명확히 그려진 인보이스, 정식 보고서
- 회계 소프트웨어에서 내보낸 표 구조가 깔끔히 유지된 재무제표
- “선이 있는 격자”라고 눈으로 설명할 수 있는 문서
실패하는 경우
- 셀을 여러 행·열에 걸쳐 합치는 비정형 표
- 스캔된 PDF (텍스트 레이어가 없어 추출 불가)
- 실제 화면에 표가 보이지만 PDF 내부에는 라인 객체가 없어 “표를 찾을 수 없음” 오류 발생
2026년 유지 관리 현황
원본 저장소(camelot-dev/camelot)는 유지보수가 드물지만, atlanhq/camelot 포크가 더 자주 업데이트되며 2026년 신규 프로젝트에 권장됩니다.
pdfplumber
pdfplumber는 Tabula·Camelot보다 낮은 수준에서 동작합니다. “표를 찾아줘”가 아니라 문자, 선, 사각형 등 PDF 내부의 모든 기하학적 요소에 직접 접근하도록 설계되었습니다. 추출 로직을 직접 지정하면 정확히 원하는 대로 동작합니다.
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
for page in pdf.pages:
table = page.extract_table()
if table:
for row in table:
print(row)
# 페이지의 모든 단어와 좌표 추출
words = page.extract_words()
가장 큰 장점은 시각적 디버거입니다. 아래 코드는 45분짜리 고민을 5분짜리 수정으로 바꿔줍니다:
with pdfplumber.open("messy_invoice.pdf") as pdf:
page = pdf.pages[0]
im = page.to_image()
im.debug_tablefinder()
im.save("debug.png")
또한 표 감지 설정(열 허용 오차, 가장자리 감지, 스냅 허용 오차 등)을 직접 튜닝할 수 있어, 열 간 간격이 일정하지 않거나 요소가 겹치는 경우에 유용합니다.
잘 동작하는 경우
- 비정형·중첩된 표 구조를 가진 PDF
- 행마다 열 경계가 미세하게 변하는 인보이스
- 추출 대상이 전체 표가 아니라 페이지의 특정 영역일 때
실패하는 경우
- 대용량 문서에서는 Tabula·Camelot보다 느림 (정밀도가 비용을 초래)
- 복잡한 경우 코드량이 늘어나며
table_settings파라미터 조정이 필요 - 스캔된 PDF는 여전히 처리 불가
2026년 유지 관리 현황
활발히 유지보수되고 정기적으로 릴리즈가 이루어집니다. 이슈 대응도 빠르며, 장기 프로젝트에서 유지보수 위험을 최소화하려는 경우 최고의 선택입니다.
스캔·사진 PDF는 어떻게 할까?
위 세 라이브러리는 모두 텍스트 레이어를 파싱합니다. 문서가 인쇄·스캔되었거나 사진으로 찍힌 경우, 텍스트 레이어가 없거나 의미 없는 잡음으로 채워져 있습니다. 따라서 모든 라이브러리가 빈 결과를 반환하거나 엉뚱한 데이터를 추출합니다.
스캔된 문서에는 OCR 전처리가 필요합니다:
# 옵션: pdf2image + pytesseract
from pdf2image import convert_from_path
import pytesseract
pages = convert_from_path("scanned_statement.pdf", dpi=300)
for page_img in pages:
text = pytesseract.image_to_string(page_img)
# 이후 텍스트 파싱...
이 방법은 이미지 해상도, OCR 정확도, 텍스트 파싱 등을 추가로 관리해야 하므로 복잡도가 크게 증가합니다.
실제 비교 테스트
다음은 5페이지, 250건 거래 내역, 공백으로 구분된 열(선 없음)으로 구성된 일반적인 디지털 은행 거래 내역 PDF에 대해 세 라이브러리를 테스트한 결과입니다.
| Library | 추출된 행 수 | 문제점 |
|---|---|---|
| Tabula (stream) | 247/250 | 긴 설명이 다음 행과 합쳐짐 (3행) |
| Camelot (lattice) | 0/250 | 선이 없어서 감지 실패 – 잘못된 모드 선택 |
| Camelot (stream) | 238/250 | 60자 이상 설명이 있는 12행 누락 |
| pdfplumber (default) | 241/250 | 열 허용 오차 때문에 9행 누락 |
| pdfplumber (tuned) | 250/250 | table_settings 조정에 약 20분 소요 |
핵심 요약
pdfplumber가 가장 높은 정확도를 보였지만 튜닝이 필요합니다.- 경계선이 없는 문서에
Camelot의 lattice 모드는 전혀 쓸모가 없습니다 – 모드를 선택하기 전에 문서 유형을 반드시 확인하세요. Tabulastream 모드는 설정 없이도 꽤 견고한 결과를 제공합니다.
언제 어떤 도구를 써야 할까?
-
Tabula를 사용할 때:
- 텍스트 레이어가 존재하고 열이 공백으로 구분된 깔끔한 PDF
- 가장 빠른 설정이 필요할 때
- 예: 정부 보고서, 간단한 은행 내보내기, 표준 인보이스
-
**Camelot (lattice)**를 사용할