PDF 내용 복사가 안 될 때! 파이썬으로 텍스트 자동 추출하기

PDF 내용 복사가 안 될 때! 파이썬으로 텍스트 자동 추출하기 (완성 코드 공개)

파이썬으로 PDF 파일에서 텍스트를 자동으로 추출하는 모습


계약서, 보고서, 논문을 PDF로 받았는데 텍스트 선택이 안 되거나, 수백 페이지 분량의 내용을 엑셀에 정리해야 하는 상황을 겪어본 적 있으신가요?

Adobe Acrobat 유료 버전 없이도 파이썬을 사용하면 PDF에서 텍스트를 자동으로 추출할 수 있습니다. 일반 PDF는 물론, 스캔해서 만든 이미지 형태의 PDF도 OCR 기술을 활용해 텍스트를 뽑아낼 수 있습니다. 추출한 텍스트는 txt 파일 또는 엑셀 파일로 자동 저장됩니다.


1단계: 준비물 설치

파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.

PDF 텍스트 추출에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install pypdf pandas openpyxl

pypdf는 PDF 파일을 읽고 텍스트를 추출하는 라이브러리입니다. pandasopenpyxl은 추출한 텍스트를 페이지별로 엑셀에 저장할 때 사용합니다.

💡 일반 PDF vs 스캔 PDF: PDF에는 두 종류가 있습니다. 워드나 한글에서 내보낸 텍스트 PDFpypdf로 바로 추출됩니다. 반면 종이 문서를 스캔해서 만든 이미지 PDF는 텍스트 레이어가 없어 pypdf로 추출이 안 됩니다. 이미지 PDF 처리 방법은 아래 응용 섹션에서 소개합니다.

2단계: 완성 코드 — 텍스트 PDF 추출

아래 코드를 그대로 복사해서 메모장에 붙여넣고, extract_pdf.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.

from pypdf import PdfReader
import pandas as pd
from pathlib import Path

# ① 설정
PDF_PATH    = r"C:\Users\내이름\Desktop\계약서.pdf"        # ← 추출할 PDF 경로
OUTPUT_TXT  = r"C:\Users\내이름\Desktop\계약서_텍스트.txt"  # ← txt 저장 경로
OUTPUT_XLSX = r"C:\Users\내이름\Desktop\계약서_페이지별.xlsx" # ← 엑셀 저장 경로

# ② PDF 읽기
reader = PdfReader(PDF_PATH)
total  = len(reader.pages)
print(f"  ✔ PDF 로드 완료: 총 {total}페이지")

# ③ 페이지별 텍스트 추출
rows     = []
all_text = []

for i, page in enumerate(reader.pages):
    text = page.extract_text() or ""
    text = text.strip()
    rows.append({"페이지": i + 1, "텍스트": text})
    all_text.append(f"=== {i + 1}페이지 ===\n{text}\n")
    print(f"  ✔ {i + 1}/{total} 페이지 추출 완료 ({len(text)}자)")

# ④ txt 파일로 저장
Path(OUTPUT_TXT).write_text("\n".join(all_text), encoding="utf-8")
print(f"  ✔ txt 저장 완료 → {OUTPUT_TXT}")

# ⑤ 엑셀 파일로 저장 (페이지별)
df = pd.DataFrame(rows)
df.to_excel(OUTPUT_XLSX, index=False)
print(f"  ✔ 엑셀 저장 완료 → {OUTPUT_XLSX}")

print(f"\n✅ 완료! 총 {total}페이지 텍스트 추출 성공")

3단계: 실행 방법

  1. 코드 ① 설정의 PDF_PATH에 텍스트를 추출할 PDF 파일 경로를 입력합니다.
  2. OUTPUT_TXTOUTPUT_XLSX에 저장할 파일 경로를 입력합니다.
  3. 터미널에서 아래 명령어로 실행합니다:
python extract_pdf.py

정상 실행 시 터미널에 이렇게 출력됩니다:

  ✔ PDF 로드 완료: 총 12페이지
  ✔ 1/12 페이지 추출 완료 (842자)
  ✔ 2/12 페이지 추출 완료 (1203자)
  ...
  ✔ 12/12 페이지 추출 완료 (597자)
  ✔ txt 저장 완료 → C:\Users\내이름\Desktop\계약서_텍스트.txt
  ✔ 엑셀 저장 완료 → C:\Users\내이름\Desktop\계약서_페이지별.xlsx

