Skip to content

pdfplumber vs PyMuPDF – 속도, 표, 라이선스

pdfplumber와 PyMuPDF는 인기 있는 Python PDF 라이브러리이지만, 둘 다 트레이드오프를 강요합니다. pdfplumber는 표 추출에 뛰어나지만 필요 이상으로 29배 느립니다. PyMuPDF는 빠르지만 상용 이용을 차단하는 AGPL-3.0 라이선스에 묶여 있습니다. 이 페이지에서 두 라이브러리를 비교하고 — PDF Oxide가 대부분의 사용 사례에서 더 나은 선택인 이유를 보여줍니다.

간단한 답변: PDF Oxide는 pdfplumber보다 29배 빠르고, PyMuPDF보다 5.8배 빠르며, MIT 라이선스이고, 텍스트, 이미지, 폼, 암호화, Markdown 출력, OCR을 하나의 라이브러리에서 모두 처리합니다. pdfplumber가 여전히 앞서는 유일한 영역은 시각적 디버깅이 포함된 복잡한 표 추출입니다.

빠른 비교

pdfplumber PyMuPDF PDF Oxide
License MIT AGPL-3.0 MIT
Language Pure Python C (MuPDF) Rust + PyO3
Mean extraction time 23.2ms 4.6ms 0.8ms
p99 extraction time 189ms 28ms 9ms
Pass rate (3,830 PDFs) 98.8% 99.3% 100%
Text extraction Yes Yes Yes
Character positions Yes Yes Yes
Table extraction Advanced Basic Basic
Image extraction No Yes Yes
Visual debugging Yes No No
PDF creation No Yes Yes
PDF editing No Yes Yes
Markdown output No No Yes
HTML output No No Yes
Form fields Read only Read + Write Read + Write
Encryption No Read + Write Read + Write
Rendering No Yes Yes
OCR No Tesseract Built-in (PaddleOCR)
Install size ~1 MB ~20 MB ~5 MB
Python versions 3.8+ 3.8–3.12 3.8–3.14

속도 벤치마크

세 라이브러리 모두 세 개의 독립적인 공개 테스트 스위트(veraPDF, Mozilla pdf.js, DARPA SafeDocs)의 동일한 3,830개 PDF 코퍼스에서 벤치마크했습니다. 이 코퍼스는 모든 PDF 사양 버전(1.0–2.0), 암호화된 파일, 비정상 문서, CJK 인코딩, 복잡한 레이아웃을 포함합니다.

Metric pdfplumber PyMuPDF PDF Oxide
Mean extraction time 23.2ms 4.6ms 0.8ms
p99 extraction time 189ms 28ms 9ms
Relative to PDF Oxide 29x slower 5.8x slower 1x
Pass rate (valid PDFs) 98.8% (3,777/3,823) 99.3% (3,796/3,823) 100% (3,823/3,823)

PyMuPDF는 모든 파싱을 MuPDF C 라이브러리에 위임하기 때문에 pdfplumber보다 약 5배 빠릅니다. pdfplumber는 파싱을 위해 pdfminer 위에 구축되고, 자체 공간 분석 레이어를 추가합니다 – 둘 다 Pure Python으로 작성되었습니다. PDF Oxide는 PyO3를 통해 Python 프로세스 내에서 직접 실행되는 컴파일된 Rust에서 모든 파싱, 폰트 디코딩, 텍스트 조립을 처리하며, 이것이 PyMuPDF 대비 5.8배, pdfplumber 대비 29배 우위의 원인입니다.

숫자가 실제로 의미하는 것

Workload pdfplumber PyMuPDF PDF Oxide
100 PDFs 2.3 seconds 0.46 seconds 0.08 seconds
1,000 PDFs 23 seconds 4.6 seconds 0.8 seconds
10,000 PDFs 3.9 minutes 46 seconds 8 seconds
100,000 PDFs 39 minutes 7.7 minutes 80 seconds

