Skip to content

PyMuPDF vs pypdf — Qual biblioteca PDF para Python escolher?

PyMuPDF e pypdf são duas das bibliotecas PDF mais populares para Python, mas ambas têm compromissos significativos. O PyMuPDF é rápido, mas preso à licença AGPL-3.0. O pypdf tem licença permissiva, porém é 15× mais lento. Esta página compara os dois lado a lado — e mostra por que o PDF Oxide é uma escolha melhor do que qualquer um deles.

A resposta curta: o PDF Oxide é 5,8× mais rápido que o PyMuPDF, 15× mais rápido que o pypdf, licenciado sob MIT e tem mais recursos do que ambos — incluindo saída integrada em Markdown/HTML, suporte a formulários XFA e OCR sem dependências de sistema.

Comparação Rápida

PyMuPDF pypdf PDF Oxide
Licença AGPL-3.0 BSD-3 MIT
Linguagem C (MuPDF) Python puro Rust + PyO3
Tempo médio de extração 4.6ms 12.1ms 0.8ms
Tempo de extração p99 28ms 97ms 9ms
Taxa de aprovação (3.830 PDFs) 99.3% 98.4% 100%
Extração de texto Sim Sim Sim
Posições de caracteres Sim Parcial Sim
Extração de imagens Sim Sim Sim
Campos de formulário Leitura + escrita Leitura + escrita Leitura + escrita
Criação de PDF Sim Limitada (apenas mesclagem) Sim (Markdown/HTML)
Saída em Markdown Não Não Sim
Saída em HTML Não Não Sim
Renderização Sim Não Sim
OCR Tesseract Não Integrado (PaddleOCR)
Tamanho da instalação ~20 MB ~1 MB ~5 MB
Criptografia Leitura + escrita Leitura + escrita Leitura + escrita
Busca Sim Não Regex + espacial
Versões do Python 3.8–3.12 3.6+ 3.8–3.14

O PyMuPDF é mais rápido e tem mais recursos que o pypdf, mas sua licença AGPL é um impedimento para muitos projetos comerciais. O pypdf é mais leve e licenciado sob BSD, mas significativamente mais lento e mais limitado nas capacidades de extração. O PDF Oxide combina a vantagem de velocidade de um motor nativo com a liberdade de uma licença permissiva.

Licenciamento: AGPL vs BSD vs MIT

A diferença de licenciamento entre PyMuPDF e pypdf é, muitas vezes, o fator decisivo para as equipes que escolhem entre os dois.

PyMuPDF — AGPL-3.0

O PyMuPDF encapsula o MuPDF, que é licenciado sob AGPL-3.0. Essa é uma licença copyleft forte. Se você distribuir qualquer software que use PyMuPDF — incluindo aplicações SaaS, contêineres Docker, serviços web, aplicativos de desktop ou ferramentas de CLI —, toda a sua aplicação precisa ser publicada sob AGPL-3.0. Isso significa publicar todo o seu código-fonte sob a mesma licença.

A alternativa é adquirir uma licença comercial da Artifex, a empresa por trás do MuPDF. A Artifex não divulga preços publicamente; você precisa entrar em contato com a equipe de vendas para obter um orçamento. As licenças comerciais costumam ser anuais e cobradas por aplicação.

A AGPL afeta você se:

  • Você distribui um produto que inclui PyMuPDF (aplicativo de desktop, aplicativo móvel, Electron)
  • Você opera um SaaS ou serviço web que processa PDFs com PyMuPDF
  • Você distribui imagens Docker que contêm PyMuPDF
  • Você oferece uma API que usa PyMuPDF internamente

A AGPL não afeta você se:

  • Seu projeto já é de código aberto sob uma licença compatível com a AGPL
  • Você usa PyMuPDF apenas em ferramentas internas que nunca são distribuídas

pypdf — BSD-3

