Skip to content

PDF Oxide vs PyMuPDF

PDF Oxide는 MIT 라이선스로 제공되는 PyMuPDF 대안으로, 5.8배 더 빠르고 AGPL 관련 컴플라이언스 부담이 없습니다. 상용 프로젝트에서 PyMuPDF를 검토 중이거나 AGPL 문제로 교체를 고려하고 있다면, 이 문서에서 핵심 차이를 정리했습니다.

개발자들이 PyMuPDF를 떠나는 이유

라이선스. PyMuPDF는 AGPL-3.0으로 배포되는 MuPDF를 기반으로 합니다. PyMuPDF를 포함한 소프트웨어를 배포할 때 — SaaS, 웹 앱, Docker 컨테이너 모두 포함 — 전체 코드를 AGPL로 공개하거나 Artifex에서 상용 라이선스를 구매해야 합니다. PDF Oxide는 MIT 라이선스로, 이런 제약이 전혀 없습니다.

속도. PDF Oxide의 텍스트 추출은 평균 0.8ms, PyMuPDF는 4.6ms입니다. 3,830개 PDF에서 5.8배 차이가 납니다.

안정성. 같은 코퍼스에서 PDF Oxide는 100% 통과율을 보입니다. PyMuPDF는 99.3%로, 유효한 PDF 27건에서 실패합니다.

빠른 비교

PDF Oxide PyMuPDF
라이선스 MIT AGPL-3.0
평균 추출 시간 0.8ms 4.6ms
통과율 (3,830 PDF) 100% 99.3%
텍스트 추출 지원 지원
문자 위치 지원 지원
이미지 추출 지원 지원
폼 필드 읽기 + 쓰기 읽기 + 쓰기
PDF 생성 지원 (Markdown/HTML) 지원
Markdown 출력 지원 미지원
HTML 출력 지원 미지원
암호화 읽기 + 쓰기 읽기 + 쓰기
렌더링 지원 지원
OCR 내장 (PaddleOCR) Tesseract
설치 크기 약 5 MB 약 20 MB
Python 버전 3.8–3.14 3.8–3.12

코드 비교

텍스트 추출

PDF Oxide:

from pdf_oxide import PdfDocument

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

PyMuPDF:

import fitz

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

Markdown 변환

PDF Oxide (내장):

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)

PyMuPDF:

# PyMuPDF 자체에는 Markdown 변환이 없다.
# pymupdf4llm (별도 패키지, PDF Oxide 대비 69배 느림)을 사용한다:
import pymupdf4llm

md = pymupdf4llm.to_markdown("paper.pdf")

이미지 추출

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:

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"])

Markdown에서 PDF 생성

PDF Oxide:

from pdf_oxide import Pdf

pdf = Pdf.from_markdown("# Invoice\n\n| Item | Price |\n|------|-------|\n| Widget | $9.99 |")
pdf.save("invoice.pdf")

PyMuPDF:

import fitz

# PyMuPDF는 Markdown으로부터 PDF를 생성할 수 없다.
# 페이지에 텍스트를 직접 배치해야 한다:
doc = fitz.open()
page = doc.new_page()
page.insert_text(fitz.Point(72, 72), "Invoice", fontsize=24)
doc.save("invoice.pdf")

벤치마크 상세

독립된 공개 테스트 스위트 세 곳(veraPDF, Mozilla pdf.js, DARPA SafeDocs)에서 수집한 3,830개 PDF로 측정했습니다.

지표 PDF Oxide PyMuPDF
평균 추출 시간 0.8ms 4.6ms
p99 추출 시간 9ms 28ms
통과율 (유효 PDF) 100% (3,823/3,823) 99.3% (3,796/3,823)
텍스트 품질 일치도 99.5% 기준

코퍼스 구성과 재현 절차는 전체 벤치마크 방법론 문서를 참고하세요.

AGPL 라이선스가 의미하는 것

