PDF에서 텍스트 추출 후 정리하는 단계별 방법
검색 가능한 PDF와 스캔 PDF의 차이를 이해하고, Python pdfplumber·pypdf·Adobe 등 도구별 텍스트 추출 방법과 정리 과정을 단계별로 설명합니다.
Q.PDF에서 텍스트를 추출하는 가장 좋은 방법은 무엇인가요?
PDF 유형에 따라 방법이 달라집니다. 검색 가능한 PDF(텍스트 레이어가 있는 경우)는 Python pdfplumber 라이브러리로 정확하게 추출할 수 있습니다. 스캔된 이미지 PDF는 먼저 OCR 처리가 필요하며, Tesseract OCR 또는 네이버 클로바 OCR API를 사용합니다. 추출 후에는 TRIM·CLEAN 함수나 정규식으로 공백과 줄바꿈 오류를 정리합니다.
법무팀에서 계약서 100부를 Word로 변환해달라는 요청이 왔다. 파일을 열어보니 절반은 스캔된 이미지 PDF였다. 텍스트 레이어가 없는 이미지 PDF는 일반 복사·붙여넣기가 불가능하다. 유형 판별부터 시작해야 한다.
핵심 답변
PDF 유형에 따라 방법이 달라집니다. 검색 가능한 PDF(텍스트 레이어가 있는 경우)는 Python pdfplumber 라이브러리로 정확하게 추출할 수 있습니다. 스캔된 이미지 PDF는 먼저 OCR 처리가 필요하며, Tesseract OCR 또는 네이버 클로바 OCR API를 사용합니다. 추출 후에는 TRIM·CLEAN 함수나 정규식으로 공백과 줄바꿈 오류를 정리합니다.
PDF 유형 판별
텍스트 레이어 있음 (검색 가능 PDF)
- PDF 뷰어에서 텍스트 드래그 선택이 가능
- 파일 크기가 상대적으로 작음 (이미지 없을 때 100KB 미만)
- 직접 텍스트 추출 가능
이미지 PDF (스캔 PDF)
- 텍스트 드래그 선택 불가
- 파일 크기가 큼 (페이지당 300-500KB 이상)
- OCR 처리가 선행 필요
검색 가능 PDF 추출 (pdfplumber)
python
import pdfplumber
results = []
with pdfplumber.open("document.pdf") as pdf:
for i, page in enumerate(pdf.pages):
text = page.extract_text(
x_tolerance=2, # 수평 글자 간격 허용오차
y_tolerance=3, # 수직 줄 간격 허용오차
)
if text:
results.append(f"--- 페이지 {i+1} ---
{text}")
full_text = "
".join(results)
pdfplumber는 표(table) 추출도 지원한다. page.extract_table()로 PDF 내 표를 2차원 리스트로 변환할 수 있다.
이미지 PDF → OCR → 텍스트
python
import pytesseract
from pdf2image import convert_from_path
# PDF → 이미지 변환 (DPI 300 권장)
pages = convert_from_path("scanned.pdf", dpi=300)
texts = []
for page in pages:
text = pytesseract.image_to_string(page, lang='kor+eng')
texts.append(text)
한국어 인식을 위해 tessdata-best/kor.traineddata를 설치해야 한다.
추출 후 정리 체크리스트
- 연속 공백 → 단일 공백 (
re.sub(r' +', ' ', text)) - 불필요한 줄바꿈 제거 (
re.sub(r'
{3,}', '
', text))
- 머리글·바닥글 패턴 제거 (반복 등장하는 페이지 번호, 문서 제목)
- 특수문자 정규화 (따옴표 통일, 대시 종류 통일)
실무 활용 사례
사례 1: 계약서 데이터베이스 구축
법무팀이 수백 건의 계약서 PDF를 검색 가능한 DB로 구축할 때, pdfplumber로 텍스트를 추출하고 정리 체크리스트를 적용하면 깨끗한 텍스트를 얻을 수 있다. 이후 Elasticsearch나 PostgreSQL full-text search에 색인하면 계약 조항을 키워드로 빠르게 검색할 수 있다.
사례 2: 학술 논문 메타데이터 추출
저널 논문 PDF 수백 편에서 제목, 저자, 초록을 자동으로 추출할 때, pdfplumber의 extract_words() 메서드로 텍스트 위치 정보를 함께 추출하면 각 섹션을 좌표 기반으로 구분할 수 있다. OCR이 필요한 스캔 논문은 Tesseract lang='kor+eng'로 처리한다.
사례 3: 스캔 영수증 처리
경비 정산용 스캔 영수증에서 금액, 날짜, 가맹점명을 추출할 때 Tesseract DPI 300 설정이 인식률을 크게 높인다. 추출 후 정규식으로 날짜 패턴(d{4}[-./]d{2}[-./]d{2})과 금액 패턴(d{1,3}(,d{3})*원)을 매칭하면 구조화된 데이터로 변환할 수 있다.
마무리
이 글에서 정리한 기준을 실제 작업에 적용할 때는 [텍스터브 글자수 세기](/tools/char-counter/) 도구로 분량을 직접 확인하면서 진행하면 더 정확하게 맞출 수 있다.