O pypdf usa a licença BSD 3-Clause, que é permissiva. Você pode usar o pypdf em produtos comerciais, software de código fechado e aplicações SaaS sem qualquer obrigação de abrir o código. O único requisito é manter o aviso de copyright nas redistribuições.

PDF Oxide — MIT

O PDF Oxide é licenciado sob MIT — a licença de código aberto comum mais permissiva. Use-o em qualquer contexto (comercial, proprietário, SaaS, código aberto) sem restrições além de incluir o texto da licença.

Resumo do Licenciamento

Caso de uso PyMuPDF (AGPL) pypdf (BSD) PDF Oxide (MIT)
Produto comercial Requer licença Sim Sim
SaaS de código fechado Requer licença Sim Sim
Distribuição via Docker Requer licença Sim Sim
Ferramentas internas Sim Sim Sim
Código aberto (compatível com AGPL) Sim Sim Sim
Código aberto (MIT/BSD/Apache) Não Sim Sim

Para projetos comerciais em que a conformidade de licenciamento importa, pypdf e PDF Oxide são escolhas seguras. O PyMuPDF exige abrir o código da sua aplicação ou comprar uma licença comercial.

Benchmarks de Velocidade

Todos os benchmarks foram executados no mesmo corpus de 3.830 PDFs — três conjuntos de testes independentes e disponíveis publicamente (veraPDF, Mozilla pdf.js, DARPA SafeDocs) cobrindo todas as versões da especificação PDF (1.0–2.0), arquivos criptografados, codificações CJK, layouts complexos e documentos malformados.

Velocidade de Extração de Texto

Biblioteca Média p99 Relativo ao PDF Oxide
PDF Oxide 0.8ms 9ms 1x
PyMuPDF 4.6ms 28ms 5.8x mais lento
pypdf 12.1ms 97ms 15.1x mais lento

O PyMuPDF é 2.6x mais rápido que o pypdf porque delega o parsing ao motor em C do MuPDF. O pypdf faz tudo em Python puro — parsing, decodificação de fontes, montagem de texto —, o que significa que cada operação paga o custo do interpretador.

O PDF Oxide é mais rápido que ambos porque seu núcleo em Rust trata todo o parsing de PDF, a decodificação de fontes e o layout de texto de forma nativa via PyO3, com apenas o resultado final cruzando a fronteira do Python. Não há sobrecarga de subprocesso, nenhuma ponte de biblioteca em C por meio de ctypes e nenhum gargalo de interpretador.

Confiabilidade

Biblioteca PDFs válidos aprovados Taxa de aprovação
PDF Oxide 3.823 / 3.823 100%
PyMuPDF 3.796 / 3.823 99.3%
pypdf 3.762 / 3.823 98.4%

O PyMuPDF falha em 27 PDFs válidos do corpus. O pypdf falha em 61. Em ambos os casos, são arquivos PDF válidos em que a biblioteca ou trava ou retorna texto vazio/incorreto. O PDF Oxide processa todos os 3.823 PDFs válidos sem falhas.

Os 7 arquivos não aprovados no corpus completo de 3.830 arquivos são fixtures de teste intencionalmente quebrados (cabeçalho PDF ausente, catálogos corrompidos por fuzzing, streams xref inválidos) e são excluídos do cálculo da taxa de aprovação para todas as bibliotecas.

O Que Isso Significa na Prática

Para um pipeline que processa milhares de PDFs por dia, a taxa de aprovação de 99,3% do PyMuPDF significa cerca de 7 falhas a cada 1.000 documentos. Os 98,4% do pypdf significam 16 falhas a cada 1.000. São documentos que você precisa tratar com lógica de fallback, revisão manual ou simplesmente aceitar como dados perdidos.

A taxa de aprovação de 100% do PDF Oxide no corpus de testes significa menos casos extremos para tratar em produção.

Comparação de Recursos

Extração de Texto

As três bibliotecas suportam a extração básica de texto. Os estilos de API diferem:

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")
text = reader.pages[0].extract_text()
print(text)

