logo
menu

파이썬에서 PDF 텍스트 추출하는 방법 (3가지 라이브러리 비교)

By Lynote Team | June 8, 2026

PDF에서 텍스트를 추출하는 것은 간단해 보이지만, 시도해 본 개발자라면 예외, 깨진 레이아웃, 고집스러운 이미지 기반 문서로 가득 찬 분야라는 것을 알고 있습니다. 이 가이드는 이러한 혼란을 해결해 드립니다. 프로젝트에 적합한 도구를 즉시 선택할 수 있도록, 이 작업에 가장 적합한 Python 라이브러리를 직접 비교하는 것부터 시작하겠습니다.

extract-text-from-pdf-python.jpg

그런 다음 PyPDF2, pdfplumber, PyMuPDF (Fitz) 등 가장 효과적인 세 가지 라이브러리에 대한 코드 예제를 살펴보며, 기본적인 텍스트 스크래핑부터 복잡한 테이블 탐색까지 모든 것을 다룰 것입니다. 또한 가장 어려운 과제인 광학 문자 인식(OCR)이 필요한 스캔된 PDF를 다루고, 복잡한 로컬 설정 없이 이를 처리하는 실용적인 방법을 보여드릴 것입니다. 이 가이드를 마치면 PDF 처리 워크플로우를 안정적으로 자동화할 수 있는 코드와 전략을 갖게 될 것입니다.

빠른 결론: PDF 텍스트 추출을 위한 최고의 Python 라이브러리

코드를 자세히 살펴보기 전에, 주요 경쟁자들을 간략하게 살펴보겠습니다. 어떤 라이브러리를 선택할지는 속도, 단순성 또는 정밀한 레이아웃 분석이 필요한지에 따라 전적으로 달라질 것입니다.

라이브러리최적의 용도레이아웃/테이블 처리성능사용 편의성 (1-5)
PyPDF2간단한 텍스트 전용 문서; 기본적인 PDF 조작 (병합/분할)미흡 (텍스트 스트림 추출, 위치 데이터 없음)보통5
pdfplumber테이블에서 데이터 추출; 구조화된 레이아웃 문서우수 (텍스트, 선, 사각형의 좌표 제공)느림4
PyMuPDF (Fitz)고속 배치 처리; 이미지 및 주석 처리양호 (기본 위치 정보로 텍스트 추출 가능)우수 (가장 빠름)4

결론: 가장 간단한 경우에는 PyPDF2로 시작하세요. 테이블을 발견하는 즉시 pdfplumber로 전환하세요. 성능이 가장 중요한 고려 사항이라면 PyMuPDF를 선택하세요.

시작하기 전에: Python 환경 설정

프로젝트 종속성을 깔끔하게 유지하고 충돌을 피하려면 항상 가상 환경 내에서 작업하세요. 이는 모든 진지한 Python 프로젝트에서 필수적인 모범 사례입니다.

터미널에서 설정하는 방법은 다음과 같습니다:

  1. 가상 환경 생성:

    # On macOS/Linux
    python3 -m venv pdf_env
    
    # On Windows
    python -m venv pdf_env
    
  2. 활성화:

    # On macOS/Linux
    source pdf_env/bin/activate
    
    # On Windows
    .\pdf_env\Scripts\activate
    

    이제 터미널 프롬프트에 (pdf_env)가 표시될 것입니다.

  3. 라이브러리 설치: 쉽게 실험할 수 있도록 비교할 세 가지 라이브러리를 모두 설치하겠습니다.

    pip install pypdf2 pdfplumber pymupdf
    

    이제 아래 코드 예제를 위한 환경이 준비되었습니다.


방법 1: PyPDF2를 사용한 기본 텍스트 추출

PyPDF2는 기본적인 PDF 작업을 위한 핵심 라이브러리입니다. 간단하고 오랫동안 사용되어 왔으며, 텍스트를 선택할 수 있고 이미지의 일부가 아닌 "네이티브" PDF에 적합합니다. 문서가 간단한 보고서, 기사 또는 텍스트 기반 내보내기인 경우 PyPDF2는 최소한의 코드로 작업을 완료할 수 있습니다.