일회성 스크립트로 몇 개의 파일을 처리하는 경우 속도 차이는 무관합니다. 매일 수천 개의 문서를 처리하는 프로덕션 파이프라인에서는 39분과 80초의 차이가 아키텍처 결정을 바꿉니다.

표 추출

표 추출은 개발자들이 PyMuPDF 대신 pdfplumber를 선택하는 주된 이유입니다. 이 분야에서 pdfplumber가 진정으로 뛰어납니다.

pdfplumber: 구조화된 표 파싱

pdfplumber는 구성 가능한 라인 감지, 셀 병합, 시각적 디버깅을 갖춘 전용 표 추출을 제공합니다:

import pdfplumber

with pdfplumber.open("invoice.pdf") as pdf:
    page = pdf.pages[0]

    # Extract all tables as structured data
    tables = page.extract_tables()
    for table in tables:
        for row in table:
            print(row)

    # Fine-tune detection with custom settings
    tables = page.extract_tables({
        "vertical_strategy": "text",
        "horizontal_strategy": "lines",
        "snap_tolerance": 5,
    })

    # Visual debugging: render page with detected table boundaries
    im = page.to_image()
    im.debug_tablefinder()
    im.save("debug.png")

pdfplumber는 구조화된 행/열 데이터를 반환하며 병합된 셀, 스패닝 헤더, 테두리 없는 표를 처리합니다. 시각적 디버깅 오버레이는 까다로운 레이아웃에서 추출 파라미터를 조정하는 데 매우 유용합니다.

PyMuPDF: 기본 표 감지

PyMuPDF는 최근 버전에서 표 감지를 추가했지만, pdfplumber의 알고리즘보다 덜 성숙합니다:

import fitz

doc = fitz.open("invoice.pdf")
page = doc[0]

# PyMuPDF's built-in table finder (added in v1.23)
tabs = page.find_tables()
for table in tabs:
    df = table.to_pandas()  # requires pandas
    print(df)

PyMuPDF의 표 추출은 눈에 보이는 테두리가 있는 간단한 그리드 기반 표에서 잘 작동합니다. 테두리 없는 레이아웃, 다단계 헤더, 여러 행이나 열에 걸친 셀에서는 어려움을 겪습니다 – 정확히 pdfplumber가 가장 강한 케이스입니다.

PDF Oxide: Markdown 표 출력

PDF Oxide는 구조화된 출력 파이프라인의 일부로 표를 Markdown 구문으로 변환합니다:

from pdf_oxide import PdfDocument

doc = PdfDocument("invoice.pdf")

# Tables are detected and converted to Markdown table format
md = doc.to_markdown(0, detect_headings=True)
print(md)

# Also available as HTML with table tags
html = doc.to_html(0)
print(html)

PDF Oxide의 표 감지는 표준 그리드 레이아웃에서 기능적이며 깔끔한 Markdown 또는 HTML 출력을 생성합니다. 병합된 셀, 테두리 없는 디자인, 스패닝 헤더가 있는 복잡한 표의 경우 pdfplumber의 전용 알고리즘이 여전히 더 강력합니다.

표 추출 요약

Capability pdfplumber PyMuPDF PDF Oxide
Simple bordered tables Yes Yes Yes
Borderless tables Yes Limited Limited
Merged cells Yes Limited Limited
Multi-level headers Yes No No
Configurable detection Yes Limited No
Visual debugging Yes No No
Output format Python lists pandas DataFrames Markdown / HTML
Speed Slow (pure Python) Fast Fastest

복잡한 표 추출만 사용 사례라면 pdfplumber가 최고의 도구입니다. 빠른 텍스트 추출, 이미지 추출, PDF 생성과 함께 표가 필요하다면 PDF Oxide가 더 많은 영역을 다룹니다.

텍스트 추출

일반 텍스트 추출의 경우 두 라이브러리 모두 작업을 수행하지만 속도와 API 설계가 다릅니다.

pdfplumber

import pdfplumber

with pdfplumber.open("report.pdf") as pdf:
    page = pdf.pages[0]
    text = page.extract_text()
    print(text)

PyMuPDF

import fitz

doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)

PDF Oxide

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)

