Skip to content

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
Posiciones de caracteres
Extracción de imágenes
Campos de formulario Lectura + Escritura Lectura + Escritura
Creación de PDF Sí (Markdown/HTML)
Salida en Markdown No
Salida en HTML No
Cifrado Lectura + Escritura Lectura + Escritura
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 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 Requiere licencia
SaaS de código cerrado Requiere licencia
Herramientas internas
Proyecto de código abierto Sí (si es compatible con AGPL)
Distribución por Docker 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

  1. Instala: pip install pdf_oxide
  2. Reemplaza los imports: import fitzfrom pdf_oxide import PdfDocument
  3. Reemplaza la apertura: fitz.open(path)PdfDocument(path)
  4. Reemplaza la extracción: page.get_text()doc.extract_text(page_index)
  5. Reemplaza las imágenes: Búsqueda de xref en varios pasos → doc.extract_images(page_index)
  6. Actualiza el manejo de contraseñas: Usa PdfDocument(path, password="pw") o doc.authenticate("pw") tras abrir
  7. 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