PDF Oxide:

from pdf_oxide import PdfDocument

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

O PyMuPDF usa um modelo de objeto de página (doc[0] retorna uma página). O pypdf usa um padrão reader/pages. O PDF Oxide usa índices de página diretamente.

Para extração em nível de caractere (posições, tamanhos de fonte, caixas delimitadoras), o PyMuPDF fornece get_text("dict"), que retorna uma estrutura de dicionário aninhada. O pypdf oferece dados parciais de posição de caracteres. O PDF Oxide fornece extract_chars() com caixas delimitadoras por caractere e metadados de fonte.

Conversão para Markdown

Esse é um diferencial significativo. Muitos pipelines de LLM e RAG precisam de saída em Markdown a partir de PDFs.

PyMuPDF:

# PyMuPDF has no built-in Markdown conversion.
# You need pymupdf4llm, a separate package:
import pymupdf4llm

md = pymupdf4llm.to_markdown("paper.pdf")

O pymupdf4llm funciona, mas é 69x mais lento que a conversão integrada para Markdown do PDF Oxide (média de 55.5ms contra 0.8ms). Também é uma dependência separada, com seu próprio ciclo de manutenção.

pypdf:

# pypdf has no Markdown conversion.
# You would need an external tool chain (e.g., extract text,
# then use a separate library to structure it as Markdown).

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)

A conversão para Markdown do PDF Oxide é integrada, trata a detecção de títulos, preserva a estrutura de tabelas e roda na mesma velocidade da extração de texto simples.

Conversão para HTML

PyMuPDF: Sem saída HTML integrada.

pypdf: Sem saída HTML.

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")
html = doc.to_html(0)
print(html)

Campos de Formulário

As três bibliotecas suportam leitura e escrita de campos de formulário (AcroForm).

PyMuPDF:

import fitz

doc = fitz.open("form.pdf")
page = doc[0]
for widget in page.widgets():
    print(f"{widget.field_name}: {widget.field_value}")

pypdf:

from pypdf import PdfReader

reader = PdfReader("form.pdf")
fields = reader.get_fields()
for name, field in fields.items():
    print(f"{name}: {field.get('/V', '')}")

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("form.pdf")
fields = doc.get_form_fields()
for field in fields:
    print(f"{field.name}: {field.value}")

Uma diferença notável: o PDF Oxide suporta formulários XFA (XML Forms Architecture), usados em muitos formulários PDF governamentais e corporativos. Nem o PyMuPDF nem o pypdf lidam com a extração de dados de formulários XFA.

Extração de Imagens

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)

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

As três tratam a extração de imagens incorporadas. A abordagem do PyMuPDF exige uma busca xref em duas etapas. O pypdf e o PDF Oxide oferecem APIs mais enxutas.

Renderização

O PyMuPDF pode renderizar páginas PDF em imagens (PNG, JPEG) usando o motor de renderização do MuPDF. O pypdf não consegue renderizar páginas de forma alguma. O PDF Oxide inclui um motor de renderização integrado.

OCR

O PyMuPDF integra-se ao Tesseract para OCR em PDFs digitalizados. O pypdf não tem suporte a OCR. O PDF Oxide tem OCR integrado via PaddleOCR, sem exigir dependências externas de sistema.

Criação de PDF

PyMuPDF consegue criar PDFs, mas exige o posicionamento manual de texto, imagens e formas nas páginas — não há uma API de alto nível para criar PDFs a partir de conteúdo estruturado.

pypdf não consegue criar PDFs do zero. Ele pode mesclar, dividir e modificar PDFs existentes, mas para a criação você precisa de uma biblioteca separada como reportlab ou fpdf2.

PDF Oxide consegue criar PDFs a partir de Markdown ou HTML:

from pdf_oxide import Pdf

pdf = Pdf.from_markdown("# Invoice\n\n| Item | Price |\n|------|-------|\n| Widget | $9.99 |")
pdf.save("invoice.pdf")

