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 | Sí | Sí |
| Posiciones de caracteres | Sí | Sí |
| Extracción de imágenes | Sí | Sí |
| Campos de formulario | Leer + escribir | Leer + escribir |
| Creación de PDF | Sí (Markdown/HTML) | Sí |
| Salida Markdown | Sí | No |
| Salida HTML | Sí | No |
| Cifrado | Leer + escribir | Leer + escribir |
| Renderizado | Sí | Sí |
| 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 | Sí | Requiere licencia |
| SaaS de código cerrado | Sí | Requiere licencia |
| Herramientas internas | Sí | Sí |
| Proyecto open source | Sí | Sí (si es compatible con AGPL) |
| Distribución en Docker | Sí | 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
- Instala:
pip install pdf_oxide - Cambia los imports:
import fitz→from pdf_oxide import PdfDocument - Cambia la apertura:
fitz.open(path)→PdfDocument(path) - Cambia la extracción:
page.get_text()→doc.extract_text(page_index) - Cambia las imágenes: búsqueda multi-paso por xref →
doc.extract_images(page_index) - Ajusta la contraseña: usa
PdfDocument(path, password="pw")o llama adoc.authenticate("pw")tras abrir - 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
- Benchmarks de rendimiento — resultados completos del corpus
- vs bibliotecas PDF de Python — todas las bibliotecas de Python comparadas
- Primeros pasos con Python — instalación y primera extracción