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 | Sí | Sí | Sí |
| Posiciones de caracteres | Sí | Parcial | Sí |
| Extracción de imágenes | Sí | Sí | Sí |
| Campos de formulario | Lectura + Escritura | Lectura + Escritura | Lectura + Escritura |
| Creación de PDF | Sí | Limitado (solo fusionar) | Sí (Markdown/HTML) |
| Salida Markdown | No | No | Sí |
| Salida HTML | No | No | Sí |
| Renderizado | Sí | No | Sí |
| 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 | Sí | 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 | Sí | Sí |
| SaaS de código cerrado | Requiere licencia | Sí | Sí |
| Distribución Docker | Requiere licencia | Sí | Sí |
| Herramientas internas | Sí | Sí | Sí |
| Código abierto (compatible con AGPL) | Sí | Sí | Sí |
| Código abierto (MIT/BSD/Apache) | No | Sí | Sí |
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 | 1× |
| 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 | Sí | Sí | Sí |
| Posiciones de caracteres | Sí | Parcial | Sí |
| Extracción de imágenes | Sí | Sí | Sí |
| Campos de formulario (AcroForm) | Lectura + Escritura | Lectura + Escritura | Lectura + Escritura |
| Formularios XFA | No | No | Sí |
| Creación de PDF | Manual | No | Markdown/HTML |
| Salida Markdown | No (pymupdf4llm) | No | Integrada |
| Salida HTML | No | No | Integrada |
| Renderizado | Sí | No | Sí |
| OCR | Tesseract | No | Integrado (PaddleOCR) |
| Búsqueda | Sí | No | Regex + espacial |
| Cifrado | Lectura + Escritura | Lectura + Escritura | Lectura + Escritura |
| Validación PDF/A | No | No | Sí |
| Exportación SVG | Sí | No | No |
| Fusionar/dividir | Sí | Sí | Sí |
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
- PDF Oxide vs PyMuPDF — comparación detallada
- PDF Oxide vs pypdf — comparación detallada
- vs Todas las bibliotecas PDF para Python — comparación completa del ecosistema
- Benchmarks de rendimiento — metodología y resultados