PDF Oxide vs pypdfium2
PDF Oxide와 pypdfium2는 모두 빠르고 네이티브로 컴파일된 Python PDF 라이브러리입니다. pypdfium2는 Google의 PDFium 엔진을 래핑하며, PDF Oxide는 Rust 코어 위에 구축되었습니다. 핵심 차이는 범위입니다. pypdfium2는 주로 리더이자 렌더러인 반면, PDF Oxide는 PDF의 전체 수명 주기를 다룹니다.
주요 차이점
속도. 둘 다 빠릅니다. PDF Oxide가 약간 더 빠릅니다. 평균 0.8ms 대 4.1ms(5.1배 차이)입니다. 둘 다 순수 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 cannot create PDFs.
# It is a read-only library with rendering capabilities.
렌더링
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 엔진)을 래핑하며, PDFium에는 자체 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% 대 99.2%)
- 속도가 중요하고 5배 차이가 대규모에서 의미가 있을 때
다음의 경우 pypdfium2를 선택하세요:
- PDF를 읽고 렌더링하기만 하면 될 때
- PDFium 특유의 렌더링 출력을 선호할 때
- 더 작은 의존성 풋프린트를 원할 때
관련 페이지
- 성능 벤치마크 — 전체 코퍼스 결과
- vs Python PDF 라이브러리 — 모든 Python 라이브러리 비교
- Python 시작하기 — 설치 및 첫 추출