PyMuPDF vs pypdf — Qual Biblioteca PDF para Python?
O PyMuPDF e o pypdf são duas das bibliotecas PDF para Python mais populares, mas ambas têm concessões significativas. O PyMuPDF é rápido mas bloqueado pelo licenciamento AGPL-3.0. O pypdf é licenciado de forma permissiva mas 15× mais lento. Esta página compara ambos diretamente — e mostra por que o PDF Oxide é uma escolha melhor que qualquer um dos dois.
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 funcionalidades que ambos — incluindo saída Markdown/HTML integrada, 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 | Limitado (apenas mesclagem) | Sim (Markdown/HTML) |
| Saída Markdown | Não | Não | Sim |
| Saída 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 Python | 3.8–3.12 | 3.6+ | 3.8–3.14 |
O PyMuPDF é mais rápido e mais rico em funcionalidades 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 licenciamento de uma licença permissiva.
Licenciamento: AGPL vs BSD vs MIT
A diferença de licenciamento entre PyMuPDF e pypdf é frequentemente o fator decisivo para equipes escolhendo entre eles.
PyMuPDF — AGPL-3.0
O PyMuPDF encapsula o MuPDF, que é licenciado sob AGPL-3.0. Esta é uma licença copyleft forte. Se você distribui qualquer software que usa PyMuPDF — incluindo aplicações SaaS, contêineres Docker, serviços web, aplicações desktop ou ferramentas CLI — toda sua aplicação deve ser lançada sob AGPL-3.0. Isso significa publicar seu código-fonte completo sob a mesma licença.
A alternativa é comprar uma licença comercial da Artifex, a empresa por trás do MuPDF. A Artifex não publica preços publicamente; você deve contatar a equipe de vendas para uma cotação. Licenças comerciais são tipicamente anuais e precificadas por aplicação.
A AGPL afeta você se:
- Você distribui um produto que inclui PyMuPDF (aplicação desktop, mobile, Electron)
- Você opera um SaaS ou serviço web que processa PDFs com PyMuPDF
- Você distribui imagens Docker que contêm PyMuPDF
- Você fornece uma API que usa PyMuPDF internamente
A AGPL não afeta você se:
- Seu projeto já é open source sob uma licença compatível com AGPL
- Você usa PyMuPDF apenas para 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 pypdf em produtos comerciais, software de código fechado e aplicações SaaS sem 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 open source 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 de 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 Docker | Requer licença | Sim | Sim |
| Ferramentas internas | Sim | Sim | Sim |
| Open source (compatível com AGPL) | Sim | Sim | Sim |
| Open source (MIT/BSD/Apache) | Não | Sim | Sim |
Para projetos comerciais onde conformidade de licenciamento importa, pypdf e PDF Oxide são ambos escolhas seguras. O PyMuPDF requer 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 suítes de teste independentes e publicamente disponíveis (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 | 1× |
| PyMuPDF | 4.6ms | 28ms | 5.8× mais lento |
| pypdf | 12.1ms | 97ms | 15.1× mais lento |
O PyMuPDF é 2.6× mais rápido que o pypdf porque delega a análise para o motor C do MuPDF. O pypdf faz tudo em Python puro — análise, decodificação de fontes, montagem de texto — o que significa que toda operação paga o overhead do interpretador.
O PDF Oxide é mais rápido que ambos porque seu núcleo Rust lida com toda a análise de PDF, decodificação de fontes e layout de texto nativamente via PyO3, com apenas o resultado final cruzando a fronteira do Python. Não há overhead de subprocesso, bridging de biblioteca C através 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 no corpus. O pypdf falha em 61. Em ambos os casos, são arquivos PDF válidos nos quais a biblioteca ou trava ou retorna texto vazio/incorreto. O PDF Oxide lida com todos os 3.823 PDFs válidos sem falha.
Os 7 arquivos que não passam 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 dos cálculos de taxa de aprovação para todas as bibliotecas.
O Que Isso Significa na Prática
Para um pipeline processando milhares de PDFs diariamente, a taxa de aprovação de 99.3% do PyMuPDF significa aproximadamente 7 falhas por 1.000 documentos. Os 98.4% do pypdf significam 16 falhas por 1.000. Esses são documentos que você precisa lidar 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 teste significa menos casos extremos para lidar em produção.
Comparação de Funcionalidades
Extração de Texto
As três bibliotecas suportam 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, bounding boxes), 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 bounding boxes por caractere e metadados de fonte.
Conversão para Markdown
Esta é uma diferenciação significativa. Muitos pipelines de LLM e RAG precisam de saída 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 é 69× mais lento que a conversão Markdown integrada do PDF Oxide (55.5ms de média vs 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 Markdown do PDF Oxide é integrada, lida com detecção de cabeçalhos, preserva estrutura de tabelas e roda na mesma velocidade que a 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), que são usados em muitos formulários governamentais e empresariais. Nem o PyMuPDF nem o pypdf lidam com 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 lidam com extração de imagens incorporadas. A abordagem do PyMuPDF requer uma busca xref em duas etapas. O pypdf e o PDF Oxide oferecem APIs mais diretas.
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 pode renderizar páginas. O PDF Oxide inclui um motor de renderização integrado.
OCR
O PyMuPDF integra com Tesseract para OCR em PDFs digitalizados. O pypdf não tem suporte a OCR. O PDF Oxide possui OCR integrado via PaddleOCR, sem necessidade de dependências externas de sistema.
Criação de PDF
PyMuPDF pode criar PDFs mas requer posicionamento manual de texto, imagens e formas nas páginas — não há API de alto nível para criar PDFs a partir de conteúdo estruturado.
pypdf não pode criar PDFs do zero. Pode mesclar, dividir e modificar PDFs existentes, mas para criação você precisa de uma biblioteca separada como reportlab ou fpdf2.
PDF Oxide pode 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 leitura de PDFs criptografados e 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 Funcionalidades
| Funcionalidade | 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 Markdown | Não (pymupdf4llm) | Não | Integrada |
| Saída 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 pypdf se:
- Você precisa de uma solução em Python puro sem extensões compiladas C ou Rust
- Você está fazendo manipulação simples de PDF (mesclar, dividir, rotacionar, criptografar/descriptografar)
- Velocidade não é crítica para seu caso de uso
- Você quer a menor pegada de instalação possível (~1 MB)
- Você precisa de amplo suporte de versões Python (3.6+)
Escolha PyMuPDF se:
- Você já tem uma licença comercial do MuPDF da Artifex
- Você precisa de exportação SVG de páginas PDF
- Seu projeto já é licenciado sob AGPL-3.0
- Você depende do comportamento de renderização específico do MuPDF
Escolha PDF Oxide se:
- Você precisa de velocidade máxima de extração de texto (5.8× mais rápido que PyMuPDF, 15× mais rápido que pypdf)
- Você quer licenciamento MIT para uso comercial ou de código fechado
- Você precisa de saída Markdown ou HTML integrada 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 um wheel de ~20 MB com MuPDF embutido. O pypdf é Python puro com ~1 MB. O PDF Oxide distribui wheels pré-compilados (~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 ambos — mais rápido que PyMuPDF, mais permissivo que pypdf, com funcionalidades que nenhuma das duas bibliotecas oferece.
| O que importa para você | Melhor escolha |
|---|---|
| Velocidade máxima | 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 Markdown/HTML | PDF Oxide — integrada |
| Formulários XFA | PDF Oxide — única biblioteca que suporta |
| 100% de confiabilidade | PDF Oxide — 100% de taxa 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