주요 한계점은 무엇일까요? PyPDF2는 PDF의 내부 텍스트 스트림을 읽는데, 이는 특히 다단 레이아웃에서 시각적인 읽기 순서와 항상 일치하지는 않습니다. 또한 테이블에 대한 개념이 없어서 모든 셀 텍스트를 한데 섞어버립니다.

다음은 PDF에서 모든 텍스트를 추출하는 간단한 스크립트입니다:

# requirements: pip install pypdf2

import PyPDF2

def extract_text_with_pypdf2(pdf_path):
    """
    Extracts text from a PDF file using the PyPDF2 library.

    Args:
        pdf_path (str): The file path to the PDF.

    Returns:
        str: The extracted text content, or an error message.
    """
    try:
        with open(pdf_path, 'rb') as file:
            reader = PyPDF2.PdfReader(file)
            num_pages = len(reader.pages)
            print(f"Total pages: {num_pages}")

            full_text = ""
            for page_num in range(num_pages):
                page = reader.pages[page_num]
                full_text += page.extract_text() + "\n"
        
        return full_text

    except FileNotFoundError:
        return f"Error: The file at {pdf_path} was not found."
    except Exception as e:
        return f"An unexpected error occurred: {e}"

# --- Usage Example ---
pdf_file = 'path/to/your/document.pdf'
extracted_text = extract_text_with_pypdf2(pdf_file)

if "Error" not in extracted_text:
    print("--- Extracted Text ---")
    print(extracted_text)
else:
    print(extracted_text)

이 스크립트는 간단한 단일 열 텍스트에는 훌륭하게 작동합니다. 하지만 깔끔한 테이블이 있는 재무제표를 입력하면 어떻게 될까요? 구조가 없는 텍스트와 숫자의 뒤죽박죽이 됩니다. 바로 여기서 다음 라이브러리가 빛을 발합니다.

방법 2: pdfplumber를 사용한 테이블 및 레이아웃 처리

구조화된 데이터를 추출하는 작업이라면 pdfplumber가 적합한 도구입니다. pdfminer.six를 기반으로 구축된 이 라이브러리는 PDF 페이지의 기하학적 구조에 대한 세밀한 접근을 제공하도록 설계되었습니다. 문자, 선, 사각형을 "보고" 테이블을 감지하고 추출하는 환상적인 내장 메서드를 가지고 있습니다.

이는 데이터 과학 및 비즈니스 자동화 작업에 있어 판도를 바꾸는 요소입니다. 회사의 PDF 보고서에서 분기별 수익을 추출하려고 한다고 상상해 보세요. PyPDF2로는 문자열 구문 분석의 악몽이 될 것입니다. pdfplumber를 사용하면 데이터를 깔끔한 리스트의 리스트 형태로 가져와 Pandas DataFrame에 바로 사용할 수 있습니다.

pdfplumber가 구조화된 데이터에서 PyPDF2보다 뛰어난 주된 이유는 원시 텍스트 스트림뿐만 아니라 시각적 레이아웃을 해석하는 능력 때문입니다. 특정 텍스트 요소가 행과 열로 정렬되어 있고 선으로 구분되어 있다는 것을 이해합니다.

다음은 PDF 페이지에서 테이블을 추출하는 방법입니다:

# requirements: pip install pdfplumber

import pdfplumber
import pandas as pd

def extract_tables_with_pdfplumber(pdf_path, page_number=0):
    """
    Extracts all tables from a specific page of a PDF using pdfplumber.

    Args:
        pdf_path (str): The file path to the PDF.
        page_number (int): The page number to extract tables from (0-indexed).

    Returns:
        list of pandas.DataFrame: A list where each element is a DataFrame
                                  representing a table found on the page.
    """
    tables = []
    try:
        with pdfplumber.open(pdf_path) as pdf:
            if page_number >= len(pdf.pages):
                print(f"Error: Page {page_number} is out of range. The PDF has {len(pdf.pages)} pages.")
                return tables
            
            page = pdf.pages[page_number]
            # .extract_tables() is the key method here
            extracted_tables = page.extract_tables()
            
            for table_data in extracted_tables:
                # Convert the list of lists into a pandas DataFrame
                df = pd.DataFrame(table_data[1:], columns=table_data[0])
                tables.append(df)
        
        return tables

    except FileNotFoundError:
        print(f"Error: The file at {pdf_path} was not found.")
        return tables
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
        return tables

