Skip to content

Melhor biblioteca PDF para Python em 2026

PDF Oxide comparada com PyMuPDF (fitz), pypdfium2, pypdf, pdfplumber, pdfminer e outras. Esta página apresenta desempenho, cobertura de recursos, licenciamento e diferenças de API para você escolher a biblioteca PDF de Python certa para extrair 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 sucesso (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) Python puro Python puro Python puro
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 Só leitura Leitura + escrita Só 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 Só 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 ~5 MB wheel ~20 MB wheel ~3 MB wheel ~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 públicos que, juntos, cobrem todas as versões da especificação PDF (1.0–2.0), arquivos criptografados, documentos corrompidos, codificações CJK, layouts complexos e casos extremos de segurança. Veja os detalhes do corpus para saber o que cada conjunto testa e por que os resultados são reprodutíveis.

Biblioteca Média Relativa p99 Taxa de sucesso
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 alcança essa velocidade graças a um núcleo nativo em Rust compilado como módulo de extensão do Python via PyO3. Não há sobrecarga de subprocesso nem ponte com biblioteca C — o código Rust roda direto dentro do processo Python.

Confiabilidade

O PDF Oxide processa 3 823 de 3 823 PDFs válidos sem falhar — uma taxa de sucesso de 100 %. Os 7 arquivos que não passam no corpus de 3 830 são fixtures de teste quebrados de propósito (cabeçalho PDF ausente, catálogos corrompidos por fuzzing, streams xref inválidos).

Biblioteca PDFs válidos aprovados Taxa de sucesso
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 textual em relação a PyMuPDF e pypdfium2 em todo o corpus. A qualidade foi medida comparando a saída extraída caractere a caractere. Os 0,5 % de diferença restantes ficam na normalização de espaços e no tratamento de ligaduras, com o PDF Oxide produzindo 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 licença AGPL-3.0. Se você distribui software que usa PyMuPDF, o seu software também precisa ser lançado sob AGPL-3.0 — ou você compra uma licença comercial da Artifex. Isso se aplica a produtos SaaS, aplicações web e qualquer binário distribuído.

O PDF Oxide é MIT, sem restrições. Use em produtos proprietários, plataformas SaaS ou aplicações de código fechado, sem obrigações 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 APIs

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

# Também aceita 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:

# O pypdf consegue mesclar e modificar PDFs, mas não criar do zero com conteúdo de texto.
# Use reportlab ou fpdf2 para criar e depois mescle com o 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")

# Converte para Markdown com detecção de títulos
md = doc.to_markdown(0, detect_headings=True)
print(md)

# Converte para HTML
html = doc.to_html(0)
print(html)

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

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ápida que o PyMuPDF
  • 100 % de sucesso no corpus de 3 830 PDFs — maior confiabilidade entre as bibliotecas testadas
  • API unificada para extração, criação e edição em uma única biblioteca
  • Exportação para Markdown e HTML embutida, com detecção de títulos
  • Licença MIT sem restrições copyleft
  • Validação de conformidade nativa (PDF/A, PDF/UA, PDF/X)
  • Wheels pré-compilados para as principais plataformas e Python 3.8–3.14
  • Sem dependências de sistema — o wheel traz tudo

Limitações:

  • Biblioteca mais nova, com comunidade menor
  • A extração de tabelas é básica diante dos algoritmos do pdfplumber
  • O motor de renderização é menos maduro que o do MuPDF

PyMuPDF (fitz)

Pontos fortes:

  • Madura e testada em produção (apoiada pelo MuPDF, em desenvolvimento desde 2005)
  • Excelente qualidade de renderização em PDFs complexos
  • Integração OCR embutida (Tesseract)
  • Conjunto de recursos vasto: exportação 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
  • Wheel grande (~20 MB) por embutir o MuPDF
  • Sem exportação para Markdown embutida
  • Sem validação de conformidade

pypdfium2

Pontos fortes:

  • Rápida (baseada no motor 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 frente a PDF Oxide ou PyMuPDF
  • Sem criação nem edição de PDF
  • Sem suporte a campos de formulário além de leitura

pypdf

Pontos fortes:

  • Python puro — 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 ampla

Limitações:

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

pdfplumber

Pontos fortes:

  • Melhor extração de tabelas entre as bibliotecas PDF de Python
  • Excelentes dados de posicionamento a nível de caractere
  • Ferramentas visuais de depuração (imagens de página anotadas)
  • Licença MIT

Limitações:

  • Python puro — 29× mais lenta que o PDF Oxide
  • Só leitura — não cria nem edita PDFs
  • Sem criptografia nem renderização

pdfminer

Pontos fortes:

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

Limitações:

  • 21× mais lenta que o PDF Oxide (Python puro, sem otimização)
  • Só leitura, sem criação ou edição
  • API verbosa para tarefas comuns
  • Manutenção pouco ativa

Quando usar cada uma

Caso de uso Biblioteca recomendada
Extração rápida de texto PDF Oxide
Produto comercial / proprietário PDF Oxide, pypdfium2, pypdf, pdfplumber ou pdfminer
Alternativa MIT ao PyMuPDF PDF Oxide
Criar PDF a partir de Markdown/HTML PDF Oxide
Validação de conformidade (PDF/A, PDF/X) PDF Oxide
Extração de tabelas em notas fiscais pdfplumber
Depuração visual da extração pdfplumber
Já investiu em MuPDF PyMuPDF (se AGPL for compatível)
Dependências mínimas pypdf (Python puro)
Análise detalhada de layout pdfminer
OCR de documentos escaneados 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 entrega wheels pré-compilados para Linux (x86_64, aarch64), macOS (x86_64, arm64) e Windows (x86_64). Não exige compilador nem bibliotecas do sistema.

Páginas relacionadas