Skip to content

PyMuPDF vs pypdf

PyMuPDF y pypdf son dos de las bibliotecas PDF para Python más populares, pero ambas tienen concesiones significativas. PyMuPDF es rápida pero restringida por la licencia AGPL-3.0. pypdf tiene licencia permisiva pero es 15× más lenta. Esta página las compara directamente — y muestra por qué PDF Oxide es una mejor opción que cualquiera de las dos.

La respuesta corta: PDF Oxide es 5.8× más rápido que PyMuPDF, 15× más rápido que pypdf, con licencia MIT, y tiene más funciones que ambas — incluyendo salida Markdown/HTML integrada, soporte de formularios XFA y OCR sin dependencias de sistema.

Comparación rápida

PyMuPDF pypdf PDF Oxide
Licencia AGPL-3.0 BSD-3 MIT
Lenguaje C (MuPDF) Python puro Rust + PyO3
Tiempo promedio de extracción 4.6ms 12.1ms 0.8ms
Tiempo de extracción p99 28ms 97ms 9ms
Tasa de éxito (3,830 PDFs) 99.3% 98.4% 100%
Extracción de texto
Posiciones de caracteres Parcial
Extracción de imágenes
Campos de formulario Lectura + Escritura Lectura + Escritura Lectura + Escritura
Creación de PDF Limitado (solo fusionar) Sí (Markdown/HTML)
Salida Markdown No No
Salida HTML No No
Renderizado No
OCR Tesseract No Integrado (PaddleOCR)
Tamaño de instalación ~20 MB ~1 MB ~5 MB
Cifrado Lectura + Escritura Lectura + Escritura Lectura + Escritura
Búsqueda No Regex + espacial
Versiones de Python 3.8–3.12 3.6+ 3.8–3.14

PyMuPDF es más rápida y tiene más funciones que pypdf, pero su licencia AGPL es un factor decisivo para muchos proyectos comerciales. pypdf es más ligera y tiene licencia BSD, pero es significativamente más lenta y más limitada en capacidades de extracción. PDF Oxide combina la ventaja de velocidad de un motor nativo con la libertad de licenciamiento de una licencia permisiva.

Licenciamiento: AGPL vs BSD vs MIT

La diferencia de licenciamiento entre PyMuPDF y pypdf es a menudo el factor decisivo para los equipos.

PyMuPDF — AGPL-3.0

PyMuPDF usa MuPDF, que tiene licencia AGPL-3.0. Esta es una licencia copyleft fuerte. Si distribuyes cualquier software que use PyMuPDF — incluyendo aplicaciones SaaS, contenedores Docker, servicios web, apps de escritorio o herramientas CLI — toda tu aplicación debe ser publicada bajo AGPL-3.0. Eso significa publicar todo tu código fuente bajo la misma licencia.

La alternativa es comprar una licencia comercial de Artifex, la empresa detrás de MuPDF. Artifex no publica precios; debes contactar a su equipo de ventas para una cotización. Las licencias comerciales son típicamente anuales y con precio por aplicación.

AGPL te afecta si:

  • Envías un producto que incluye PyMuPDF (app de escritorio, app móvil, Electron)
  • Ejecutas un SaaS o servicio web que procesa PDFs con PyMuPDF
  • Distribuyes imágenes Docker que contienen PyMuPDF
  • Proporcionas una API que usa PyMuPDF internamente

AGPL no te afecta si:

  • Tu proyecto ya es código abierto bajo una licencia compatible con AGPL
  • Usas PyMuPDF solo para herramientas internas que nunca se distribuyen

pypdf — BSD-3

pypdf usa la licencia BSD 3-Clause, que es permisiva. Puedes usar pypdf en productos comerciales, software de código cerrado y aplicaciones SaaS sin ninguna obligación de abrir tu código fuente. El único requisito es mantener el aviso de copyright en las redistribuciones.

PDF Oxide — MIT

PDF Oxide tiene licencia MIT — la licencia de código abierto común más permisiva. Úsalo en cualquier contexto (comercial, propietario, SaaS, código abierto) sin restricciones más allá de incluir el texto de la licencia.

Resumen de licenciamiento

Caso de uso PyMuPDF (AGPL) pypdf (BSD) PDF Oxide (MIT)
Producto comercial Requiere licencia
SaaS de código cerrado Requiere licencia
Distribución Docker Requiere licencia
Herramientas internas
Código abierto (compatible con AGPL)
Código abierto (MIT/BSD/Apache) No

Para proyectos comerciales donde el cumplimiento de licencias importa, pypdf y PDF Oxide son opciones seguras. PyMuPDF requiere abrir el código de tu aplicación o comprar una licencia comercial.