# --- Usage Example ---
# You'll need pandas for this example: pip install pandas
pdf_file_with_table = 'path/to/your/report.pdf'
all_tables = extract_tables_with_pdfplumber(pdf_file_with_table, page_number=0)

if all_tables:
    print(f"Found {len(all_tables)} table(s) on page 0.")
    for i, table_df in enumerate(all_tables):
        print(f"\n--- Table {i+1} ---")
        print(table_df)
else:
    print("No tables found on the specified page.")

이러한 정밀함의 대가는 속도입니다. pdfplumber는 페이지를 분석하는 데 더 많은 작업을 수행하므로, 단순히 텍스트를 덤프하는 라이브러리보다 본질적으로 느립니다.

방법 3: PyMuPDF (Fitz)를 사용한 고성능 추출

수백 또는 수천 개의 PDF를 빠르게 처리해야 할 때, 성능이 결정적인 요소가 됩니다. 바로 이 지점에서 fitz로 가져오는 PyMuPDF가 압도적입니다. PyMuPDF는 경량 C 라이브러리인 MuPDF의 Python 바인딩으로, 매우 빠릅니다.

저는 한때 수천 개의 다중 페이지 법률 문서를 처리해야 하는 프로젝트를 맡은 적이 있습니다. 초기 pdfplumber 스크립트는 몇 시간이 걸릴 것으로 예상되었습니다. PyMuPDF로 전환하자 실행 시간이 30분 미만으로 단축되었습니다. 속도 차이가 그만큼 극적입니다.

속도 외에도 PyMuPDF는 강력한 기능을 자랑합니다. 페이지를 이미지로 렌더링(OCR 워크플로우에 중요), 내장 이미지 추출, 주석 처리 등이 가능합니다. 테이블 추출 기능이 pdfplumber만큼 즉시 사용 가능한 것은 아니지만, 원시 텍스트 추출 속도는 타의 추종을 불허합니다.

다음은 빠른 텍스트 추출을 위한 PyMuPDF의 예시입니다:

# requirements: pip install PyMuPDF

import fitz  # The PyMuPDF library

def extract_text_with_pymupdf(pdf_path):
    """
    Extracts text from a PDF file using the high-performance PyMuPDF (Fitz) library.

    Args:
        pdf_path (str): The file path to the PDF.

    Returns:
        str: The extracted text content, or an error message.
    """
    try:
        doc = fitz.open(pdf_path)
        full_text = ""
        for page in doc:
            # .get_text() is the core function
            full_text += page.get_text() + "\n"
        
        doc.close()
        return full_text

    except FileNotFoundError:
        return f"Error: The file at {pdf_path} was not found."
    except Exception as e:
        # PyMuPDF can raise specific errors, e.g., fitz.fitz.FitzError
        return f"An error occurred with PyMuPDF: {e}"

# --- Usage Example ---
pdf_file = 'path/to/your/document.pdf'
fast_extracted_text = extract_text_with_pymupdf(pdf_file)

if "Error" not in fast_extracted_text:
    print("--- Extracted Text (Fast Method) ---")
    print(fast_extracted_text)
else:
    print(fast_extracted_text)

텍스트 기반 PDF의 순수한 처리량에 있어서 PyMuPDF는 독보적인 챔피언입니다.


특수 사례: OCR을 사용하여 스캔된 PDF 처리

이러한 방법 중 어느 것도 작동하지 않으면 어떻게 될까요? 스캔된 문서(예: 계약서 사진 또는 디지털화된 책 페이지)에 위 코드를 실행하면 빈 문자열이 반환될 것입니다.

