Skip to content

vs Bibliotecas PDF para Python

PDF Oxide comparado com PyMuPDF (fitz), pypdfium2, pypdf, pdfplumber, pdfminer e outras. Esta página aborda desempenho, cobertura de recursos, licenciamento e diferenças de API para ajudar você a escolher a biblioteca PDF para Python certa para extração de texto.

Resumo

PDF Oxide PyMuPDF pypdfium2 pypdf pdfplumber pdfminer
Tempo médio de extração 0.8ms 4.6ms 4.1ms 12.1ms 23.2ms 16.8ms
Taxa de aprovação (3.830 PDFs) 100% 99.3% 99.2% 98.4% 98.8% 98.8%
Licença MIT AGPL-3.0 Apache-2.0 BSD-3 MIT MIT
Linguagem Rust + PyO3 C (MuPDF) C (PDFium) Pure Python Pure Python Pure Python
Extração de texto Sim Sim Sim Sim Sim Sim
Posições de caracteres Sim Sim Sim Parcial Sim Sim
Extração de imagens Sim Sim Sim Sim Não Não
Campos de formulário Leitura + escrita Leitura + escrita Somente leitura Leitura + escrita Somente leitura Não
Criação de PDF Sim Sim Não Limitada Não Não
Edição de PDF Sim Sim Não Sim Não Não
Saída em Markdown Sim Não Não Não Não Não
Saída em HTML Sim Não Não Não Não Não
Criptografia Leitura + escrita Leitura + escrita Somente leitura Leitura + escrita Não Não
Validação PDF/A Sim Não Não Não Não Não
Renderização Sim Sim Sim Não Não Não
Busca Regex + espacial Sim Sim Não Não Não
Versões do Python 3.8–3.14 3.8–3.12 3.8+ 3.6+ 3.8+ 3.6+
Tamanho de instalação wheel de ~5 MB wheel de ~20 MB wheel de ~3 MB ~1 MB ~1 MB ~1 MB

Comparação de desempenho

Tempo médio de extração de texto por PDF, medido no corpus completo de 3.830 PDFs — três conjuntos de testes independentes e disponíveis publicamente que, juntos, cobrem todas as versões da especificação PDF (1.0–2.0), arquivos criptografados, documentos malformados, codificações CJK, layouts complexos e casos-limite de segurança. Veja os detalhes completos do corpus para saber o que cada conjunto testa e por que esses resultados são reproduzíveis.

Biblioteca Média Relativo p99 Taxa de aprovação
PDF Oxide 0.8ms 9ms 100%
PyMuPDF 4.6ms 5.8× 28ms 99.3%
pypdfium2 4.1ms 5.1× 42ms 99.2%
pymupdf4llm 55.5ms 69× 280ms 99.1%
pdftext 7.3ms 9.1× 82ms 99.0%
pdfminer 16.8ms 21× 124ms 98.8%
pdfplumber 23.2ms 29× 189ms 98.8%
markitdown 108.8ms 136× 378ms 98.6%
pypdf 12.1ms 15.1× 97ms 98.4%

O PDF Oxide atinge sua velocidade graças a um núcleo nativo em Rust compilado em um módulo de extensão do Python via PyO3. Não há sobrecarga de subprocesso nem ponte com bibliotecas C — o código Rust roda diretamente no processo do Python.

Confiabilidade

O PDF Oxide processa 3.823 de 3.823 PDFs válidos sem falhas — uma taxa de aprovação de 100%. Os 7 arquivos que não passaram no corpus de 3.830 arquivos são fixtures de teste intencionalmente quebrados (cabeçalho PDF ausente, catálogos corrompidos por fuzzing, fluxos xref inválidos).

Biblioteca PDFs válidos aprovados Taxa de aprovação
PDF Oxide 3,823 / 3,823 100%
PyMuPDF 3,796 / 3,823 99.3%
pypdfium2 3,792 / 3,823 99.2%
pymupdf4llm 3,787 / 3,823 99.1%
pdftext 3,784 / 3,823 99.0%
pdfminer 3,777 / 3,823 98.8%
pdfplumber 3,777 / 3,823 98.8%
markitdown 3,771 / 3,823 98.6%
pypdf 3,762 / 3,823 98.4%

Qualidade do texto

O PDF Oxide atinge 99,5% de paridade de texto em relação ao PyMuPDF e ao pypdfium2 em todo o corpus. A qualidade foi medida comparando a saída de texto extraído caractere por caractere. A diferença restante de 0,5% está na normalização de espaços em branco e no tratamento de ligaduras, onde o PDF Oxide produz uma saída mais limpa.

Comparação de licenças

