Skip to content

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
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