PyMuPDF는 MuPDF를 감싸는 구조이고, MuPDF는 AGPL-3.0 라이선스입니다. 아래 조건에 해당하면 영향을 받습니다:

  • 소프트웨어를 배포하는 경우 — PyMuPDF를 포함한 바이너리, Docker 이미지, Electron 앱 등
  • SaaS를 운영하는 경우 — 서버에서 PyMuPDF로 사용자 PDF를 처리
  • 제품에 PyMuPDF를 임베드한 경우 — API 뒤의 마이크로서비스 형태라도 동일

모든 경우에 AGPL은 애플리케이션 전체 소스를 AGPL-3.0으로 공개하거나 Artifex의 상용 라이선스를 구매할 것을 요구합니다.

PDF Oxide는 MIT 라이선스입니다. 상용·독점·SaaS·오픈소스 등 어떤 프로젝트에서도 추가 의무 없이 사용할 수 있습니다.

사용 사례 PDF Oxide (MIT) PyMuPDF (AGPL)
상용 제품 가능 라이선스 필요
비공개 SaaS 가능 라이선스 필요
내부 도구 가능 가능
오픈소스 프로젝트 가능 가능 (AGPL 호환 시)
Docker 배포 가능 라이선스 필요

PyMuPDF 상용 라이선스 가격

Artifex(MuPDF와 PyMuPDF를 만든 회사)는 상용 라이선스 가격을 공개하지 않습니다. 업계 보고에 따르면:

  • 문의 필수 — Artifex 영업팀에 견적을 요청해야 합니다
  • 애플리케이션 단위 라이선스 — 배포 형태와 규모에 따라 가격이 달라집니다
  • 연 단위 비용 — 상용 라이선스는 보통 매년 갱신됩니다
  • 무료 플랜 없음 — AGPL에는 "커뮤니티"나 “스타트업” 같은 예외 조항이 없습니다

PyMuPDF를 상용 용도로 검토하는 팀에게 라이선스 비용은 개발 공수 외에 상시로 드는 운영 비용입니다.

PDF Oxide는 MIT 라이선스 — 모든 용도에 영구 무료입니다. 영업 통화도, 라이선스 감사도, 컴플라이언스 리스크도 없습니다. SaaS, Docker 배포, 상용 제품 임베드 모두 제약 없이 사용할 수 있습니다.

마이그레이션 가이드

API 매핑

작업 PyMuPDF PDF Oxide
PDF 열기 fitz.open("f.pdf") PdfDocument("f.pdf")
페이지 수 doc.page_count doc.page_count()
텍스트 추출 doc[0].get_text() doc.extract_text(0)
문자 데이터 doc[0].get_text("dict") doc.extract_chars(0)
이미지 추출 doc[0].get_images() + doc.extract_image(xref) doc.extract_images(0)
텍스트 검색 doc[0].search_for("query") doc.search_page(0, "query")
암호화 PDF doc.authenticate("pw") PdfDocument("f.pdf", password="pw")
Markdown으로 pymupdf4llm (별도) doc.to_markdown(0)
텍스트로 생성 insert_text() 수동 Pdf.from_markdown("# 제목")

단계별 절차

  1. 설치: pip install pdf_oxide
  2. import 교체: import fitzfrom pdf_oxide import PdfDocument
  3. open 교체: fitz.open(path)PdfDocument(path)
  4. 추출 교체: page.get_text()doc.extract_text(page_index)
  5. 이미지 교체: 다단계 xref 조회 → doc.extract_images(page_index)
  6. 패스워드 처리 업데이트: PdfDocument(path, password="pw")를 쓰거나, 연 뒤 doc.authenticate("pw") 호출
  7. 테스트: 기존 테스트 파일로 파이프라인을 실행

PyMuPDF를 계속 쓰는 게 나은 경우

  • 이미 MuPDF 상용 라이선스를 보유하고 있고 MuPDF 고유 렌더링에 의존하는 경우
  • SVG 내보내기가 필요한 경우 (PDF Oxide는 SVG 출력을 지원하지 않음)
  • 프로젝트 자체가 이미 AGPL 라이선스인 경우

관련 문서