PDF Oxide vs PyMuPDF
PDF Oxide es una alternativa a PyMuPDF más rápida y con licencia MIT. Si estás evaluando PyMuPDF para un proyecto comercial o buscas reemplazarlo debido a la licencia AGPL, esta página cubre las diferencias clave.
Por qué los desarrolladores cambian de PyMuPDF
Licenciamiento. PyMuPDF usa MuPDF bajo licencia AGPL-3.0. Si distribuyes software que incluye PyMuPDF —incluyendo SaaS, aplicaciones web y contenedores Docker—, tu código debe publicarse como código abierto bajo la AGPL, o debes comprar una licencia comercial a Artifex. PDF Oxide tiene licencia MIT, sin restricciones.
Velocidad. PDF Oxide extrae texto en 0,8 ms de media frente a los 4,6 ms de PyMuPDF: 5,8× más rápido en 3.830 PDF.
Fiabilidad. PDF Oxide alcanza una tasa de éxito del 100% en el mismo corpus en el que PyMuPDF logra el 99,3% (27 fallos en PDF válidos).
Comparación 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 PDF) | 100% | 99,3% |
| Extracción de texto | Sí | Sí |
| Posiciones de caracteres | Sí | Sí |
| Extracción de imágenes | Sí | Sí |
| Campos de formulario | Lectura + Escritura | Lectura + Escritura |
| Creación de PDF | Sí (Markdown/HTML) | Sí |
| Salida en Markdown | Sí | No |
| Salida en HTML | Sí | No |
| Cifrado | Lectura + Escritura | Lectura + Escritura |
| 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 en paralelo
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 (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")
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"])
Creación 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")
Detalles del benchmark
Evaluado con 3.830 PDF de tres conjuntos de pruebas públicos e independientes (veraPDF, Mozilla pdf.js, DARPA SafeDocs).
| Métrica | PDF Oxide | PyMuPDF |
|---|---|---|
| Tiempo medio de extracción | 0,8 ms | 4,6 ms |
| Tiempo de extracción p99 | 9 ms | 28 ms |
| Tasa de éxito (PDF válidos) | 100% (3.823/3.823) | 99,3% (3.796/3.823) |
| Paridad de calidad del texto | 99,5% | Referencia |
Consulta la metodología completa del benchmark para conocer los detalles del corpus y los pasos de reproducción.
Licenciamiento AGPL: qué significa para ti
PyMuPDF envuelve a MuPDF, que tiene licencia AGPL-3.0. Esto te afecta si:
- Distribuyes software que usa PyMuPDF (binarios, imágenes Docker, aplicaciones Electron)
- Ejecutas un SaaS en el que PyMuPDF procesa los PDF de los usuarios en tus servidores
- Integras PyMuPDF en un producto, incluso como un microservicio detrás de una API
En todos estos casos, la AGPL exige que publiques el código fuente de toda tu aplicación bajo la AGPL-3.0, o que compres una licencia comercial a Artifex.
PDF Oxide tiene licencia MIT. Úsalo en cualquier proyecto —comercial, propietario, SaaS o de código abierto— sin obligaciones.
| 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 de código abierto | Sí | Sí (si es compatible con AGPL) |
| Distribución por Docker | Sí | Requiere licencia |
Precio de la licencia comercial de PyMuPDF
Artifex (la empresa detrás de MuPDF y PyMuPDF) no publica el precio de la licencia comercial de forma abierta. Según informes del sector:
- Contacto obligatorio: debes solicitar un presupuesto al equipo de ventas de Artifex
- Licenciamiento por aplicación: el precio varía según el tipo de despliegue y la escala
- Cuotas anuales: las licencias comerciales suelen renovarse cada año
- Sin nivel gratuito: no existe una excepción “comunitaria” o “para startups” en la AGPL
Para los equipos que evalúan PyMuPDF para uso comercial, el coste de la licencia es un gasto operativo continuo que se suma al tiempo de desarrollo.
PDF Oxide tiene licencia MIT: gratis para cualquier uso, para siempre. Sin llamadas de ventas, sin auditorías de licencia, sin riesgo de cumplimiento. Úsalo en SaaS, distribúyelo en contenedores Docker, intégralo en productos comerciales: sin restricciones.
Guía de migración
Equivalencias de API
| 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 de caracteres | 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() manual |
Pdf.from_markdown("# Title") |
Paso a paso
- Instala:
pip install pdf_oxide - Reemplaza los imports:
import fitz→from pdf_oxide import PdfDocument - Reemplaza la apertura:
fitz.open(path)→PdfDocument(path) - Reemplaza la extracción:
page.get_text()→doc.extract_text(page_index) - Reemplaza las imágenes: Búsqueda de xref en varios pasos →
doc.extract_images(page_index) - Actualiza el manejo de contraseñas: Usa
PdfDocument(path, password="pw")odoc.authenticate("pw")tras abrir - Prueba: Ejecuta tu pipeline con tus archivos de prueba existentes
Cuándo seguir con PyMuPDF
- Ya tienes una licencia comercial de MuPDF y dependes del renderizado específico de MuPDF
- Necesitas exportación a SVG (PDF Oxide no admite salida en SVG)
- Tu proyecto ya tiene licencia 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