세 라이브러리 모두 잘 형성된 PDF에서 비교 가능한 텍스트 출력을 생성합니다. PDF Oxide는 전체 코퍼스에서 PyMuPDF와 99.5%의 텍스트 동등성을 달성하며, 나머지 0.5% 차이는 공백 정규화와 합자 처리에서 발생합니다.

문자 수준 위치

pdfplumber와 PyMuPDF 모두 문자 수준 위치 데이터를 제공하며, 이는 공간 분석, 바운딩 박스 감지, 커스텀 레이아웃 재구성에 중요합니다.

pdfplumber

import pdfplumber

with pdfplumber.open("report.pdf") as pdf:
    page = pdf.pages[0]
    for char in page.chars[:10]:
        print(f"'{char['text']}' at ({char['x0']:.1f}, {char['top']:.1f}) "
              f"size={char['size']:.1f}")

PyMuPDF

import fitz

doc = fitz.open("report.pdf")
page = doc[0]
blocks = page.get_text("dict")["blocks"]
for block in blocks:
    if "lines" in block:
        for line in block["lines"]:
            for span in line["spans"]:
                print(f"'{span['text']}' size={span['size']:.1f}")

PDF Oxide

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
chars = doc.extract_chars(0)
for ch in chars[:10]:
    print(f"'{ch.char}' at ({ch.x:.1f}, {ch.y:.1f}) size={ch.font_size:.1f}")

pdfplumber는 풍부한 메타데이터가 포함된 문자별 딕셔너리를 반환합니다. PyMuPDF는 중첩된 블록/라인/스팬 구조를 반환합니다. PDF Oxide는 위치와 폰트 데이터가 포함된 플랫 문자 객체를 반환합니다.

라이선스

이것은 상용 프로젝트에서 pdfplumber와 PyMuPDF 사이의 가장 중대한 차이점입니다.

pdfplumber PyMuPDF PDF Oxide
License MIT AGPL-3.0 MIT
Commercial product Yes Requires commercial license Yes
Closed-source SaaS Yes Requires commercial license Yes
Docker distribution Yes Requires commercial license Yes
Internal tools Yes Yes Yes
Open-source project Yes Yes (if AGPL-compatible) Yes

PyMuPDF의 AGPL 문제

PyMuPDF는 AGPL-3.0 라이선스의 MuPDF를 래핑합니다. PyMuPDF를 포함하는 소프트웨어를 배포하는 경우 – SaaS, 웹 앱, Docker 컨테이너 포함 – 해당 코드를 AGPL로 오픈소스화하거나 Artifex에서 상용 라이선스를 구매해야 합니다.

Artifex는 상용 라이선스 가격을 공개하지 않습니다. 영업팀에 견적을 요청해야 합니다. 라이선스는 일반적으로 애플리케이션별로, 매년 갱신되며, 무료 티어나 스타트업 예외가 없습니다.

pdfplumber와 PDF Oxide는 둘 다 MIT

pdfplumber와 PDF Oxide는 둘 다 MIT 라이선스입니다. 상용, 독점, SaaS, 오픈소스 등 어떤 프로젝트에서든 의무 없이 사용할 수 있습니다. 라이선스가 주요 관심사이고 pdfplumber와 PyMuPDF 중에서 선택하는 경우, pdfplumber(또는 PDF Oxide)가 더 안전한 선택입니다.

암호화된 PDF

암호화 처리는 pdfplumber 기능의 상당한 격차이며, 비밀번호로 보호된 문서를 다루는 개발자들의 일반적인 불편사항입니다.

pdfplumber: 암호화 지원 없음

pdfplumber는 암호화되거나 비밀번호로 보호된 PDF를 전혀 열 수 없습니다. 암호화된 PDF를 pdfplumber에 전달하면 오류가 발생합니다. 다른 도구를 사용하여 먼저 파일을 복호화해야 합니다:

import pdfplumber

# This will fail on encrypted PDFs:
with pdfplumber.open("encrypted.pdf") as pdf:
    # raises pdfminer.pdfparser.PDFSyntaxError or similar
    pass

