PDF 파싱의 필요와 과제
PDF는 문서 보존에 유리하지만, 내용이 이미지·벡터·텍스트가 뒤섞여 있어 자동화 처리가 쉽지 않습니다.
- 디지털 PDF: 텍스트 레이어가 있어 바로 파싱 가능
- 스캔 PDF: 이미지 형태만 있어 OCR이 필수
- 혼합 PDF: 일부는 텍스트, 일부는 이미지로 구성
이 글에서는 PyMuPDF (fitz), pdfplumber, PDFMiner.six, PyPDF2, Camelot, tabula-py, 그리고 OCR(pytesseract + pdf2image, OCRmyPDF) 등 주요 파이썬 오픈소스 모듈을 예시로, 각 기능과 실제 적용 가능 범위, 한계를 정리합니다.
주요 파이썬 PDF 파싱 모듈 소개
PyMuPDF (import fitz)
- 설치:
pip install PyMuPDF
- 특징
- 페이지 렌더링, 텍스트·이미지·도형 추출
- 텍스트 위치(바운딩 박스), 글자 단위 분리 가능
- PDF 내장 폰트 정보·메타데이터 접근
- 예시 코드
import fitz # PyMuPDF doc = fitz.open("sample.pdf") for page in doc: text = page.get_text("text") # 순수 텍스트 blocks = page.get_text("blocks") # (x0, y0, x1, y1, "text", block_no) imgs = page.get_images(full=True) # 이미지 리스트 for img in imgs: xref = img[0] pix = fitz.Pixmap(doc, xref) pix.save(f"image_{xref}.png")
- 장점
- 속도가 빠르고, 메모리 사용이 비교적 적음
- 벡터·이미지·텍스트를 동일 API로 처리
- 한계
- 표(table) 인식 기능 없음
- 스캔된 이미지의 텍스트(OCR)는 별도 라이브러리 필요
pdfplumber
- 설치:
pip install pdfplumber
- 특징
- 레이아웃 기반 표(table) 셀 영역 검출
- 셀별 텍스트·좌표 정보 제공
- 이미지 추출(내장 제한적)
- 예시 코드
import pdfplumber with pdfplumber.open("sample.pdf") as pdf: page = pdf.pages[0] # 텍스트 text = page.extract_text() # 표 tables = page.extract_tables() for table in tables: for row in table: print(row) # 이미지 for img in page.images: bbox = img["bbox"] # x0,y0,x1,y1
- 장점
- 복잡한 셀 경계·병합 셀 지원
- 각 셀 텍스트 정제 기능
- 한계
- PDFMiner 기반으로, 대용량 PDF 처리 시 느려짐
- 스캔 PDF는 OCR 연동 필요
PDFMiner.six
- 설치:
pip install pdfminer.six
- 특징
- 가장 오래된 텍스트 추출기 중 하나
- 글자 단위로 좌표·폰트 정보 접근 가능
- 예시 코드
pdf2txt.py -o output.txt sample.pdf
또는
from pdfminer.high_level import extract_text text = extract_text("sample.pdf")
- 장점
- 텍스트 추출 정확도 우수
- 세밀한 레이아웃 제어
- 한계
- 설치 및 사용이 다소 복잡
- 표 인식·이미지 처리 기능 없음
PyPDF2
- 설치:
pip install PyPDF2
- 특징
- 텍스트 추출, 메타데이터 조작, 페이지 병합·분할
- 순수 파이썬 구현으로 호환성 높음
- 예시 코드
from PyPDF2 import PdfReader reader = PdfReader("sample.pdf") for page in reader.pages: print(page.extract_text())
- 장점
- PDF 문서 조작(splitting/merging/암호 해제) 용이
- 한계
- 텍스트 정렬·레이아웃 정확도 떨어짐
- 이미지·표 추출 불가
Camelot
- 설치:
pip install "camelot-py[cv]"
- 특징
- OpenCV 기반 표 검출 알고리즘
lattice
(격자)·stream
(라인) 모드 제공
- 예시 코드
import camelot tables = camelot.read_pdf("sample.pdf", pages="1-end", flavor="lattice") for t in tables: df = t.df # pandas DataFrame
- 장점
- 표 구조를 DataFrame으로 바로 사용
- 한계
- 격자형 표에 최적화, 비정형 표 인식 어려움
- 설치 시 Ghostscript 필요
tabula-py
- 설치:
pip install tabula-py
(Java·Tabula 설치 필요) - 특징
- Java 기반 Tabula 엔진 사용
- GUI 없이 파이썬에서 직접 호출 가능
- 예시 코드
import tabula dfs = tabula.read_pdf("sample.pdf", pages="all", multiple_tables=True)
- 장점
- 복잡한 표 인식에 강함
- 한계
- Java·환경 설정 번거로움
- OCR 기능 없음
OCR: pytesseract + pdf2image
- 설치:
pip install pdf2image pytesseract sudo apt-get install tesseract-ocr
- 특징
pdf2image
로 페이지를 PIL 이미지로 변환pytesseract
로 이미지→텍스트 변환
- 예시 코드
from pdf2image import convert_from_path import pytesseract pages = convert_from_path("scanned.pdf", dpi=300) for i, page in enumerate(pages): text = pytesseract.image_to_string(page, lang="eng+kor") with open(f"page_{i}.txt", "w", encoding="utf-8") as f: f.write(text)
- 장점
- 스캔 PDF 처리 가능
- 다양한 언어 모델 지원
- 한계
- 처리 속도 느림
- OCR 오류(특히 한글) 보정 필요
OCRmyPDF
- 설치:
pip install ocrmypdf
- 특징
- 기존 PDF에 OCR 레이어를 추가
- 멀티스레드 지원, 페이지별 DPI 조정 가능
- 예시 코드
ocrmypdf --output-type pdfa scanned.pdf ocr_scanned.pdf
- 장점
- 결과물이 ISO 준수(A-1b) PDF/A
- Tesseract 설정 자동 최적화
- 한계
- 내부적으로 Tesseract 의존
- 설치 시
qpdf
,gs
등 외부 도구 필요
기능별 비교: 가능성과 한계
라이브러리 | 텍스트 | 이미지 | 표/테이블 | OCR | PDF 조작 |
---|---|---|---|---|---|
PyMuPDF | 위치·폰트 정보 추출 | 추출·저장 | 미지원 | 미지원 | 지원 |
pdfplumber | 단순 추출 | 메타데이터 제공 | 표 추출 | 미지원 | 미지원 |
PDFMiner | 세밀 추출 | 미지원 | 미지원 | 미지원 | 미지원 |
PyPDF2 | 기본 추출 | 미지원 | 미지원 | 미지원 | 지원 |
Camelot / tabula-py | 미지원 | 미지원 | 둘 다 지원 | 미지원 | 미지원 |
OCR (pytesseract) | 이미지→텍스트 변환 | 미지원 | 미지원 | 지원 | 미지원 |
- 텍스트 추출: PDFMiner.six > PyMuPDF > pdfplumber > PyPDF2
- 표 추출: Camelot/Tabula-py > pdfplumber
- OCR: pytesseract (+pdf2image) 또는 OCRmyPDF
오픈소스로 구현 가능한 범위와 실제 제약
- 정형화된 디지털 PDF
- 텍스트·이미지·메타데이터 완벽 추출 가능
- PyMuPDF·PDFMiner·pdfplumber 등으로 95% 이상 자동화
- 스캔·비정형 PDF
- OCR 필수 → pytesseract 기반 정확도 60~90% (언어·품질 의존)
- 표·레이아웃 복잡 시 오탐·누락 발생
- 복잡 레이아웃(멀티컬럼, 병합셀 등)
- Camelot의
lattice
모드나 pdfplumber의 커스텀 셀 경계 조정으로 일부 해결 - 완전 자동화는 어렵고, 전처리(이미지 전처리, 마진 보정) 필요
- Camelot의
- 대용량·고성능 처리
- PyMuPDF: 빠르고 경량, 병렬 처리 용이
- pdfplumber/PDFMiner: 싱글 스레드, 메모리 과다 사용 주의
- OCRmyPDF: 멀티스레드 지원으로 대용량 처리 가능
- 데이터 보호 및 온프레미스
- 완전 오픈소스 스택으로 클라우드 의존성 제거 가능
- GPU 기반 OCR(Tesseract GPU 빌드) 활용 시 속도 개선
마치며
- 디지털 PDF: PyMuPDF + pdfplumber 조합으로 텍스트·이미지·표 모두 커버
- 스캔 PDF: OCRmyPDF(전처리 포함) → PyMuPDF로 후처리
- 복잡 표: Camelot/Tabula-py + 수작업 전처리
- 성능 최적화: PyMuPDF 중심, 멀티프로세싱·GPU OCR 고려
대부분의 파이썬 오픈소스만으로 디지털 PDF 파싱은 사실상 완벽 구현이 가능하며, 스캔 PDF도 Tesseract 기반 OCR로 상당 부분 자동화할 수 있습니다. 다만, 레이아웃 복잡도와 품질 저하 문서는 여전히 수작업·전처리의 역할이 크므로, 실제 프로젝트에서는 여러 모듈을 조합해 파이프라인을 설계하고, 단계별 검증을 반드시 거칠 것을 권장합니다.