PDF Oxide vs pypdf
O PDF Oxide é 15× mais rápido que o pypdf, tem taxa de sucesso maior e vem com renderização, exportação Markdown/HTML, OCR e trabalho de formulários já inclusos. O que no pypdf precisa de uma combinação de pacotes, o PDF Oxide faz com uma única biblioteca.
Por que considerar o PDF Oxide no lugar do pypdf
Velocidade. pypdf é Python puro. O PDF Oxide tem um núcleo em Rust exposto via PyO3, que roda direto dentro do processo Python. Extração de texto média: 0,8 ms contra 12,1 ms — 15× de diferença.
Confiabilidade. O PDF Oxide passa nos 3 830 PDFs de teste com 100 %. O pypdf fica em 98,4 %, falhando em 61 PDFs válidos.
Abrangência. O pypdf é uma biblioteca de manipulação (juntar, dividir, rotacionar, criptografar). Para extração de texto, renderização, saída Markdown ou criação de formulários, você precisa de pacotes extras. O PDF Oxide cobre tudo isso em uma instalação só.
Comparativo rápido
| PDF Oxide | pypdf | |
|---|---|---|
| Tempo médio de extração | 0,8 ms | 12,1 ms |
| Taxa de sucesso (3 830 PDFs) | 100 % | 98,4 % |
| Licença | MIT | BSD-3 |
| Linguagem | Rust + PyO3 | Python puro |
| Extração de texto | Sim | Sim |
| Posições de caracteres | Sim | Parcial |
| Extração de imagens | Sim | Sim |
| Saída Markdown | Sim | Não |
| Saída HTML | Sim | Não |
| Criação de PDF | Sim (Markdown/HTML/imagens) | Limitada (só junção) |
| Campos de formulário | Ler + escrever | Ler + escrever |
| Criptografia | Ler + escrever | Ler + escrever |
| Renderização | Sim | Não |
| OCR | Embutido | Não |
| Busca | Regex + espacial | Não |
| Tamanho de instalação | ~5 MB | ~1 MB |
Código lado a lado
Extração de texto
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)
Percorrer todas as páginas
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)
Extração de imagens
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)
PDFs criptografados
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()
Conversão para Markdown
PDF Oxide (embutido):
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)
pypdf:
# O pypdf nao tem conversao para Markdown.
# Seria preciso montar uma toolchain separada.
Detalhes do benchmark
| Métrica | PDF Oxide | pypdf |
|---|---|---|
| Tempo médio de extração | 0,8 ms | 12,1 ms |
| Tempo p99 | 9 ms | 97 ms |
| Taxa de sucesso (PDFs válidos) | 100 % (3 823/3 823) | 98,4 % (3 762/3 823) |
Como o pypdf é Python puro, cada operação passa pelo interpretador. O núcleo em Rust do PDF Oxide cuida de parsing, decodificação de fontes e montagem de texto de forma nativa; só o resultado final atravessa a fronteira para o Python.
Veja a metodologia completa do benchmark para detalhes do corpus.
Lacuna de funcionalidades
O pypdf é bom em manipulação de PDF — juntar, dividir, rotacionar, criptografar. Só que faltam coisas:
| Funcionalidade | PDF Oxide | pypdf |
|---|---|---|
| Conversão para Markdown | doc.to_markdown(0) |
Indisponível |
| Conversão para HTML | doc.to_html(0) |
Indisponível |
| Criar PDF a partir de conteúdo | Pdf.from_markdown(), Pdf.from_html() |
Indisponível |
| Renderização em imagem | Sim | Indisponível |
| OCR para PDFs escaneados | PaddleOCR embutido | Indisponível |
| Busca de texto | doc.search("query") |
Indisponível |
| Bounding boxes por caractere | doc.extract_chars(0) |
Parcial |
| Validação PDF/A | Sim | Indisponível |
Se o seu fluxo é estritamente juntar/dividir/rotacionar, a abordagem Python puro e enxuta do pypdf é razoável. Assim que entra qualidade de extração, criação ou conversão, o PDF Oxide é a opção mais completa.
Quando continuar no pypdf
- Você precisa de uma dependência 100 % Python, sem extensões compiladas
- O caso de uso é estritamente juntar/dividir/rotacionar/criptografar, sem extração de texto
- Você depende de métodos específicos do pypdf para uma integração legada
Páginas relacionadas
- Benchmarks de performance — resultados completos do corpus
- vs bibliotecas PDF de Python — todas as bibliotecas comparadas
- Começando com Python — instalação e primeira extração