Skip to content

PDF Oxide vs PyMuPDF

PDF Oxide는 PyMuPDF보다 빠른 MIT 라이선스 대안입니다. 상용 프로젝트를 위해 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는 PyMuPDF가 99.3%의 통과율(유효한 PDF에서 27건 실패)을 기록한 동일한 코퍼스에서 100% 통과율을 달성합니다.

빠른 비교

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 has no built-in Markdown conversion.
# Use pymupdf4llm (separate package, 69× slower than PDF Oxide):
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 cannot create PDFs from Markdown.
# You must manually place text on pages:
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("# Title")

단계별 안내

  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 라이선스인 경우

관련 페이지