Biblioteca Licença Uso comercial Copyleft
PDF Oxide MIT Sem restrições Não
pypdfium2 Apache-2.0 Sem restrições Não
PyMuPDF AGPL-3.0 Exige licença comercial ($) Sim
pypdf BSD-3 Sem restrições Não
pdfplumber MIT Sem restrições Não
pdfminer MIT Sem restrições Não
pdftext GPL-3.0 Exige código aberto Sim

O PyMuPDF usa o MuPDF sob a licença AGPL-3.0. Se você distribuir software que usa o PyMuPDF, seu software também precisa ser lançado sob a AGPL-3.0 — ou você precisa comprar uma licença comercial da Artifex. Isso se aplica a produtos SaaS, aplicações web e quaisquer binários distribuídos.

O PDF Oxide é licenciado sob MIT, sem restrições. Use-o em produtos proprietários, plataformas SaaS ou aplicações de código fechado sem nenhuma obrigação de licenciamento.

Caso de uso PDF Oxide (MIT) PyMuPDF (AGPL) pypdfium2 (Apache) pypdf (BSD) pdfplumber (MIT) pdfminer (MIT)
Produto comercial Sim Exige licença Sim Sim Sim Sim
Código fechado Sim Não (sem licença) Sim Sim Sim Sim
SaaS/nuvem Sim Exige licença Sim Sim Sim Sim
Ferramentas internas Sim Sim Sim Sim Sim Sim

Comparação de API

Extração de texto

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)

PyMuPDF:

import fitz

doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)

pypdf:

from pypdf import PdfReader

reader = PdfReader("report.pdf")
page = reader.pages[0]
text = page.extract_text()
print(text)

pdfplumber:

import pdfplumber

with pdfplumber.open("report.pdf") as pdf:
    page = pdf.pages[0]
    text = page.extract_text()
    print(text)

pdfminer:

from pdfminer.high_level import extract_text

text = extract_text("report.pdf", page_numbers=[0])
print(text)

Extração em nível de caractere

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
chars = doc.extract_chars(0)
for ch in chars:
    print(f"'{ch.char}' at ({ch.bbox[0]:.1f}, {ch.bbox[1]:.1f}) "
          f"size={ch.font_size:.1f}")

PyMuPDF:

import fitz

doc = fitz.open("report.pdf")
page = doc[0]
blocks = page.get_text("dict")["blocks"]
for block in blocks:
    if "lines" in block:
        for line in block["lines"]:
            for span in line["spans"]:
                print(f"'{span['text']}' size={span['size']:.1f}")

pdfplumber:

import pdfplumber

with pdfplumber.open("report.pdf") as pdf:
    page = pdf.pages[0]
    for char in page.chars:
        print(f"'{char['text']}' at ({char['x0']:.1f}, {char['top']:.1f}) "
              f"size={char['size']:.1f}")

pdfminer:

from pdfminer.high_level import extract_pages
from pdfminer.layout import LTChar

for page_layout in extract_pages("report.pdf"):
    for element in page_layout:
        if hasattr(element, '__iter__'):
            for text_line in element:
                if hasattr(text_line, '__iter__'):
                    for char in text_line:
                        if isinstance(char, LTChar):
                            print(f"'{char.get_text()}' at ({char.x0:.1f}, {char.y0:.1f}) "
                                  f"size={char.size:.1f}")

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"])

PyMuPDF:

import fitz

doc = fitz.open("report.pdf")
page = doc[0]
for i, img in enumerate(page.get_images()):
    xref = img[0]
    base_image = doc.extract_image(xref)
    with open(f"image_{i}.{base_image['ext']}", "wb") as f:
        f.write(base_image["image"])

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)

Criação de PDF

PDF Oxide:

from pdf_oxide import Pdf

pdf = Pdf.from_markdown("# Hello World\n\nThis is a PDF.")
pdf.save("output.pdf")

# Also supports HTML
pdf = Pdf.from_html("<h1>Hello</h1><p>World</p>")
pdf.save("output.pdf")

PyMuPDF:

import fitz

doc = fitz.open()
page = doc.new_page()
text_point = fitz.Point(72, 72)
page.insert_text(text_point, "Hello World", fontsize=24)
doc.save("output.pdf")

pypdf:

# pypdf can merge/modify PDFs but cannot create from scratch with text content.
# Use reportlab or fpdf2 for creation, then merge with pypdf.

PDFs criptografados

PDF Oxide:

from pdf_oxide import PdfDocument

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

PyMuPDF:

import fitz

doc = fitz.open("encrypted.pdf")
doc.authenticate("password")
page = doc[0]
text = page.get_text()

pypdf:

from pypdf import PdfReader

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

Saída em Markdown e HTML

PDF Oxide (recurso exclusivo):

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")

# Convert to Markdown with heading detection
md = doc.to_markdown(0, detect_headings=True)
print(md)

