PDF Oxide vs PyMuPDF
O PDF Oxide é uma alternativa mais rápida ao PyMuPDF, licenciada sob MIT. Se você está avaliando o PyMuPDF para um projeto comercial ou procurando substituí-lo por causa do licenciamento AGPL, esta página aborda as principais diferenças.
Por que os desenvolvedores migram do PyMuPDF
Licenciamento. O PyMuPDF usa o MuPDF sob a licença AGPL-3.0. Se você distribui software que inclui o PyMuPDF — incluindo SaaS, aplicações web e contêineres Docker — seu código precisa ser aberto sob a AGPL, ou você precisa comprar uma licença comercial da Artifex. O PDF Oxide é licenciado sob MIT, sem restrições.
Velocidade. O PDF Oxide extrai texto em 0,8 ms em média, contra 4,6 ms do PyMuPDF — 5,8× mais rápido em 3.830 PDFs.
Confiabilidade. O PDF Oxide alcança 100% de taxa de aprovação no mesmo corpus em que o PyMuPDF atinge 99,3% (27 falhas em PDFs válidos).
Comparação rápida
| PDF Oxide | PyMuPDF | |
|---|---|---|
| Licença | MIT | AGPL-3.0 |
| Tempo médio de extração | 0,8 ms | 4,6 ms |
| Taxa de aprovação (3.830 PDFs) | 100% | 99,3% |
| Extração de texto | Sim | Sim |
| Posições de caracteres | Sim | Sim |
| Extração de imagens | Sim | Sim |
| Campos de formulário | Leitura + Escrita | Leitura + Escrita |
| Criação de PDF | Sim (Markdown/HTML) | Sim |
| Saída em Markdown | Sim | Não |
| Saída em HTML | Sim | Não |
| Criptografia | Leitura + Escrita | Leitura + Escrita |
| Renderização | Sim | Sim |
| OCR | Integrado (PaddleOCR) | Tesseract |
| Tamanho da instalação | ~5 MB | ~20 MB |
| Versões do Python | 3.8–3.14 | 3.8–3.12 |
Código lado a lado
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)
Conversão para Markdown
PDF Oxide (integrado):
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)
PyMuPDF:
# PyMuPDF has no built-in Markdown conversion.
# Use pymupdf4llm (separate package, 69× slower than PDF Oxide):
import pymupdf4llm
md = pymupdf4llm.to_markdown("paper.pdf")
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"])
Criação de PDF a partir de Markdown
PDF Oxide:
from pdf_oxide import Pdf
pdf = Pdf.from_markdown("# Invoice\n\n| Item | Price |\n|------|-------|\n| Widget | $9.99 |")
pdf.save("invoice.pdf")
PyMuPDF:
import fitz
# PyMuPDF cannot create PDFs from Markdown.
# You must manually place text on pages:
doc = fitz.open()
page = doc.new_page()
page.insert_text(fitz.Point(72, 72), "Invoice", fontsize=24)
doc.save("invoice.pdf")
Detalhes do benchmark
Benchmark realizado em 3.830 PDFs de três conjuntos de testes públicos e independentes (veraPDF, Mozilla pdf.js, DARPA SafeDocs).
| Métrica | PDF Oxide | PyMuPDF |
|---|---|---|
| Tempo médio de extração | 0,8 ms | 4,6 ms |
| Tempo de extração p99 | 9 ms | 28 ms |
| Taxa de aprovação (PDFs válidos) | 100% (3.823/3.823) | 99,3% (3.796/3.823) |
| Paridade de qualidade do texto | 99,5% | Referência |
Consulte a metodologia completa do benchmark para detalhes do corpus e passos de reprodução.
Licenciamento AGPL: o que isso significa para você
O PyMuPDF encapsula o MuPDF, que é licenciado sob AGPL-3.0. Isso afeta você se:
- Você distribui software que usa o PyMuPDF (binários, imagens Docker, aplicativos Electron)
- Você opera um SaaS em que o PyMuPDF processa PDFs de usuários nos seus servidores
- Você incorpora o PyMuPDF em um produto — mesmo como um microsserviço por trás de uma API
Em todos esses casos, a AGPL exige que você libere o código-fonte de toda a sua aplicação sob a AGPL-3.0 — ou compre uma licença comercial da Artifex.
O PDF Oxide é licenciado sob MIT. Use-o em qualquer projeto — comercial, proprietário, SaaS ou de código aberto — sem obrigações.
| Caso de uso | PDF Oxide (MIT) | PyMuPDF (AGPL) |
|---|---|---|
| Produto comercial | Sim | Requer licença |
| SaaS de código fechado | Sim | Requer licença |
| Ferramentas internas | Sim | Sim |
| Projeto de código aberto | Sim | Sim (se compatível com AGPL) |
| Distribuição via Docker | Sim | Requer licença |
Preço da licença comercial do PyMuPDF
A Artifex (a empresa por trás do MuPDF e do PyMuPDF) não publica o preço da licença comercial publicamente. Com base em relatos do setor:
- Contato necessário — você precisa solicitar um orçamento à equipe de vendas da Artifex
- Licenciamento por aplicação — o preço varia conforme o tipo de implantação e a escala
- Taxas anuais — as licenças comerciais costumam ser renovadas anualmente
- Sem plano gratuito — não há exceção de “comunidade” ou “startup” à AGPL
Para equipes que avaliam o PyMuPDF para uso comercial, o custo do licenciamento é uma despesa operacional contínua, somada ao tempo de desenvolvimento.
O PDF Oxide é licenciado sob MIT — gratuito para todos os usos, para sempre. Sem ligações de vendas, sem auditorias de licença, sem risco de conformidade. Use-o em SaaS, distribua em contêineres Docker, incorpore em produtos comerciais — sem restrições.
Guia de migração
Mapeamento de API
| Tarefa | PyMuPDF | PDF Oxide |
|---|---|---|
| Abrir PDF | fitz.open("f.pdf") |
PdfDocument("f.pdf") |
| Contagem de páginas | doc.page_count |
doc.page_count() |
| Extrair texto | doc[0].get_text() |
doc.extract_text(0) |
| Dados de caracteres | doc[0].get_text("dict") |
doc.extract_chars(0) |
| Extrair imagens | doc[0].get_images() + doc.extract_image(xref) |
doc.extract_images(0) |
| Buscar texto | doc[0].search_for("query") |
doc.search_page(0, "query") |
| PDF criptografado | doc.authenticate("pw") |
PdfDocument("f.pdf", password="pw") |
| Para Markdown | pymupdf4llm (separado) | doc.to_markdown(0) |
| Criar a partir de texto | insert_text() manual |
Pdf.from_markdown("# Title") |
Passo a passo
- Instale:
pip install pdf_oxide - Substitua os imports:
import fitz→from pdf_oxide import PdfDocument - Substitua a abertura:
fitz.open(path)→PdfDocument(path) - Substitua a extração:
page.get_text()→doc.extract_text(page_index) - Substitua as imagens: Busca de xref em várias etapas →
doc.extract_images(page_index) - Atualize o tratamento de senha: Use
PdfDocument(path, password="pw")oudoc.authenticate("pw")após abrir - Teste: Execute seu pipeline nos seus arquivos de teste existentes
Quando permanecer com o PyMuPDF
- Você já tem uma licença comercial do MuPDF e depende da renderização específica do MuPDF
- Você precisa de exportação para SVG (o PDF Oxide não oferece suporte à saída em SVG)
- Seu projeto já é licenciado sob AGPL
Páginas relacionadas
- Benchmarks de desempenho — resultados completos do corpus
- vs Bibliotecas PDF do Python — todas as bibliotecas Python comparadas
- Primeiros passos com Python — instalação e primeira extração