Skip to content

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

  1. Instale: pip install pdf_oxide
  2. Substitua os imports: import fitzfrom pdf_oxide import PdfDocument
  3. Substitua a abertura: fitz.open(path)PdfDocument(path)
  4. Substitua a extração: page.get_text()doc.extract_text(page_index)
  5. Substitua as imagens: Busca de xref em várias etapas → doc.extract_images(page_index)
  6. Atualize o tratamento de senha: Use PdfDocument(path, password="pw") ou doc.authenticate("pw") após abrir
  7. 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