이는 텍스트 레이어가 없기 때문에 발생합니다. PDF에는 문자가 아닌 이미지가 포함되어 있습니다. 이를 해결하려면 광학 문자 인식(OCR)을 사용하여 이미지를 "읽고" 기계가 읽을 수 있는 텍스트로 변환해야 합니다.

표준 Python 솔루션은 Google의 Tesseract OCR 엔진용 래퍼인 pytesseract입니다. 강력하지만, 큰 골칫거리가 있습니다. Tesseract를 시스템에 별도로 설치(예: Mac에서는 brew를 통해, Windows에서는 설치 프로그램을 통해)하고 Python이 실행 파일을 찾을 수 있도록 해야 합니다. 이 설정은 특히 코드를 서버에 배포하거나 동료와 공유할 때 취약할 수 있습니다.

대안: 노코드 도구로 복잡한 PDF 사전 처리

마감 기한이 촉박하거나 OCR 종속성 관리에 번거로움을 느끼고 싶지 않다면, 텍스트 추출 작업을 전용 도구에 먼저 맡기는 것이 실용적인 대안입니다. 이렇게 하면 복잡한 OCR 문제를 핵심 Python 로직과 분리할 수 있습니다.

Lynote AI PDF 텍스트 추출기와 같은 AI 기반 도구는 강력한 전처리기로 작동할 수 있습니다. 복잡한 스캔 PDF를 업로드하면, 이 도구가 백그라운드에서 OCR을 처리하여 스크립트에 입력할 수 있는 깔끔한 텍스트를 제공합니다. 이는 일회성 작업이나 소량의 문제성 파일을 처리할 때 특히 유용합니다.

워크플로우는 다음과 같이 간단합니다:

  1. PDF 파일 업로드. Lynote 작업 공간으로 이동합니다. '파일 업로드' 탭에서 PDF를 드래그 앤 드롭하거나 컴퓨터를 탐색하여 선택할 수 있습니다. 이는 텍스트 기반 및 스캔된 이미지 기반 PDF 모두에 작동합니다.
  2. PDF에서 텍스트 추출. 파일이 업로드되면 "노트 생성" 버튼을 클릭합니다. Lynote의 AI 엔진은 문서를 처리하여 이미지 기반 파일을 감지하면 자동으로 OCR을 적용하고, 깔끔하고 검색 가능한 텍스트 버전을 생성합니다.
  3. 추출된 텍스트 복사. 텍스트가 편집기에 나타나면 검토하고 사소한 수정을 한 다음 복사 버튼을 사용하여 전체 내용을 가져올 수 있습니다. 이제 클립보드에 있으며, Python 스크립트에 문자열 변수로 붙여넣을 준비가 되었습니다.

file-upload.jpg

extract-pdf-text.jpg

이 접근 방식은 로컬 OCR 설정의 인프라 및 오류 처리 대신 코드의 데이터 분석 부분에 집중할 수 있도록 합니다.

일반적인 문제점 및 고급 팁

PDF에서 텍스트를 추출하는 과정은 완벽한 경우가 거의 없습니다. 다음은 발생할 수 있는 몇 가지 일반적인 문제입니다:

  • 문자 인코딩: UnicodeDecodeError가 발생할 수 있습니다. 이는 오래된 PDF 또는 잘 알려지지 않은 소프트웨어로 생성된 PDF에서 자주 발생합니다. 대부분의 최신 라이브러리는 UTF-8을 잘 처리하지만, 라이브러리가 허용하는 경우 인코딩을 지정하면 도움이 될 수 있습니다.
  • 암호로 보호된 PDF: PDF를 열 때 암호가 필요한 경우, 이 모든 라이브러리는 실패합니다. 열기 과정에서 암호를 제공해야 합니다. 예를 들어, PyPDF2.PdfReader(file, password='your_password')와 같이 사용합니다.
  • 서식 손실: 텍스트 추출은 굵게, 기울임꼴, 글꼴 크기, 색상과 같은 서식을 거의 항상 잃는다는 점을 기억하세요. 시각적 표현이 아닌 원시 텍스트 콘텐츠를 얻는 것입니다.
  • 열에서 뒤섞인 텍스트: PyPDF2에서 언급했듯이, 다단 레이아웃(학술 논문 등)은 다른 열의 줄이 섞인 텍스트를 초래할 수 있습니다. pdfplumber는 페이지의 기하학적 구조를 이해하므로 이러한 텍스트를 분리하는 데 훨씬 뛰어납니다.

