Skip to content

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