PyMuPDF vs pypdf — 어떤 Python PDF 라이브러리를 선택할까요?
PyMuPDF와 pypdf는 가장 인기 있는 Python PDF 라이브러리 중 둘이지만, 둘 다 상당한 트레이드오프가 있습니다. PyMuPDF는 빠르지만 AGPL-3.0 라이선스에 묶여 있습니다. pypdf는 허용적 라이선스이지만 15배 느립니다. 이 페이지에서 두 라이브러리를 정면 비교하고 — PDF Oxide가 둘 모두보다 나은 선택인 이유를 보여줍니다.
간단한 답변: PDF Oxide는 PyMuPDF보다 5.8배, pypdf보다 15배 빠르며, MIT 라이선스이고, 내장 Markdown/HTML 출력, XFA 폼 지원, 시스템 의존성 없는 OCR을 포함하여 두 라이브러리보다 더 많은 기능을 제공합니다.
빠른 비교
| PyMuPDF | pypdf | PDF Oxide | |
|---|---|---|---|
| License | AGPL-3.0 | BSD-3 | MIT |
| Language | C (MuPDF) | Pure Python | Rust + PyO3 |
| Mean extraction time | 4.6ms | 12.1ms | 0.8ms |
| p99 extraction time | 28ms | 97ms | 9ms |
| Pass rate (3,830 PDFs) | 99.3% | 98.4% | 100% |
| Text extraction | Yes | Yes | Yes |
| Character positions | Yes | Partial | Yes |
| Image extraction | Yes | Yes | Yes |
| Form fields | Read + Write | Read + Write | Read + Write |
| PDF creation | Yes | Limited (merge only) | Yes (Markdown/HTML) |
| Markdown output | No | No | Yes |
| HTML output | No | No | Yes |
| Rendering | Yes | No | Yes |
| OCR | Tesseract | No | Built-in (PaddleOCR) |
| Install size | ~20 MB | ~1 MB | ~5 MB |
| Encryption | Read + Write | Read + Write | Read + Write |
| Search | Yes | No | Regex + spatial |
| Python versions | 3.8–3.12 | 3.6+ | 3.8–3.14 |
PyMuPDF는 pypdf보다 빠르고 기능이 풍부하지만, AGPL 라이선스는 많은 상용 프로젝트에서 거래 불가 조건입니다. pypdf는 가볍고 BSD 라이선스이지만, 상당히 느리고 추출 기능이 더 제한적입니다. PDF Oxide는 네이티브 엔진의 속도 장점과 허용적 라이선스의 자유를 결합합니다.
라이선스: AGPL vs BSD vs MIT
PyMuPDF와 pypdf 사이의 라이선스 차이는 팀이 둘 중 하나를 선택할 때 종종 결정적 요소입니다.
PyMuPDF — AGPL-3.0
PyMuPDF는 AGPL-3.0 라이선스의 MuPDF를 래핑합니다. 이것은 강력한 카피레프트 라이선스입니다. PyMuPDF를 사용하는 소프트웨어를 배포하는 경우 — SaaS 애플리케이션, Docker 컨테이너, 웹 서비스, 데스크톱 앱, CLI 도구 포함 — 전체 애플리케이션을 AGPL-3.0으로 공개해야 합니다. 이는 동일한 라이선스로 전체 소스 코드를 게시해야 한다는 것을 의미합니다.
대안은 MuPDF를 개발하는 회사인 Artifex에서 상용 라이선스를 구매하는 것입니다. Artifex는 가격을 공개하지 않으며, 영업팀에 견적을 요청해야 합니다. 상용 라이선스는 일반적으로 연간이며 애플리케이션별로 가격이 책정됩니다.
AGPL이 영향을 미치는 경우:
- PyMuPDF를 포함하는 제품을 출시하는 경우 (데스크톱 앱, 모바일 앱, Electron)
- PyMuPDF로 PDF를 처리하는 SaaS 또는 웹 서비스를 운영하는 경우
- PyMuPDF가 포함된 Docker 이미지를 배포하는 경우
- 내부적으로 PyMuPDF를 사용하는 API를 제공하는 경우
AGPL이 영향을 미치지 않는 경우:
- 프로젝트가 이미 AGPL 호환 라이선스로 오픈소스화된 경우
- 배포되지 않는 내부 도구에만 PyMuPDF를 사용하는 경우
pypdf — BSD-3
pypdf는 허용적인 BSD 3-Clause 라이선스를 사용합니다. 상용 제품, 비공개 소스 소프트웨어, SaaS 애플리케이션에서 소스 코드를 공개할 의무 없이 pypdf를 사용할 수 있습니다. 유일한 요구사항은 재배포 시 저작권 고지를 유지하는 것입니다.
PDF Oxide — MIT
PDF Oxide는 MIT 라이선스입니다 — 가장 허용적인 일반 오픈소스 라이선스입니다. 라이선스 텍스트 포함 외에 제한 없이 어떤 맥락에서든(상용, 독점, SaaS, 오픈소스) 사용할 수 있습니다.
라이선스 요약
| Use Case | PyMuPDF (AGPL) | pypdf (BSD) | PDF Oxide (MIT) |
|---|---|---|---|
| Commercial product | Requires license | Yes | Yes |
| Closed-source SaaS | Requires license | Yes | Yes |
| Docker distribution | Requires license | Yes | Yes |
| Internal tools | Yes | Yes | Yes |
| Open-source (AGPL-compatible) | Yes | Yes | Yes |
| Open-source (MIT/BSD/Apache) | No | Yes | Yes |
라이선스 준수가 중요한 상용 프로젝트의 경우, pypdf와 PDF Oxide가 모두 안전한 선택입니다. PyMuPDF는 애플리케이션을 오픈소스화하거나 상용 라이선스를 구매해야 합니다.
속도 벤치마크
모든 벤치마크는 동일한 3,830개 PDF 코퍼스에서 수행되었습니다 — 모든 PDF 사양 버전(1.0–2.0), 암호화된 파일, CJK 인코딩, 복잡한 레이아웃, 비정상 문서를 포괄하는 세 개의 독립적이고 공개적으로 이용 가능한 테스트 스위트(veraPDF, Mozilla pdf.js, DARPA SafeDocs)입니다.
텍스트 추출 Speed
| Library | Mean | p99 | Relative to PDF Oxide |
|---|---|---|---|
| PDF Oxide | 0.8ms | 9ms | 1x |
| PyMuPDF | 4.6ms | 28ms | 5.8x slower |
| pypdf | 12.1ms | 97ms | 15.1x slower |
PyMuPDF는 MuPDF의 C 엔진에 파싱을 위임하기 때문에 pypdf보다 2.6배 빠릅니다. pypdf는 모든 것을 Pure Python에서 수행합니다 — 파싱, 폰트 디코딩, 텍스트 조립 — 이는 모든 작업이 인터프리터 오버헤드를 지불한다는 것을 의미합니다.
PDF Oxide는 Rust 코어가 PyO3를 통해 모든 PDF 파싱, 폰트 디코딩, 텍스트 레이아웃을 네이티브로 처리하며, 최종 결과만 Python 경계를 넘어가기 때문에 둘 다보다 빠릅니다. 서브프로세스 오버헤드, ctypes를 통한 C 라이브러리 브릿징, 인터프리터 병목이 없습니다.
신뢰성
| Library | Valid PDFs Passed | Pass Rate |
|---|---|---|
| PDF Oxide | 3,823 / 3,823 | 100% |
| PyMuPDF | 3,796 / 3,823 | 99.3% |
| pypdf | 3,762 / 3,823 | 98.4% |
PyMuPDF는 코퍼스의 유효 PDF 27개에서 실패합니다. pypdf는 61개에서 실패합니다. 두 경우 모두 라이브러리가 크래시하거나 빈/잘못된 텍스트를 반환하는 유효 PDF 파일입니다. PDF Oxide는 3,823개의 유효 PDF를 모두 실패 없이 처리합니다.
전체 3,830개 파일 코퍼스에서 통과하지 못하는 7개 파일은 의도적으로 손상된 테스트 픽스처(누락된 PDF 헤더, 퍼즈로 손상된 카탈로그, 잘못된 xref 스트림)이며, 모든 라이브러리의 통과율 계산에서 제외됩니다.
실제로 의미하는 것
매일 수천 개의 PDF를 처리하는 파이프라인에서, PyMuPDF의 99.3% 통과율은 1,000개 문서당 약 7개의 실패를 의미합니다. pypdf의 98.4%는 1,000개당 16개 실패를 의미합니다. 이러한 문서는 폴백 로직, 수동 검토, 또는 단순히 데이터 손실로 받아들여야 합니다.
PDF Oxide의 테스트 코퍼스에서 100% 통과율은 프로덕션에서 처리해야 할 엣지 케이스가 더 적다는 것을 의미합니다.
기능 비교
텍스트 추출
세 라이브러리 모두 기본 텍스트 추출을 지원합니다. API 스타일이 다릅니다:
PyMuPDF:
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)
pypdf:
from pypdf import PdfReader
reader = PdfReader("report.pdf")
text = reader.pages[0].extract_text()
print(text)
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)
PyMuPDF는 페이지 오브젝트 모델을 사용합니다(doc[0]이 페이지를 반환). pypdf는 리더/페이지 패턴을 사용합니다. PDF Oxide는 페이지 인덱스를 직접 사용합니다.
문자 수준 추출(위치, 폰트 크기, 바운딩 박스)의 경우, PyMuPDF는 중첩된 dict 구조를 반환하는 get_text("dict")를 제공합니다. pypdf는 부분적인 문자 위치 데이터를 제공합니다. PDF Oxide는 extract_chars()로 문자별 바운딩 박스와 폰트 메타데이터를 제공합니다.
Markdown 변환
이것은 중요한 차별화 요소입니다. 많은 LLM 및 RAG 파이프라인이 PDF에서 Markdown 출력을 필요로 합니다.
PyMuPDF:
# PyMuPDF has no built-in Markdown conversion.
# You need pymupdf4llm, a separate package:
import pymupdf4llm
md = pymupdf4llm.to_markdown("paper.pdf")
pymupdf4llm은 작동하지만 PDF Oxide의 내장 Markdown 변환보다 69배 느립니다(평균 55.5ms vs 0.8ms). 또한 자체 유지보수 주기를 가진 별도의 의존성입니다.
pypdf:
# pypdf has no Markdown conversion.
# You would need an external tool chain (e.g., extract text,
# then use a separate library to structure it as Markdown).
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)
PDF Oxide의 Markdown 변환은 내장되어 있으며, 제목 감지를 처리하고, 표 구조를 보존하며, 일반 텍스트 추출과 같은 속도로 실행됩니다.
HTML 변환
PyMuPDF: 내장 HTML 출력 없음.
pypdf: HTML 출력 없음.
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
html = doc.to_html(0)
print(html)
폼 필드
세 라이브러리 모두 폼 필드(AcroForm) 읽기와 쓰기를 지원합니다.
PyMuPDF:
import fitz
doc = fitz.open("form.pdf")
page = doc[0]
for widget in page.widgets():
print(f"{widget.field_name}: {widget.field_value}")
pypdf:
from pypdf import PdfReader
reader = PdfReader("form.pdf")
fields = reader.get_fields()
for name, field in fields.items():
print(f"{name}: {field.get('/V', '')}")
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("form.pdf")
fields = doc.get_form_fields()
for field in fields:
print(f"{field.name}: {field.value}")
주목할 만한 차이점: PDF Oxide는 많은 정부 및 기업 PDF 양식에서 사용되는 XFA 양식(XML Forms Architecture)을 지원합니다. PyMuPDF나 pypdf 모두 XFA 폼 데이터 추출을 처리하지 못합니다.
이미지 추출
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"])
pypdf:
from pypdf import PdfReader
reader = PdfReader("report.pdf")
page = reader.pages[0]
for i, image in enumerate(page.images):
with open(f"image_{i}.{image.name.split('.')[-1]}", "wb") as f:
f.write(image.data)
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"])
세 라이브러리 모두 임베디드 이미지 추출을 처리합니다. PyMuPDF의 접근 방식은 2단계 xref 조회가 필요합니다. pypdf와 PDF Oxide는 더 간결한 API를 제공합니다.
렌더링
PyMuPDF는 MuPDF의 렌더링 엔진을 사용하여 PDF 페이지를 이미지(PNG, JPEG)로 렌더링할 수 있습니다. pypdf는 페이지를 전혀 렌더링할 수 없습니다. PDF Oxide는 내장 렌더링 엔진을 제공합니다.
OCR
PyMuPDF는 스캔 PDF의 OCR을 위해 Tesseract와 통합됩니다. pypdf에는 OCR 지원이 없습니다. PDF Oxide는 외부 시스템 의존성 없이 PaddleOCR을 통한 내장 OCR을 제공합니다.
PDF 생성
PyMuPDF는 PDF를 생성할 수 있지만 페이지에 텍스트, 이미지, 도형을 수동으로 배치해야 합니다 — 구조화된 콘텐츠에서 PDF를 생성하는 고수준 API가 없습니다.
pypdf는 처음부터 PDF를 생성할 수 없습니다. 기존 PDF를 병합, 분할, 수정할 수 있지만, 생성에는 reportlab이나 fpdf2 같은 별도 라이브러리가 필요합니다.
PDF Oxide는 Markdown 또는 HTML에서 PDF를 생성할 수 있습니다:
from pdf_oxide import Pdf
pdf = Pdf.from_markdown("# Invoice\n\n| Item | Price |\n|------|-------|\n| Widget | $9.99 |")
pdf.save("invoice.pdf")
암호화
세 라이브러리 모두 암호화된 PDF 읽기와 암호화된 출력 쓰기를 지원합니다.
PyMuPDF:
import fitz
doc = fitz.open("encrypted.pdf")
doc.authenticate("password")
text = doc[0].get_text()
pypdf:
from pypdf import PdfReader
reader = PdfReader("encrypted.pdf")
reader.decrypt("password")
text = reader.pages[0].extract_text()
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0)
기능 요약
| Feature | PyMuPDF | pypdf | PDF Oxide |
|---|---|---|---|
| Text extraction | Yes | Yes | Yes |
| Character positions | Yes | Partial | Yes |
| Image extraction | Yes | Yes | Yes |
| Form fields (AcroForm) | Read + Write | Read + Write | Read + Write |
| XFA forms | No | No | Yes |
| PDF creation | Manual | No | Markdown/HTML |
| Markdown output | No (pymupdf4llm) | No | Built-in |
| HTML output | No | No | Built-in |
| Rendering | Yes | No | Yes |
| OCR | Tesseract | No | Built-in (PaddleOCR) |
| Search | Yes | No | Regex + spatial |
| Encryption | Read + Write | Read + Write | Read + Write |
| PDF/A validation | No | No | Yes |
| SVG export | Yes | No | No |
| Merge/split | Yes | Yes | Yes |
각 라이브러리를 선택할 때
pypdf를 선택하세요:
- 컴파일된 C 또는 Rust 확장 없이 Pure Python 솔루션이 필요한 경우
- 간단한 PDF 조작(병합, 분할, 회전, 암호화/복호화)을 수행하는 경우
- 속도가 사용 사례에 중요하지 않은 경우
- 가능한 가장 작은 설치 풋프린트를 원하는 경우 (~1 MB)
- 넓은 Python 버전 지원이 필요한 경우 (3.6+)
PyMuPDF를 선택하세요:
- 이미 Artifex의 상용 MuPDF 라이선스가 있는 경우
- PDF 페이지에서 SVG 내보내기가 필요한 경우
- 프로젝트가 이미 AGPL-3.0으로 라이선스된 경우
- MuPDF 고유 렌더링 동작에 의존하는 경우
PDF Oxide를 선택하세요:
- 최대 텍스트 추출 속도가 필요한 경우 (PyMuPDF보다 5.8배, pypdf보다 15배 빠름)
- 상용 또는 비공개 소스 사용을 위한 MIT 라이선스를 원하는 경우
- LLM/RAG 파이프라인을 위한 내장 Markdown 또는 HTML 출력이 필요한 경우
- XFA 폼 지원이 필요한 경우
- 외부 시스템 의존성 없는 내장 OCR을 원하는 경우
- 유효 PDF에서 100% 신뢰성을 원하는 경우
설치
# PyMuPDF
pip install pymupdf
# pypdf
pip install pypdf
# PDF Oxide
pip install pdf_oxide
세 라이브러리 모두 pip으로 설치 가능합니다. PyMuPDF는 번들된 MuPDF가 포함된 ~20 MB wheel을 제공합니다. pypdf는 ~1 MB의 Pure Python입니다. PDF Oxide는 Linux(x86_64, aarch64), macOS(x86_64, arm64), Windows(x86_64)용 사전 빌드 wheel(~5 MB)을 제공합니다.
결론
PyMuPDF와 pypdf 사이에서 선택하는 것은 속도와 라이선스 자유 사이에서 선택하는 것입니다. PDF Oxide는 둘 다 제공합니다 — PyMuPDF보다 빠르고, pypdf보다 더 허용적이며, 두 라이브러리 모두 제공하지 않는 기능을 갖추고 있습니다.
| What matters to you | Best choice |
|---|---|
| Maximum speed | PDF Oxide (0.8ms) |
| Permissive license | PDF Oxide (MIT) or pypdf (BSD) |
| Speed + permissive license | PDF Oxide — the only option |
| Markdown/HTML output | PDF Oxide — built-in |
| XFA forms | PDF Oxide — only library that supports them |
| 100% reliability | PDF Oxide — 100% pass rate |
| OCR without Tesseract | PDF Oxide — built-in PaddleOCR |
| SVG export | PyMuPDF |
| Pure Python, no binaries | pypdf |
10초 만에 시작하세요:
pip install pdf_oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
관련 페이지
- PDF Oxide vs PyMuPDF — detailed comparison
- PDF Oxide vs pypdf — detailed comparison
- vs All Python PDF Libraries — full ecosystem comparison
- Performance Benchmarks — methodology and results