전문가 팁: 항상 문서의 대표 샘플에 대해 스크립트를 테스트하세요. 한 PDF에서 완벽하게 작동하는 솔루션이 다른 출처의 PDF에서는 완전히 실패할 수 있습니다.

자주 묻는 질문

테이블에서 추출한 텍스트가 길고 지저분한 하나의 문자열로 변하는 이유는 무엇인가요?

이는 페이지 레이아웃을 분석하지 않는 PyPDF2와 같은 라이브러리의 전형적인 실패 모드입니다. 이들은 파일에 저장된 순서대로 원시 텍스트 스트림을 읽는데, 이는 시각적인 행과 열 구조와 일치하지 않는 경우가 많습니다. 이를 해결하려면 테이블 데이터를 인식하도록 특별히 설계된 **pdfplumber**와 같은 레이아웃 인식 라이브러리를 사용해야 합니다.

Python으로 PDF 페이지의 특정 영역에서 텍스트를 추출할 수 있나요?

네, 하지만 좌표 정보를 제공하는 라이브러리가 필요합니다. pdfplumberPyMuPDF가 이 용도로 훌륭합니다. pdfplumber를 사용하면 .crop((x0, top, x1, bottom)) 메서드를 사용하여 경계 상자를 만들고, 해당 잘라낸 영역 내에서만 .extract_text() 또는 .extract_tables()를 실행할 수 있습니다.

스캔한 PDF에서 추출된 텍스트가 비어 있는 이유는 무엇인가요?

귀하의 PDF에는 실제 텍스트 데이터가 아닌 텍스트 이미지가 포함되어 있습니다. 표준 라이브러리는 이미지를 "읽을" 수 없습니다. 광학 문자 인식(OCR) 프로세스를 사용해야 합니다. pytesseract로 로컬 OCR 엔진을 설정하거나 Lynote와 같은 전처리 도구를 사용하여 이미지 기반 PDF를 먼저 깔끔한 텍스트로 변환할 수 있습니다.

여러 언어가 포함된 PDF는 어떻게 처리하나요?

PyMuPDF 및 pdfplumber와 같은 최신 라이브러리는 일반적으로 유니코드(대부분의 언어 지원)를 잘 처리합니다. 주요 과제는 OCR 과정에서 발생합니다. 예를 들어, Tesseract는 사용하려는 언어 팩을 다운로드하고 지정해야 합니다(예: 영어와 프랑스어의 경우 -l eng+fra).

결론: 올바른 Python PDF 도구 선택

Python에서 PDF에서 텍스트를 추출하는 데 있어 단 하나의 "최고" 라이브러리는 없습니다. 올바른 선택은 항상 문서의 특성과 프로젝트 목표에 따라 결정됩니다.

간단한 의사 결정 트리로 요약해 보겠습니다:

  • PDF가 간단한 텍스트 기반 문서이고 원시 콘텐츠만 필요한 경우, PyPDF2가 가장 쉽고 빠르게 구현할 수 있습니다.
  • PDF에 테이블 또는 구조화된 레이아웃이 포함되어 있고 이를 데이터로 구문 분석해야 하는 경우(예: 데이터베이스 또는 Pandas DataFrame으로 로드), pdfplumber가 확실한 승자입니다.
  • 대량의 문서를 처리하고 원시 속도가 최우선 순위인 경우, **PyMuPDF (Fitz)**가 가장 강력하고 성능이 뛰어난 옵션입니다.
  • 스캔된 이미지 기반 PDF를 다루는 경우, OCR을 사용해야 합니다. 로컬 설정의 번거로움 없이 빠르고 안정적인 솔루션을 원한다면, 외부 도구로 파일을 전처리하여 깔끔한 텍스트를 Python 환경으로 가져오는 것이 가장 실용적인 방법인 경우가 많습니다.