Skip to content

PDF Oxide vs PyMuPDF

PDF Oxide es la alternativa con licencia MIT a PyMuPDF: 5,8× más rápida y sin las restricciones de licencia de AGPL. Si estás evaluando PyMuPDF para un producto comercial o buscas reemplazarlo por temas de licencia, esta página te da las diferencias clave sin rodeos.

Por qué los equipos cambian de PyMuPDF

Licencia. PyMuPDF se apoya en MuPDF bajo AGPL-3.0. Si distribuyes software que incluye PyMuPDF — SaaS, aplicaciones web o contenedores Docker, sin excepción — tienes que liberar tu código bajo AGPL o comprar una licencia comercial a Artifex. PDF Oxide es MIT, sin ataduras.

Velocidad. PDF Oxide extrae texto en 0,8 ms de media; PyMuPDF, en 4,6 ms. Sobre 3 830 PDFs eso son 5,8× de diferencia.

Fiabilidad. En el mismo corpus, PDF Oxide alcanza el 100 % de éxito. PyMuPDF se queda en 99,3 % y falla en 27 PDFs válidos.

Comparativa rápida

PDF Oxide PyMuPDF
Licencia MIT AGPL-3.0
Tiempo medio de extracción 0,8 ms 4,6 ms
Tasa de éxito (3 830 PDFs) 100 % 99,3 %
Extracción de texto
Posiciones de caracteres
Extracción de imágenes
Campos de formulario Leer + escribir Leer + escribir
Creación de PDF Sí (Markdown/HTML)
Salida Markdown No
Salida HTML No
Cifrado Leer + escribir Leer + escribir
Renderizado
OCR Integrado (PaddleOCR) Tesseract
Tamaño de instalación ~5 MB ~20 MB
Versiones de Python 3.8–3.14 3.8–3.12

Código lado a lado

Extracción 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)

Conversión a Markdown

PDF Oxide (incluido):

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)

PyMuPDF:

# PyMuPDF no trae conversion a Markdown.
# Hay que usar pymupdf4llm (paquete aparte, 69x mas lento que PDF Oxide):
import pymupdf4llm

md = pymupdf4llm.to_markdown("paper.pdf")

Extracción de imágenes

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"])

Crear un PDF desde 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 no puede generar PDFs a partir de Markdown.
# Hay que colocar el texto manualmente en la pagina:
doc = fitz.open()
page = doc.new_page()
page.insert_text(fitz.Point(72, 72), "Invoice", fontsize=24)
doc.save("invoice.pdf")

Detalles del benchmark

Medido sobre 3 830 PDFs provenientes de tres suites públicas independientes (veraPDF, Mozilla pdf.js, DARPA SafeDocs).

Métrica PDF Oxide PyMuPDF
Tiempo medio de extracción 0,8 ms 4,6 ms
Tiempo p99 9 ms 28 ms
Tasa de éxito (PDFs válidos) 100 % (3 823/3 823) 99,3 % (3 796/3 823)
Paridad de calidad de texto 99,5 % Referencia

Ver la metodología completa del benchmark para detalles del corpus y pasos de reproducción.

Licencia AGPL: qué significa para ti

PyMuPDF envuelve MuPDF, y MuPDF está licenciado bajo AGPL-3.0. Esto te afecta si:

  • Distribuyes software que usa PyMuPDF (binarios, imágenes Docker, apps Electron)
  • Operas un SaaS en el que PyMuPDF procesa PDFs de usuarios en tus servidores
  • Incrustas PyMuPDF en un producto — incluso como microservicio detrás de una API

En todos estos casos, la AGPL te obliga a publicar el código completo de tu aplicación bajo AGPL-3.0 o a comprar una licencia comercial a Artifex.

PDF Oxide es MIT. Lo puedes usar en cualquier proyecto — comercial, propietario, SaaS u open source — sin obligaciones adicionales.

Caso de uso PDF Oxide (MIT) PyMuPDF (AGPL)
Producto comercial Requiere licencia
SaaS de código cerrado Requiere licencia
Herramientas internas
Proyecto open source Sí (si es compatible con AGPL)
Distribución en Docker Requiere licencia

Precio de la licencia comercial de PyMuPDF

Artifex (la empresa detrás de MuPDF y PyMuPDF) no publica los precios de sus licencias comerciales. Según reportes de la industria:

  • Hay que pedir presupuesto — no hay tarifa pública; se solicita a ventas de Artifex
  • Licencia por aplicación — el precio depende del tipo de despliegue y la escala
  • Cuota anual — las licencias comerciales se renuevan cada año
  • Sin plan gratuito — no existe una excepción «community» ni «startup» dentro de la AGPL

Para un equipo que evalúa PyMuPDF con fines comerciales, el coste de licencia es un gasto operativo recurrente sobre el tiempo de desarrollo.

PDF Oxide es MIT — gratis para cualquier uso, para siempre. Sin llamadas comerciales, sin auditorías de licencia, sin riesgo de cumplimiento. Úsalo en SaaS, distribúyelo en contenedores Docker, incrústalo en productos comerciales — sin restricciones.

Guía de migración

Correspondencia de APIs

Tarea PyMuPDF PDF Oxide
Abrir PDF fitz.open("f.pdf") PdfDocument("f.pdf")
Número de páginas doc.page_count doc.page_count()
Extraer texto doc[0].get_text() doc.extract_text(0)
Datos por carácter doc[0].get_text("dict") doc.extract_chars(0)
Extraer imágenes 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 cifrado doc.authenticate("pw") PdfDocument("f.pdf", password="pw")
A Markdown pymupdf4llm (aparte) doc.to_markdown(0)
Crear desde texto insert_text() a mano Pdf.from_markdown("# Título")

Paso a paso

  1. Instala: pip install pdf_oxide
  2. Cambia los imports: import fitzfrom pdf_oxide import PdfDocument
  3. Cambia la apertura: fitz.open(path)PdfDocument(path)
  4. Cambia la extracción: page.get_text()doc.extract_text(page_index)
  5. Cambia las imágenes: búsqueda multi-paso por xref → doc.extract_images(page_index)
  6. Ajusta la contraseña: usa PdfDocument(path, password="pw") o llama a doc.authenticate("pw") tras abrir
  7. Prueba: ejecuta tu pipeline contra tus archivos de prueba habituales

Cuándo quedarte con PyMuPDF

  • Ya tienes una licencia comercial de MuPDF y dependes del renderizado específico de MuPDF
  • Necesitas exportar a SVG (PDF Oxide no genera SVG)
  • Tu proyecto ya está bajo AGPL

Páginas relacionadas