일반적인 해결 방법은 PyMuPDF나 pypdf를 사용하여 먼저 파일을 복호화한 다음, 표 추출을 위해 pdfplumber에 전달하는 것입니다 – 파이프라인에 또 다른 의존성을 추가하게 됩니다.

PyMuPDF: 전체 암호화 지원

import fitz

doc = fitz.open("encrypted.pdf")
doc.authenticate("password")
page = doc[0]
text = page.get_text()

PyMuPDF는 사용자 및 소유자 비밀번호, AES-128 및 AES-256 암호화를 지원하며, 암호화된 PDF를 생성할 수 있습니다.

PDF Oxide: 전체 암호화 지원

from pdf_oxide import PdfDocument

doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0)

PDF Oxide는 읽기와 쓰기 모두에서 모든 표준 PDF 암호화 방식(RC4, AES-128, AES-256)을 처리합니다. 추가 의존성이나 전처리가 필요하지 않습니다.

이미지 추출

pdfplumber 기능의 또 다른 격차입니다. pdfplumber는 PDF에서 임베디드 이미지를 추출하지 못합니다.

PyMuPDF

import fitz

doc = fitz.open("report.pdf")
page = doc[0]
for i, img in enumerate(page.get_images()):
    xref = img[0]
    base_image = doc.extract_image(xref)
    with open(f"image_{i}.{base_image['ext']}", "wb") as f:
        f.write(base_image["image"])

PDF Oxide

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
images = doc.extract_image_bytes(0)
for i, img in enumerate(images):
    with open(f"image_{i}.{img['format']}", "wb") as f:
        f.write(img["data"])

파이프라인에서 PDF의 텍스트와 이미지를 모두 추출해야 하는 경우, pdfplumber는 이미지 측을 처리할 수 없습니다. 이를 위해서는 PyMuPDF, PDF Oxide, 또는 pypdfium2가 필요합니다.

Markdown 및 HTML 출력

pdfplumber와 PyMuPDF 모두 내장 Markdown 또는 HTML 변환을 제공하지 않습니다. 이것은 PDF Oxide의 고유 기능입니다.

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")

# Markdown with heading detection and table formatting
md = doc.to_markdown(0, detect_headings=True)
print(md)

# HTML with semantic tags
html = doc.to_html(0)
print(html)

LLM 파이프라인, RAG 시스템, 문서 변환 워크플로에서 구조화된 Markdown 출력은 별도의 변환 단계가 필요 없게 합니다. PyMuPDF 사용자는 일반적으로 별도의 pymupdf4llm 패키지에 의존하는데, 이는 PDF Oxide의 내장 변환보다 69배 느립니다.

각 라이브러리를 선택할 때

pdfplumber를 선택하세요:

  • 복잡한 표 추출이 주요 사용 사례인 경우. pdfplumber의 표 알고리즘이 병합된 셀, 테두리 없는 표, 스패닝 헤더를 다른 어떤 Python 라이브러리보다 잘 처리합니다.
  • 시각적 디버깅이 필요한 경우. pdfplumber는 감지된 라인, 문자, 표 경계를 보여주는 주석이 달린 페이지 이미지를 렌더링할 수 있습니다 – 까다로운 문서에서 추출을 조정하는 데 매우 유용합니다.
  • Pure Python 솔루션을 원하는 경우. 컴파일된 의존성 없이, Python이 실행되는 어디서나 설치 가능합니다.
  • 속도가 중요하지 않은 경우. 한 번에 100개 미만의 파일을 처리한다면 평균 23ms는 충분히 수용 가능합니다.

PyMuPDF를 선택하세요:

  • 이미 상용 MuPDF 라이선스가 있고 MuPDF 고유 렌더링이나 SVG 내보내기에 의존하는 경우.
  • 고품질 렌더링이 필요한 경우. MuPDF의 렌더링 엔진은 성숙하고 복잡한 PDF를 잘 처리합니다.
  • 프로젝트가 AGPL과 호환되는 경우. AGPL 또는 호환 라이선스로 오픈소스 소프트웨어를 구축하는 경우 PyMuPDF의 라이선스는 문제가 되지 않습니다.
  • Tesseract를 통한 OCR이 필요한 경우. PyMuPDF는 스캔 문서를 위한 내장 Tesseract 통합을 제공합니다.

