pdfminer.six에서 PDF Oxide로 마이그레이션
pdfminer(pdfminer.six)에서 PDF Oxide로 전환하기 위한 완전한 가이드입니다. 현재 사용 중인 모든 API와 대체 방법을 다룹니다.
왜 pdfminer에서 전환해야 합니까?
마이그레이션해야 하는 4가지 이유가 있습니다:
- 약 30배 빠름 — pdfminer는 주요 Python PDF 라이브러리 중 가장 느립니다. PDF Oxide는 페이지당 평균 0.8ms이지만 pdfminer는 수십 밀리초가 걸립니다. 몇 분 걸리던 배치 작업이 몇 초로 단축됩니다.
- 활발한 유지보수 — pdfminer.six는 업데이트 빈도가 낮고 미해결 이슈가 많습니다. PDF Oxide는 활발하게 개발되며 정기적으로 릴리스됩니다.
- 올인원 라이브러리 — pdfminer는 텍스트 추출만 가능합니다. PDF Oxide는 PDF 생성, 편집, 페이지 렌더링, 이미지 추출, 양식 처리, Markdown/HTML 변환을 모두 지원합니다.
- 설정 불필요 — pdfminer는 적절한 결과를 얻기 위해
LAParams(word_margin,line_margin,char_margin)를 수동으로 조정해야 합니다. PDF Oxide는 레이아웃 감지를 자동으로 처리합니다.
1단계: 설치
pip install pdf_oxide
pip uninstall pdfminer.six # 선택 사항
2단계: 임포트 변경
# 변경 전
from pdfminer.high_level import extract_text, extract_pages
from pdfminer.layout import LAParams
# 변경 후
from pdf_oxide import PdfDocument
3단계: API 매핑 테이블
| 작업 | pdfminer | PDF Oxide |
|---|---|---|
| 텍스트 추출 | extract_text("file.pdf") |
PdfDocument("file.pdf").extract_text(0) |
| 페이지 추출 | extract_pages("file.pdf") |
doc.extract_text(i)로 페이지별 처리 |
| 레이아웃 분석 | LAParams() 설정 |
내장 레이아웃 감지 |
| 문자 위치 | LTChar 객체 |
doc.extract_chars(0) |
| 암호화 PDF | 제한적 (AES-256에서 실패) | 완전 지원 |
| Markdown 변환 | 지원하지 않음 | doc.to_markdown(0) |
| 양식 필드 | 지원하지 않음 | doc.get_form_fields() |
4단계: 일반적인 패턴 변경
기본 텍스트 추출
pdfminer의 extract_text는 전체 문서를 한 번에 처리합니다. PDF Oxide는 페이지별 제어를 제공합니다:
# pdfminer — 전체 문서를 한 번에 처리
from pdfminer.high_level import extract_text
text = extract_text("report.pdf")
print(text)
# PDF Oxide — 페이지별 제어
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
for i in range(doc.page_count()):
text = doc.extract_text(i)
print(text)
레이아웃 분석
pdfminer는 LAParams의 수동 설정이 필요합니다. PDF Oxide는 자동으로 처리합니다:
# pdfminer — 수동 레이아웃 설정
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
params = LAParams(
word_margin=0.1,
line_margin=0.5,
char_margin=2.0,
boxes_flow=0.5,
)
text = extract_text("report.pdf", laparams=params)
# PDF Oxide — 자동 레이아웃 감지
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0) # 레이아웃 자동 처리
문자 수준 추출
pdfminer는 복잡한 레이아웃 객체 트리를 사용합니다. PDF Oxide는 플랫 리스트를 반환합니다:
# pdfminer — 레이아웃 트리 순회
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTChar, LTTextBox
for page_layout in extract_pages("report.pdf"):
for element in page_layout:
if isinstance(element, LTTextBox):
for line in element:
for char in line:
if isinstance(char, LTChar):
print(f"{char.get_text()} at ({char.x0}, {char.y0})")
# PDF Oxide — 플랫 문자 리스트
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
for c in doc.extract_chars(0):
print(f"{c.char} at ({c.x}, {c.y})")
암호화 PDF
pdfminer는 암호화 지원이 제한적이며 AES-256 암호화 파일에서 실패합니다:
# pdfminer — 많은 암호화 PDF에서 실패
from pdfminer.high_level import extract_text
text = extract_text("encrypted.pdf", password="password")
# AES-256 암호화 파일에서 오류 발생 가능
# PDF Oxide — 완전한 암호화 지원
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0) # 모든 암호화 방식 지원
Markdown 변환 (새로운 기능)
pdfminer는 Markdown을 지원하지 않습니다. PDF Oxide를 사용하면 LLM 파이프라인에 쉽게 투입할 수 있습니다:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
for i in range(doc.page_count()):
md = doc.to_markdown(i)
print(md)
양식 필드 추출 (새로운 기능)
pdfminer는 양식 필드를 추출할 수 없습니다. PDF Oxide는 이를 처리할 수 있습니다:
from pdf_oxide import PdfDocument
doc = PdfDocument("form.pdf")
fields = doc.get_form_fields()
for f in fields:
print(f"{f.name}: {f.value}")
페이지 렌더링 (새로운 기능)
pdfminer에는 렌더링 기능이 없습니다. PDF Oxide는 페이지를 이미지로 렌더링할 수 있습니다:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
png_bytes = doc.render_page(0, dpi=150)
with open("page.png", "wb") as f:
f.write(png_bytes)
주요 차이점
- LAParams 조정 불필요 — PDF Oxide는 레이아웃을 자동으로 처리합니다.
word_margin,line_margin등의 설정이 필요하지 않습니다. - 속도 — pdfminer는 Python PDF 라이브러리 중 가장 느립니다. PDF Oxide는 약 30배 빠릅니다.
- 올인원 — pdfminer는 추출만 가능합니다. PDF Oxide는 PDF 생성, 편집, 렌더링도 할 수 있습니다.
5단계: 마이그레이션 테스트
기존 테스트 파일을 두 라이브러리로 실행하고 출력을 비교합니다:
from pdf_oxide import PdfDocument
doc = PdfDocument("your-test-file.pdf")
# 텍스트 추출 확인
text = doc.extract_text(0)
print(text[:500])
# 페이지 수 확인
print(f"Pages: {doc.page_count()}")
# 양식 필드 확인 (해당하는 경우)
fields = doc.get_form_fields()
for f in fields:
print(f"{f.name}: {f.value}")
다른 마이그레이션 가이드
관련 페이지
- Python 시작하기 — 설치 가이드
- PDF에서 텍스트 추출 — 텍스트 추출 가이드