Benchmarks de velocidad

Todos los benchmarks se ejecutaron en el mismo corpus de 3,830 PDFs — tres suites de prueba independientes y públicamente disponibles (veraPDF, Mozilla pdf.js, DARPA SafeDocs) que cubren cada versión de la especificación PDF (1.0–2.0), archivos cifrados, codificaciones CJK, layouts complejos y documentos malformados.

Velocidad de extracción de texto

Biblioteca Promedio p99 Relativo a PDF Oxide
PDF Oxide 0.8ms 9ms
PyMuPDF 4.6ms 28ms 5.8× más lenta
pypdf 12.1ms 97ms 15.1× más lenta

PyMuPDF es 2.6× más rápida que pypdf porque delega el parseo al motor C de MuPDF. pypdf hace todo en Python puro — parseo, decodificación de fuentes, ensamblaje de texto — lo que significa que cada operación paga el overhead del intérprete.

PDF Oxide es más rápido que ambas porque su núcleo Rust maneja todo el parseo PDF, decodificación de fuentes y layout de texto nativamente vía PyO3, con solo el resultado final cruzando la frontera de Python. No hay overhead de subproceso, no hay bridging de biblioteca C a través de ctypes, y no hay cuello de botella del intérprete.

Confiabilidad

Biblioteca PDFs válidos procesados Tasa de éxito
PDF Oxide 3,823 / 3,823 100%
PyMuPDF 3,796 / 3,823 99.3%
pypdf 3,762 / 3,823 98.4%

PyMuPDF falla en 27 PDFs válidos del corpus. pypdf falla en 61. En ambos casos, son archivos PDF válidos en los que la biblioteca se bloquea o devuelve texto vacío/incorrecto. PDF Oxide maneja los 3,823 PDFs válidos sin fallos.

Los 7 archivos que no pasan en el corpus completo de 3,830 archivos son fixtures de prueba intencionalmente rotos (cabecera PDF faltante, catálogos corrompidos por fuzzing, streams xref inválidos) y se excluyen de los cálculos de tasa de éxito de todas las bibliotecas.

Qué significa esto en la práctica

Para un pipeline que procesa miles de PDFs diariamente, la tasa de éxito del 99.3% de PyMuPDF significa aproximadamente 7 fallos por cada 1,000 documentos. El 98.4% de pypdf significa 16 fallos por cada 1,000. Estos son documentos que necesitas manejar con lógica de respaldo, revisión manual o simplemente aceptar como datos perdidos.

La tasa de éxito del 100% de PDF Oxide en el corpus de prueba significa menos casos extremos que manejar en producción.

Comparación de funciones

Extracción de texto

Las tres bibliotecas soportan extracción de texto básica. Los estilos de API difieren:

PyMuPDF:

import fitz

doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)

pypdf:

from pypdf import PdfReader

reader = PdfReader("report.pdf")
text = reader.pages[0].extract_text()
print(text)

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)

PyMuPDF usa un modelo de objeto de página (doc[0] devuelve una página). pypdf usa un patrón reader/pages. PDF Oxide usa índices de página directamente.

Conversión a Markdown

Este es un diferenciador significativo. Muchos pipelines de LLM y RAG necesitan salida Markdown de PDFs.

PyMuPDF:

# PyMuPDF no tiene conversión Markdown integrada.
# Necesitas pymupdf4llm, un paquete separado:
import pymupdf4llm

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

pymupdf4llm funciona pero es 69× más lento que la conversión Markdown integrada de PDF Oxide (55.5ms promedio vs 0.8ms). Además es una dependencia separada con su propio ciclo de mantenimiento.

pypdf:

# pypdf no tiene conversión Markdown.
# Necesitarías una cadena de herramientas externa.

PDF Oxide:

from pdf_oxide import PdfDocument

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

La conversión Markdown de PDF Oxide es integrada, maneja detección de encabezados, preserva la estructura de tablas y se ejecuta a la misma velocidad que la extracción de texto plano.

Conversión a HTML

PyMuPDF: Sin salida HTML integrada.

pypdf: Sin salida HTML.

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")
html = doc.to_html(0)
print(html)

Campos de formulario

Las tres bibliotecas soportan lectura y escritura de campos de formulario (AcroForm).

PyMuPDF:

import fitz

doc = fitz.open("form.pdf")
page = doc[0]
for widget in page.widgets():
    print(f"{widget.field_name}: {widget.field_value}")

pypdf:

from pypdf import PdfReader