# Convert to HTML
html = doc.to_html(0)
print(html)

Nenhuma outra biblioteca PDF para Python oferece conversão integrada para Markdown ou HTML.

Perfis das bibliotecas

PDF Oxide

Pontos fortes:

  • Extração de texto mais rápida nos benchmarks graças ao núcleo em Rust — 5,8× mais rápido que o PyMuPDF
  • Taxa de aprovação de 100% no corpus de 3.830 PDFs — a maior confiabilidade entre todas as bibliotecas testadas
  • API unificada para extração, criação e edição em uma única biblioteca
  • Exportação integrada para Markdown e HTML com detecção de títulos
  • Licença MIT, sem restrições de copyleft
  • Validação nativa de conformidade (PDF/A, PDF/UA, PDF/X)
  • Wheels pré-compilados para todas as principais plataformas e Python 3.8–3.14
  • Sem dependências de sistema — o wheel já inclui tudo

Limitações:

  • Biblioteca mais recente, com comunidade menor
  • A extração de tabelas é básica em comparação com os algoritmos do pdfplumber
  • O mecanismo de renderização é menos maduro que o MuPDF

PyMuPDF (fitz)

Pontos fortes:

  • Madura e testada em produção (baseada no MuPDF, em desenvolvimento desde 2005)
  • Excelente qualidade de renderização para PDFs complexos
  • Integração de OCR embutida (Tesseract)
  • Conjunto rico de recursos: exportação para SVG, manipulação de páginas, detecção de tabelas

Limitações:

  • A licença AGPL-3.0 exige abrir o código da sua aplicação ou comprar uma licença comercial
  • Tamanho grande do wheel (~20 MB) por causa do MuPDF empacotado
  • Sem exportação integrada para Markdown
  • Sem validação de conformidade

pypdfium2

Pontos fortes:

  • Rápida (baseada no mecanismo PDFium do Google)
  • Licença Apache-2.0 — permissiva para uso comercial
  • Boa qualidade de renderização

Limitações:

  • API de extração de texto limitada em comparação com PDF Oxide ou PyMuPDF
  • Sem criação ou edição de PDF
  • Suporte a campos de formulário apenas para leitura

pypdf

Pontos fortes:

  • Pure Python — instala em qualquer lugar, sem dependências compiladas
  • Leve e bem mantida
  • Boa para manipulação de PDF (mesclar, dividir, rotacionar, criptografar)
  • Comunidade grande e documentação extensa

Limitações:

  • 15× mais lenta que o PDF Oxide na extração de texto
  • A qualidade de extração de texto sofre com layouts complexos
  • Sem renderização, sem exportação para Markdown/HTML, sem extração de tabelas

pdfplumber

Pontos fortes:

  • A melhor extração de tabelas entre todas as bibliotecas PDF para Python
  • Excelentes dados de posicionamento em nível de caractere
  • Ferramentas de depuração visual (imagens de página anotadas)
  • Licença MIT

Limitações:

  • Pure Python — 29× mais lenta que o PDF Oxide
  • Somente leitura — sem criação ou edição de PDF
  • Sem criptografia ou renderização

pdfminer

Pontos fortes:

  • Análise detalhada de caracteres e layout
  • Bom suporte a texto CJK
  • Base para o pdfplumber e outras ferramentas
  • Licença MIT

Limitações:

  • 21× mais lenta que o PDF Oxide (Pure Python, sem otimizações)
  • Somente leitura, sem criação ou edição
  • API verbosa para tarefas comuns
  • Manutenção menos ativa

Quando usar cada uma

Caso de uso Biblioteca recomendada
Extração de texto rápida PDF Oxide
Produto comercial / proprietário PDF Oxide, pypdfium2, pypdf, pdfplumber ou pdfminer
Alternativa ao PyMuPDF (licença MIT) PDF Oxide
Criação de PDF a partir de Markdown/HTML PDF Oxide
Validação de conformidade (PDF/A, PDF/X) PDF Oxide
Extração de tabelas de notas fiscais pdfplumber
Depuração visual da extração pdfplumber
Investimento existente em MuPDF PyMuPDF (se compatível com AGPL)
Dependências mínimas pypdf (Pure Python)
Análise detalhada de layout pdfminer
OCR para documentos digitalizados PyMuPDF

Instalação

# PDF Oxide
pip install pdf_oxide

# PyMuPDF
pip install pymupdf

# pypdfium2
pip install pypdfium2

# pypdf
pip install pypdf

# pdfplumber
pip install pdfplumber

# pdfminer
pip install pdfminer.six

O PDF Oxide distribui wheels pré-compilados para Linux (x86_64, aarch64), macOS (x86_64, arm64) e Windows (x86_64). Nenhum compilador ou biblioteca de sistema é necessário.

Páginas relacionadas