✅ 완료! 총 12페이지 텍스트 추출 성공

txt 파일에는 전체 텍스트가 페이지 구분선과 함께 저장되고, 엑셀 파일에는 페이지 번호와 해당 페이지 텍스트가 행별로 정리됩니다.


4단계: 자주 발생하는 오류와 해결법

오류 1: 추출된 텍스트가 비어 있거나 깨진 문자만 나옴

스캔 PDF이거나 암호화된 PDF일 가능성이 높습니다. 스캔 PDF 처리 방법은 아래 응용 섹션을 참고하세요. 암호화된 PDF는 먼저 암호를 해제해야 합니다. PdfReader 생성 직후 아래 코드를 추가하면 됩니다:

if reader.is_encrypted:
    reader.decrypt("PDF비밀번호")   # ← 비밀번호 입력

오류 2: 한글이 깨져서 이상한 문자로 출력됨

PDF 내부의 폰트 인코딩 문제로 발생합니다. 이 경우 pypdf만으로는 해결이 어렵습니다. 아래 응용 섹션의 pdfplumber 라이브러리를 사용하면 한글 인코딩 문제를 대부분 해결할 수 있습니다.

오류 3: ModuleNotFoundError: No module named 'pypdf'

설치가 제대로 되지 않은 경우입니다. 아래 명령어로 다시 시도하세요.

python -m pip install pypdf pandas openpyxl

응용 1: 한글 PDF 추출이 잘 안 될 때 — pdfplumber 사용

한글 PDF에서 텍스트가 깨지거나 추출이 불완전할 때는 pdfplumber 라이브러리가 더 좋은 결과를 냅니다. 먼저 설치합니다:

pip install pdfplumber

코드 ② ~ ③ 부분을 아래로 교체하면 됩니다:

import pdfplumber

with pdfplumber.open(PDF_PATH) as pdf:
    total = len(pdf.pages)
    print(f"  ✔ PDF 로드 완료: 총 {total}페이지")

    for i, page in enumerate(pdf.pages):
        text = page.extract_text() or ""
        text = text.strip()
        rows.append({"페이지": i + 1, "텍스트": text})
        all_text.append(f"=== {i + 1}페이지 ===\n{text}\n")
        print(f"  ✔ {i + 1}/{total} 페이지 추출 완료 ({len(text)}자)")

응용 2: 폴더 안의 PDF 여러 개를 한꺼번에 추출하고 싶다면

PDF 한 개가 아니라 폴더 안의 모든 PDF를 한꺼번에 처리하고 싶다면 코드 ① 설정과 ② ~ ⑤ 실행 부분을 아래처럼 바꾸면 됩니다:

FOLDER_PATH = r"C:\Users\내이름\Desktop\PDF모음"   # ← 폴더 경로로 변경
OUTPUT_DIR  = r"C:\Users\내이름\Desktop\추출결과"

from pathlib import Path
output_dir = Path(OUTPUT_DIR)
output_dir.mkdir(exist_ok=True)

for pdf_file in Path(FOLDER_PATH).glob("*.pdf"):
    reader = PdfReader(str(pdf_file))
    all_text = []
    for i, page in enumerate(reader.pages):
        text = page.extract_text() or ""
        all_text.append(f"=== {i + 1}페이지 ===\n{text.strip()}\n")
    out = output_dir / (pdf_file.stem + ".txt")
    out.write_text("\n".join(all_text), encoding="utf-8")
    print(f"  ✔ {pdf_file.name} → {out.name}")
💡 이전 게시글과 결합하면: PDF 파일 자동 병합 편으로 여러 PDF를 하나로 합친 뒤, 이 스크립트로 전체 텍스트를 한 번에 추출하면 대용량 문서 처리가 훨씬 빠르고 편리합니다.

핵심 요약

  • 준비물: Python + pypdf + pandas + openpyxl 설치 (pip install pypdf pandas openpyxl)
  • 설정: PDF 파일 경로, txt 저장 경로, 엑셀 저장 경로만 수정
  • 실행: 터미널에서 python extract_pdf.py 입력
  • 결과: 페이지별 텍스트가 txt와 엑셀 파일로 동시 저장, 한글 깨짐 시 pdfplumber로 대체

이 코드를 응용하면 PDF에서 표 데이터만 골라서 추출하거나, 특정 키워드가 포함된 페이지만 별도로 저장하는 것도 가능합니다.

이 블로그의 인기 게시물

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