PDF에서 텍스트 추출하기

eeseol·2025년 7월 2일

개발

목록 보기
1/3

PDF에서 텍스트를 추출하는 작업은 생각보다 단순하지 않습니다.
왜냐하면 PDF의 종류에 따라 처리 방식이 완전히 달라지기 때문입니다.


PDF의 두 가지 종류

1. 이미지 기반 PDF

  • 글자가 아닌 이미지(스캔) 로 저장된 PDF입니다.
  • 텍스트처럼 보여도 드래그가 안 되고 복사도 안 됩니다.
  • 예: 스캔한 문서, 사진을 PDF로 저장한 파일 등

2. 텍스트 기반 PDF

  • 텍스트 정보가 PDF에 포함되어 있습니다.
  • 글자를 드래그하거나 검색할 수 있는 PDF입니다.
  • 예: 워드, 한글, LaTeX에서 직접 저장한 PDF 등

이미지 기반 PDF (OCR)

이미지 기반 PDF는 일반적으로 OCR(광학문자인식) 과정을 거쳐야 텍스트를 추출할 수 있습니다.

과정 : PDF → 이미지 변환 → 이미지에서 텍스트 인식(OCR)

OCR 라이브러리/서비스 예시:

  1. Tesseract OCR – 가장 널리 쓰이는 오픈소스 OCR 엔진
    Tesseract OCR 공식링크

  2. EasyOCR – 한글 등 다양한 언어를 지원하는 딥러닝 기반 OCR
    EasyOCR github

  3. Google Cloud Vision API – 구글의 고성능 OCR API
    Google Vision API 공식링크

  4. PaddleOCR – 중국 Baidu에서 만든 고정확도 OCR 라이브러리
    PaddleOCR github


텍스트 기반 PDF

텍스트 기반 PDF는 OCR이 필요 없기 때문에, 텍스트 추출 라이브러리만 잘 선택하면 됩니다.

저는 이번에 한글 텍스트로 구성된 PDF (판례)를 대상으로 다음 두 가지 오픈소스를 테스트해봤습니다:

원본 파일 : 2022구합22331_부산지방법원 판례문


1. pdfminer.six

  • 장점: 구조화된 정보 추출 가능, 글자 단위 제어가 잘됨
  • 단점: 레이아웃이 깨지기 쉬움 (표나 다단 구조 등)
from pdfminer.high_level import extract_text
import os

# PDF 파일 경로
pdf_path = "2022구합22331_부산지방법원.pdf"

try:
    text = extract_text(pdf_path)
    
    # PDF 파일명에서 확장자 제거하여 txt 파일명 생성
    pdf_filename = os.path.basename(pdf_path)
    txt_filename = os.path.splitext(pdf_filename)[0] + ".txt"
    txt_path = os.path.join(os.path.dirname(__file__), txt_filename)
    
    # 텍스트를 txt 파일로 저장
    with open(txt_path, 'w', encoding='utf-8') as f:
        f.write(text)
    
    print(f"텍스트 저장 성공")
    print(f'파일명 : {txt_filename}')
    print(f"저장 위치: {txt_path}")
    
except FileNotFoundError:
    print(f"파일을 찾을 수 없습니다: {pdf_path}")
except Exception as e:
    print(f"오류 발생: {str(e)}") 


🔧 2. PyMuPDF (mupdf)

  • 장점: 빠르고 간단함, 이미지도 함께 추출 가능
  • 단점: 세부 구조 제어는 약함
import fitz  # PyMuPDF
import os

# PDF 파일 경로
pdf_path = "2022구합22331_부산지방법원.pdf"

try:
    # PDF 열기
    doc = fitz.open(pdf_path)
    
    for page in doc:
        text = page.get_text()
        print(text)

    # PDF 파일명에서 확장자 제거하여 txt 파일명 생성
    pdf_filename = os.path.basename(pdf_path)
    txt_filename = os.path.splitext(pdf_filename)[0] + ".txt"
    txt_path = os.path.join(os.path.dirname(__file__), txt_filename)
    
    # 텍스트를 txt 파일로 저장
    with open(txt_path, 'w', encoding='utf-8') as f:
        f.write(text)       
    
    print(f"텍스트 저장성공")
    print(f'파일명 : {txt_filename}')
    print(f"저장 위치: {txt_path}")
    
    # PDF 문서 닫기
    doc.close()
    
except FileNotFoundError:
    print(f"파일을 찾을 수 없습니다: {pdf_path}")
except Exception as e:
    print(f"오류 발생: {str(e)}")

업로드중..


마무리

  • PDF가 텍스트 기반인지 이미지 기반인지 먼저 확인하는 게 핵심입니다.
  • 텍스트 기반이면 pdfminer.six, PyMuPDF 같은 툴로 바로 추출하면 되고,
  • 이미지 기반이면 Tesseract, EasyOCR 같은 OCR 도구를 써야 합니다.

본인이 추출해야 하는 pdf 내용 유형을 확인하고, 어떤 툴이 더 적합한지 테스트 후에 사용하는 것을 추천한다.
나는 PyMuPDF 툴을 사용했다.

profile
안녕하세요.

0개의 댓글