Criptografia

As três bibliotecas suportam a leitura de PDFs criptografados e a escrita de saída criptografada.

PyMuPDF:

import fitz

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

pypdf:

from pypdf import PdfReader

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

PDF Oxide:

from pdf_oxide import PdfDocument

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

Resumo de Recursos

Recurso PyMuPDF pypdf PDF Oxide
Extração de texto Sim Sim Sim
Posições de caracteres Sim Parcial Sim
Extração de imagens Sim Sim Sim
Campos de formulário (AcroForm) Leitura + escrita Leitura + escrita Leitura + escrita
Formulários XFA Não Não Sim
Criação de PDF Manual Não Markdown/HTML
Saída em Markdown Não (pymupdf4llm) Não Integrada
Saída em HTML Não Não Integrada
Renderização Sim Não Sim
OCR Tesseract Não Integrado (PaddleOCR)
Busca Sim Não Regex + espacial
Criptografia Leitura + escrita Leitura + escrita Leitura + escrita
Validação PDF/A Não Não Sim
Exportação SVG Sim Não Não
Mesclar/dividir Sim Sim Sim

Quando Escolher Cada Biblioteca

Escolha o pypdf se:

  • Você precisa de uma solução em Python puro, sem extensões compiladas em C ou Rust
  • Você faz manipulação simples de PDF (mesclar, dividir, rotacionar, criptografar/descriptografar)
  • A velocidade não é crítica para o seu caso de uso
  • Você quer a menor pegada de instalação possível (~1 MB)
  • Você precisa de amplo suporte a versões do Python (3.6+)

Escolha o PyMuPDF se:

  • Você já tem uma licença comercial do MuPDF da Artifex
  • Você precisa exportar SVG a partir de páginas PDF
  • Seu projeto já é licenciado sob AGPL-3.0
  • Você depende de comportamento de renderização específico do MuPDF

Escolha o PDF Oxide se:

  • Você precisa da máxima velocidade de extração de texto (5.8x mais rápido que o PyMuPDF, 15x mais rápido que o pypdf)
  • Você quer licenciamento MIT para uso comercial ou de código fechado
  • Você precisa de saída integrada em Markdown ou HTML para pipelines de LLM/RAG
  • Você precisa de suporte a formulários XFA
  • Você quer OCR integrado sem dependências externas de sistema
  • Você quer 100% de confiabilidade em PDFs válidos

Instalação

# PyMuPDF
pip install pymupdf

# pypdf
pip install pypdf

# PDF Oxide
pip install pdf_oxide

As três estão disponíveis via pip. O PyMuPDF distribui uma wheel de ~20 MB com o MuPDF embutido. O pypdf é Python puro com ~1 MB. O PDF Oxide distribui wheels pré-compiladas (~5 MB) para Linux (x86_64, aarch64), macOS (x86_64, arm64) e Windows (x86_64).

O Veredito

Se você está escolhendo entre PyMuPDF e pypdf, está escolhendo entre velocidade e liberdade de licenciamento. O PDF Oxide oferece os dois — mais rápido que o PyMuPDF, mais permissivo que o pypdf, com recursos que nenhuma das duas bibliotecas oferece.

O que importa para você Melhor escolha
Máxima velocidade PDF Oxide (0.8ms)
Licença permissiva PDF Oxide (MIT) ou pypdf (BSD)
Velocidade + licença permissiva PDF Oxide — a única opção
Saída em Markdown/HTML PDF Oxide — integrada
Formulários XFA PDF Oxide — a única biblioteca que os suporta
100% de confiabilidade PDF Oxide — 100% de aprovação
OCR sem Tesseract PDF Oxide — PaddleOCR integrado
Exportação SVG PyMuPDF
Python puro, sem binários pypdf

Comece em 10 segundos:

pip install pdf_oxide
from pdf_oxide import PdfDocument

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

Páginas Relacionadas