PDF 텍스트 이미지 테이블 OCR 추출 – 파이썬 오픈소스 모듈별 가능성과 한계

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

오픈소스로 구현 가능한 범위와 실제 제약

  1. 정형화된 디지털 PDF
    • 텍스트·이미지·메타데이터 완벽 추출 가능
    • PyMuPDF·PDFMiner·pdfplumber 등으로 95% 이상 자동화
  2. 스캔·비정형 PDF
    • OCR 필수 → pytesseract 기반 정확도 60~90% (언어·품질 의존)
    • 표·레이아웃 복잡 시 오탐·누락 발생
  3. 복잡 레이아웃(멀티컬럼, 병합셀 등)
    • Camelot의 lattice 모드나 pdfplumber의 커스텀 셀 경계 조정으로 일부 해결
    • 완전 자동화는 어렵고, 전처리(이미지 전처리, 마진 보정) 필요
  4. 대용량·고성능 처리
    • PyMuPDF: 빠르고 경량, 병렬 처리 용이
    • pdfplumber/PDFMiner: 싱글 스레드, 메모리 과다 사용 주의
    • OCRmyPDF: 멀티스레드 지원으로 대용량 처리 가능
  5. 데이터 보호 및 온프레미스
    • 완전 오픈소스 스택으로 클라우드 의존성 제거 가능
    • GPU 기반 OCR(Tesseract GPU 빌드) 활용 시 속도 개선

마치며

  • 디지털 PDF: PyMuPDF + pdfplumber 조합으로 텍스트·이미지·표 모두 커버
  • 스캔 PDF: OCRmyPDF(전처리 포함) → PyMuPDF로 후처리
  • 복잡 표: Camelot/Tabula-py + 수작업 전처리
  • 성능 최적화: PyMuPDF 중심, 멀티프로세싱·GPU OCR 고려

대부분의 파이썬 오픈소스만으로 디지털 PDF 파싱은 사실상 완벽 구현이 가능하며, 스캔 PDF도 Tesseract 기반 OCR로 상당 부분 자동화할 수 있습니다. 다만, 레이아웃 복잡도와 품질 저하 문서는 여전히 수작업·전처리의 역할이 크므로, 실제 프로젝트에서는 여러 모듈을 조합해 파이프라인을 설계하고, 단계별 검증을 반드시 거칠 것을 권장합니다.

생성형 AI 문서 파싱 최신 트렌드와 오픈소스 솔루션 가이드 2025

Leave a Comment