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
- PDF Oxide vs PyMuPDF — comparação detalhada
- PDF Oxide vs pypdf — comparação detalhada
- vs Todas as Bibliotecas PDF para Python — comparação completa do ecossistema
- Benchmarks de Desempenho — metodologia e resultados