PDF Oxide vs pypdfium2
PDF Oxide와 pypdfium2는 모두 네이티브로 컴파일된 빠른 Python PDF 라이브러리입니다. pypdfium2는 Google의 PDFium 엔진을 래핑하고, PDF Oxide는 Rust 코어 위에 구축됐습니다. 가장 큰 차이는 범위입니다 — pypdfium2는 주로 리더·렌더러지만, PDF Oxide는 생성, 추출, OCR, 폼, 암호화, 컴플라이언스를 포함한 PDF 전체 라이프사이클을 다룹니다.
주요 차이점
속도. 둘 다 빠릅니다. PDF Oxide가 약간 더 빠릅니다: 평균 0.8ms vs 4.1ms (5.1배 차이). 둘 다 Pure Python 라이브러리보다 극적으로 빠릅니다.
기능. pypdfium2는 렌더링이 가능한 읽기 전용입니다. PDF Oxide는 생성, 편집, 폼 쓰기, 암호화, Markdown/HTML 출력, OCR을 추가합니다.
신뢰성. PDF Oxide는 유효 PDF의 100%를 통과합니다. pypdfium2는 99.2% — 31개 실패입니다.
라이선스. 둘 다 허용적입니다. PDF Oxide는 MIT, pypdfium2는 Apache-2.0입니다. 둘 다 AGPL 우려가 없습니다.
빠른 비교
| PDF Oxide | pypdfium2 | |
|---|---|---|
| 평균 추출 시간 | 0.8ms | 4.1ms |
| 통과율 (3,830개 PDF) | 100% | 99.2% |
| 라이선스 | MIT | Apache-2.0 |
| 언어 | Rust + PyO3 | C (PDFium) |
| 텍스트 추출 | 예 | 예 |
| 문자 위치 | 예 | 예 |
| 이미지 추출 | 예 | 예 |
| Markdown 출력 | 예 | 아니오 |
| HTML 출력 | 예 | 아니오 |
| PDF 생성 | 예 | 아니오 |
| PDF 편집 | 예 | 아니오 |
| 폼 필드 | 읽기 + 쓰기 | 읽기 전용 |
| 암호화 | 읽기 + 쓰기 | 읽기 전용 |
| 렌더링 | 예 | 예 |
| OCR | 내장 | 아니오 |
| 검색 | 정규식 + 공간 검색 | 예 |
코드 비교
텍스트 추출
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)
pypdfium2:
import pypdfium2 as pdfium
pdf = pdfium.PdfDocument("report.pdf")
page = pdf[0]
textpage = page.get_textpage()
text = textpage.get_text_range()
print(text)
이미지 추출
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"])
pypdfium2:
import pypdfium2 as pdfium
pdf = pdfium.PdfDocument("report.pdf")
page = pdf[0]
for i, obj in enumerate(page.get_objects()):
if obj.type == pdfium.FPDF_PAGEOBJ_IMAGE:
bitmap = obj.get_bitmap()
bitmap.to_pil().save(f"image_{i}.png")
PDF 생성
PDF Oxide:
from pdf_oxide import Pdf
pdf = Pdf.from_markdown("# Report\n\nQuarterly results are in.")
pdf.save("report.pdf")
pypdfium2:
# pypdfium2는 PDF를 생성할 수 없습니다.
# 렌더링 기능이 있는 읽기 전용 라이브러리입니다.
렌더링
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
image = doc.render_page(0, dpi=150)
image.save("page.png")
pypdfium2:
import pypdfium2 as pdfium
pdf = pdfium.PdfDocument("report.pdf")
page = pdf[0]
bitmap = page.render(scale=150/72)
bitmap.to_pil().save("page.png")
벤치마크 상세
| 지표 | PDF Oxide | pypdfium2 |
|---|---|---|
| 평균 추출 시간 | 0.8ms | 4.1ms |
| p99 추출 시간 | 9ms | 42ms |
| 통과율 (유효 PDF) | 100% (3,823/3,823) | 99.2% (3,792/3,823) |
두 라이브러리 모두 네이티브 코드(각각 Rust와 C)를 사용하지만, PDF Oxide의 텍스트 추출 파이프라인은 이 작업에 특화되어 최적화되었습니다 — 사전 할당된 버퍼와 캐시된 페이지 트리를 사용한 단일 패스 추출입니다.
자세한 내용은 전체 벤치마크 방법론에서 코퍼스 세부사항을 확인하세요.
기능 완성도
두 라이브러리의 가장 큰 차이점은 범위입니다. pypdfium2는 렌더링이 가능한 리더이고, PDF Oxide는 전체 PDF 라이프사이클을 다룹니다:
| 기능 | PDF Oxide | pypdfium2 |
|---|---|---|
| 읽기 및 추출 | 예 | 예 |
| 페이지 렌더링 | 예 | 예 |
| PDF 생성 | 예 (Markdown, HTML, 이미지) | 아니오 |
| 기존 PDF 편집 | 예 (텍스트, 이미지, 주석) | 아니오 |
| 폼 필드 채우기 | 예 | 아니오 |
| 암호화 쓰기 | 예 (AES-256) | 아니오 |
| Markdown/HTML 출력 | 예 | 아니오 |
| 스캔 페이지 OCR | 예 (ONNX 기반 PaddleOCR) | 아니오 |
| PDF/A 검증 | 예 | 아니오 |
PDF를 읽고 렌더링하는 것만 필요하다면, pypdfium2는 좋은 선택입니다. 생성, 편집, 폼 채우기, 암호화 등 어떤 쓰기 기능이 필요하다면, PDF Oxide가 단일 라이브러리 솔루션입니다.
pypdfium2 라이선스 (Apache-2.0)
pypdfium2는 Apache-2.0 라이선스이며, 상용 이용을 허용합니다. 하지만 Google의 PDFium(Chromium PDF 엔진)을 래핑하며, 이는 자체 BSD 스타일 라이선스를 가지고 있습니다. 둘 다 허용적입니다.
주요 고려사항:
- Apache-2.0 — 허용적, 상용 이용 허용, 저작자 표시 필요
- PDFium 의존성 — 바이너리에 Chromium의 PDFium 엔진 포함 (~15 MB)
- Google 릴리스 주기 — pypdfium2는 Chromium 프로젝트의 PDFium 릴리스에 의존
- Python API 안정성 보장 없음 — API가 PDFium의 C API를 밀접하게 따름
PDF Oxide는 MIT 라이선스 — Apache-2.0보다 더 허용적이며, 바이너리 배포 시 저작자 표시 요구사항이 없습니다.
언제 어떤 것을 사용할까
PDF Oxide를 선택하세요:
- 읽기/렌더링 이상이 필요한 경우 (생성, 편집, 폼, 암호화)
- Markdown 또는 HTML 변환을 원하는 경우
- 스캔 문서를 위한 내장 OCR이 필요한 경우
- 최고의 신뢰성이 필요한 경우 (100% vs 99.2%)
- 속도가 중요하고 대규모에서 5배 차이가 중요한 경우
pypdfium2를 선택하세요:
- PDF를 읽고 렌더링하는 것만 필요한 경우
- PDFium의 특정 렌더링 출력을 선호하는 경우
- 더 작은 의존성 풋프린트를 원하는 경우
관련 페이지
- 성능 벤치마크 — 전체 코퍼스 결과
- Python PDF 라이브러리 비교 — 모든 Python 라이브러리 비교
- Python 시작하기 — 설치 및 첫 번째 추출