reader = PdfReader("form.pdf")
fields = reader.get_fields()
for name, field in fields.items():
    print(f"{name}: {field.get('/V', '')}")

PDF Oxide:

from pdf_oxide import PdfDocument

doc = PdfDocument("form.pdf")
fields = doc.get_form_fields()
for field in fields:
    print(f"{field.name}: {field.value}")

Una diferencia notable: PDF Oxide soporta formularios XFA (XML Forms Architecture), que se usan en muchos formularios PDF gubernamentales y empresariales. Ni PyMuPDF ni pypdf manejan la extracción de datos de formularios XFA.

Creación de PDF

PyMuPDF puede crear PDFs pero requiere colocación manual de texto, imágenes y formas en las páginas — no hay API de alto nivel para crear PDFs desde contenido estructurado.

pypdf no puede crear PDFs desde cero. Puede fusionar, dividir y modificar PDFs existentes, pero para creación necesitas una biblioteca separada como reportlab o fpdf2.

PDF Oxide puede crear PDFs desde Markdown o HTML:

from pdf_oxide import Pdf

pdf = Pdf.from_markdown("# Invoice\n\n| Item | Price |\n|------|-------|\n| Widget | $9.99 |")
pdf.save("invoice.pdf")

Resumen de funciones

Función PyMuPDF pypdf PDF Oxide
Extracción de texto
Posiciones de caracteres Parcial
Extracción de imágenes
Campos de formulario (AcroForm) Lectura + Escritura Lectura + Escritura Lectura + Escritura
Formularios XFA No No
Creación de PDF Manual No Markdown/HTML
Salida Markdown No (pymupdf4llm) No Integrada
Salida HTML No No Integrada
Renderizado No
OCR Tesseract No Integrado (PaddleOCR)
Búsqueda No Regex + espacial
Cifrado Lectura + Escritura Lectura + Escritura Lectura + Escritura
Validación PDF/A No No
Exportación SVG No No
Fusionar/dividir

Cuándo elegir cada biblioteca

Elige pypdf si:

  • Necesitas una solución de Python puro sin extensiones compiladas de C o Rust
  • Estás haciendo manipulación simple de PDF (fusionar, dividir, rotar, cifrar/descifrar)
  • La velocidad no es crítica para tu caso de uso
  • Quieres la huella de instalación más pequeña posible (~1 MB)
  • Necesitas amplio soporte de versiones de Python (3.6+)

Elige PyMuPDF si:

  • Ya tienes una licencia comercial de MuPDF de Artifex
  • Necesitas exportación SVG de páginas PDF
  • Tu proyecto ya tiene licencia AGPL-3.0
  • Dependes del comportamiento de renderizado específico de MuPDF

Elige PDF Oxide si:

  • Necesitas máxima velocidad de extracción de texto (5.8× más rápido que PyMuPDF, 15× más rápido que pypdf)
  • Quieres licencia MIT para uso comercial o código cerrado
  • Necesitas salida Markdown o HTML integrada para pipelines de LLM/RAG
  • Necesitas soporte de formularios XFA
  • Quieres OCR integrado sin dependencias de sistema externas
  • Quieres 100% de confiabilidad en PDFs válidos

Instalación

# PyMuPDF
pip install pymupdf

# pypdf
pip install pypdf

# PDF Oxide
pip install pdf_oxide

Las tres están disponibles vía pip. PyMuPDF distribuye un wheel de ~20 MB con MuPDF incluido. pypdf es Python puro con ~1 MB. PDF Oxide distribuye wheels precompilados (~5 MB) para Linux (x86_64, aarch64), macOS (x86_64, arm64) y Windows (x86_64).

El veredicto

Si estás eligiendo entre PyMuPDF y pypdf, estás eligiendo entre velocidad y libertad de licenciamiento. PDF Oxide te da ambas — más rápido que PyMuPDF, más permisivo que pypdf, con funciones que ninguna de las dos bibliotecas ofrece.

Qué te importa Mejor opción
Máxima velocidad PDF Oxide (0.8ms)
Licencia permisiva PDF Oxide (MIT) o pypdf (BSD)
Velocidad + licencia permisiva PDF Oxide — la única opción
Salida Markdown/HTML PDF Oxide — integrada
Formularios XFA PDF Oxide — única biblioteca que los soporta
100% confiabilidad PDF Oxide — 100% tasa de éxito
OCR sin Tesseract PDF Oxide — PaddleOCR integrado
Exportación SVG PyMuPDF
Python puro, sin binarios pypdf

Comienza en 10 segundos:

pip install pdf_oxide
from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
text = doc.extract_text(0)

Páginas relacionadas