PDF Oxide를 선택하세요:

  • 속도와 넓은 기능 범위가 필요한 경우. 평균 0.8ms 추출 – PyMuPDF보다 5.8배, pdfplumber보다 29배 빠름 – 텍스트, 이미지, 폼, 생성, 암호화를 하나의 라이브러리에서 제공합니다.
  • 속도를 희생하지 않는 MIT 라이선스를 원하는 경우. pdfplumber는 MIT이지만 느립니다. PyMuPDF는 빠르지만 AGPL입니다. PDF Oxide는 MIT이면서 빠릅니다.
  • Markdown 또는 HTML 출력이 필요한 경우. LLM 파이프라인과 RAG 시스템을 위한 내장 구조화된 변환.
  • 허용적 라이선스로 암호화된 PDF 지원이 필요한 경우. pdfplumber는 암호화를 처리할 수 없습니다. PyMuPDF는 가능하지만 AGPL 준수가 필요합니다. PDF Oxide는 MIT에서 암호화를 처리합니다.
  • 추출, 생성, 편집을 위한 단일 라이브러리를 원하는 경우. pdfplumber와 PyMuPDF 모두 PDF 워크플로의 일부에 추가 도구가 필요합니다. PDF Oxide는 추출, 생성, 편집, 렌더링, 검증을 모두 다룹니다.

PDF Oxide + pdfplumber 함께 사용:

빠른 텍스트 추출, 이미지 추출, 복잡한 표 파싱이 필요한 파이프라인에서는, 일반 파이프라인에 PDF Oxide를, 표에 pdfplumber를 사용하세요:

from pdf_oxide import PdfDocument
import pdfplumber

# Fast text and image extraction with PDF Oxide
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
images = doc.extract_image_bytes(0)

# Complex table extraction with pdfplumber
with pdfplumber.open("report.pdf") as pdf:
    tables = pdf.pages[0].extract_tables()

설치

# pdfplumber
pip install pdfplumber

# PyMuPDF
pip install pymupdf

# PDF Oxide
pip install pdf_oxide

세 라이브러리 모두 pip으로 설치됩니다. pdfplumber와 PDF Oxide는 MIT 라이선스입니다. PyMuPDF는 AGPL-3.0입니다 – 상용 프로젝트에 추가하기 전에 라이선스 영향을 검토하세요.

결론

pdfplumber와 PyMuPDF는 각각 문제의 일부를 해결합니다. PDF Oxide는 전체를 해결합니다.

What matters to you Best choice
Maximum speed PDF Oxide (0.8ms – 29× faster than pdfplumber)
Complex table extraction pdfplumber (visual debugging, merged cells)
Permissive license + speed PDF Oxide – pdfplumber is MIT but slow, PyMuPDF is fast but AGPL
Encrypted PDFs PDF Oxide or PyMuPDF – pdfplumber cannot decrypt
Image extraction PDF Oxide or PyMuPDF – pdfplumber has no image support
Markdown/HTML output PDF Oxide – only library with built-in conversion
OCR without Tesseract PDF Oxide – built-in PaddleOCR
One library for everything PDF Oxide – extraction, creation, editing, encryption, OCR

전체 워크플로가 복잡한 표 추출(테두리 없는 표, 병합된 셀, 시각적 디버깅)이 아닌 한, PDF Oxide는 pdfplumber와 PyMuPDF 모두를 대체합니다 — 더 빠르고, 더 많은 기능, MIT 라이선스.

10초 만에 시작하세요:

pip install pdf_oxide
from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
text = doc.extract_text(0)       # 29× faster than pdfplumber
md = doc.to_markdown(0)          # built-in, no separate package
images = doc.extract_image_bytes(0)   # pdfplumber can't do this

관련 페이지