Skip to content

PDF Oxide vs pypdf

PDF Oxide는 pypdf보다 15배 빠르고, 통과율도 더 높으며, 렌더링·Markdown/HTML 출력·OCR·폼 처리까지 모두 내장되어 있습니다. pypdf에서 여러 패키지를 조합해야 가능한 일을 PDF Oxide는 단일 라이브러리로 처리합니다.

pypdf 대신 PDF Oxide를 고려할 이유

속도. pypdf는 순수 Python입니다. PDF Oxide는 PyO3로 컴파일된 Rust 코어가 Python 프로세스 안에서 직접 돌아갑니다. 평균 텍스트 추출 시간은 0.8ms 대 12.1ms로, 15배 차이가 납니다.

안정성. PDF Oxide는 3,830개 테스트 PDF를 100% 통과합니다. pypdf는 98.4%로, 유효한 PDF 61건에서 실패합니다.

기능 범위. pypdf는 PDF 편집(병합, 분할, 회전, 암호화)에 초점이 맞춰진 라이브러리입니다. 텍스트 추출, 렌더링, Markdown 출력, 폼 생성에는 별도의 패키지가 필요합니다. PDF Oxide는 이 모두를 한 번의 설치로 제공합니다.

빠른 비교

PDF Oxide pypdf
평균 추출 시간 0.8ms 12.1ms
통과율 (3,830 PDF) 100% 98.4%
라이선스 MIT BSD-3
언어 Rust + PyO3 순수 Python
텍스트 추출 지원 지원
문자 위치 지원 부분 지원
이미지 추출 지원 지원
Markdown 출력 지원 미지원
HTML 출력 지원 미지원
PDF 생성 지원 (Markdown/HTML/이미지) 제한적 (병합만)
폼 필드 읽기 + 쓰기 읽기 + 쓰기
암호화 읽기 + 쓰기 읽기 + 쓰기
렌더링 지원 미지원
OCR 내장 미지원
검색 정규식 + 공간 검색 미지원
설치 크기 약 5 MB 약 1 MB

코드 비교

텍스트 추출

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
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("book.pdf")
for i in range(doc.page_count()):
    text = doc.extract_text(i)
    print(f"--- Page {i + 1} ---")
    print(text)

pypdf:

from pypdf import PdfReader

reader = PdfReader("book.pdf")
for page in reader.pages:
    text = page.extract_text()
    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"])

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

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("encrypted.pdf", password="secret")
text = doc.extract_text(0)

pypdf:

from pypdf import PdfReader

reader = PdfReader("encrypted.pdf")
reader.decrypt("secret")
text = reader.pages[0].extract_text()

Markdown 변환

PDF Oxide (내장):

from pdf_oxide import PdfDocument

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

pypdf:

# pypdf에는 Markdown 변환이 없다.
# 별도의 툴체인을 구성해야 한다.

벤치마크 상세

지표 PDF Oxide pypdf
평균 추출 시간 0.8ms 12.1ms
p99 추출 시간 9ms 97ms
통과율 (유효 PDF) 100% (3,823/3,823) 98.4% (3,762/3,823)

pypdf는 순수 Python 구현이라 모든 연산이 인터프리터에서 수행됩니다. 반면 PDF Oxide의 Rust 코어는 파싱, 폰트 디코딩, 텍스트 조립을 네이티브로 처리하고, 최종 결과만 Python 경계로 넘깁니다.

코퍼스 구성은 전체 벤치마크 방법론을 참고하세요.

기능 격차

pypdf는 병합·분할·회전·암호화 같은 PDF 편집에 강점이 있습니다. 반면 아래 기능은 빠져 있습니다:

기능 PDF Oxide pypdf
Markdown 변환 doc.to_markdown(0) 미지원
HTML 변환 doc.to_html(0) 미지원
콘텐츠에서 PDF 생성 Pdf.from_markdown(), Pdf.from_html() 미지원
이미지로 렌더링 지원 미지원
스캔 PDF OCR 내장 PaddleOCR 미지원
텍스트 검색 doc.search("query") 미지원
문자 단위 바운딩 박스 doc.extract_chars(0) 부분 지원
PDF/A 검증 지원 미지원

워크플로가 병합·분할·회전에 국한된다면, pypdf의 가벼운 순수 Python 구조는 합리적인 선택입니다. 텍스트 추출 품질, PDF 생성, 포맷 변환이 관련된다면 PDF Oxide가 훨씬 완성도 높은 선택지입니다.

pypdf를 계속 쓰는 게 나은 경우

  • 컴파일된 확장 없이 순수 Python 의존성만 필요한 경우
  • 텍스트 추출이 전혀 없고 병합/분할/회전/암호화만 다루는 경우
  • 레거시 통합을 위해 pypdf 고유의 편집 메서드가 필요한 경우

관련 문서