PyMuPDF vs pypdf — ¿Qué biblioteca PDF de Python elegir?
PyMuPDF y pypdf son dos de las bibliotecas PDF de Python más populares, pero ambas presentan compromisos importantes. PyMuPDF es rápida, pero está atada a la licencia AGPL-3.0. pypdf tiene una licencia permisiva, pero es 15× más lenta. Esta página las compara frente a frente — 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, tiene licencia MIT y ofrece más funciones que ambas — incluyendo salida integrada en Markdown/HTML, soporte para formularios XFA y OCR sin dependencias del sistema.
Comparación Rápida
| PyMuPDF | pypdf | PDF Oxide | |
|---|---|---|---|
| Licencia | AGPL-3.0 | BSD-3 | MIT |
| Lenguaje | C (MuPDF) | Python puro | Rust + PyO3 |
| Tiempo medio de extracción | 4.6ms | 12.1ms | 0.8ms |
| Tiempo de extracción p99 | 28ms | 97ms | 9ms |
| Tasa de éxito (3830 PDF) | 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í | Limitada (solo fusión) | 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 rica en funciones que pypdf, pero su licencia AGPL es un factor decisivo en contra para muchos proyectos comerciales. pypdf es más ligera y tiene licencia BSD, pero es notablemente más lenta y más limitada en sus capacidades de extracción. PDF Oxide combina la ventaja de velocidad de un motor nativo con la libertad de una licencia permisiva.
Licencias: AGPL vs BSD vs MIT
La diferencia de licencias entre PyMuPDF y pypdf suele ser el factor decisivo para los equipos que eligen entre ambas.
PyMuPDF — AGPL-3.0
PyMuPDF envuelve a MuPDF, que tiene licencia AGPL-3.0. Es una licencia copyleft fuerte. Si distribuyes cualquier software que use PyMuPDF —incluidas aplicaciones SaaS, contenedores Docker, servicios web, aplicaciones de escritorio o herramientas de CLI—, toda tu aplicación debe publicarse bajo AGPL-3.0. Eso significa publicar tu código fuente completo bajo la misma licencia.
La alternativa es comprar una licencia comercial a Artifex, la empresa detrás de MuPDF. Artifex no publica precios; debes contactar a su equipo de ventas para obtener una cotización. Las licencias comerciales suelen ser anuales y se cobran por aplicación.
La AGPL te afecta si:
- Distribuyes un producto que incluye PyMuPDF (aplicación de escritorio, aplicación móvil, Electron)
- Ejecutas un SaaS o servicio web que procesa PDF con PyMuPDF
- Distribuyes imágenes Docker que contienen PyMuPDF
- Ofreces una API que usa PyMuPDF internamente
La AGPL no te afecta si:
- Tu proyecto ya es de código abierto bajo una licencia compatible con AGPL
- Usas PyMuPDF únicamente 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. El único requisito es conservar 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 Licencias
| 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 por 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 ambas opciones seguras. PyMuPDF exige abrir el código de tu aplicación o comprar una licencia comercial.
Benchmarks de Velocidad
Todos los benchmarks se ejecutaron sobre el mismo corpus de 3830 PDF — tres conjuntos de pruebas independientes y disponibles públicamente (veraPDF, Mozilla pdf.js, DARPA SafeDocs) que abarcan todas las versiones de la especificación PDF (1.0–2.0), archivos cifrados, codificaciones CJK, diseños complejos y documentos malformados.
Velocidad de Extracción de Texto
| Biblioteca | Media | p99 | Relativo a PDF Oxide |
|---|---|---|---|
| PDF Oxide | 0.8ms | 9ms | 1x |
| PyMuPDF | 4.6ms | 28ms | 5.8x más lento |
| pypdf | 12.1ms | 97ms | 15.1x más lento |
PyMuPDF es 2.6x más rápido que pypdf porque delega el análisis al motor en C de MuPDF. pypdf hace todo en Python puro —análisis, decodificación de fuentes, ensamblaje de texto—, lo que significa que cada operación paga la sobrecarga del intérprete.
PDF Oxide es más rápido que ambos porque su núcleo en Rust maneja todo el análisis de PDF, la decodificación de fuentes y la disposición del texto de forma nativa mediante PyO3, y solo el resultado final cruza la frontera de Python. No hay sobrecarga de subprocesos, ni puente a una biblioteca en C a través de ctypes, ni cuello de botella del intérprete.
Fiabilidad
| Biblioteca | PDF válidos aprobados | Tasa de éxito |
|---|---|---|
| PDF Oxide | 3823 / 3823 | 100% |
| PyMuPDF | 3796 / 3823 | 99.3% |
| pypdf | 3762 / 3823 | 98.4% |
PyMuPDF falla en 27 PDF válidos del corpus. pypdf falla en 61. En ambos casos, son archivos PDF válidos en los que la biblioteca o se bloquea o devuelve texto vacío/incorrecto. PDF Oxide procesa los 3823 PDF válidos sin ningún fallo.
Los 7 archivos no aprobados del corpus completo de 3830 archivos son fixtures de prueba rotos intencionalmente (cabecera PDF ausente, catálogos corrompidos por fuzzing, flujos xref no válidos) y se excluyen del cálculo de la tasa de éxito para todas las bibliotecas.
Qué Significa Esto en la Práctica
Para una canalización que procesa miles de PDF al día, la tasa de éxito del 99,3 % de PyMuPDF significa aproximadamente 7 fallos por cada 1000 documentos. El 98,4 % de pypdf significa 16 fallos por cada 1000. Son documentos que necesitas gestionar 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 pruebas significa menos casos límite que gestionar en producción.
Comparación de Funciones
Extracción de Texto
Las tres bibliotecas admiten la extracción básica de texto. 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.
Para la extracción a nivel de carácter (posiciones, tamaños de fuente, cuadros delimitadores), PyMuPDF ofrece get_text("dict"), que devuelve una estructura de diccionario anidada. pypdf ofrece datos parciales de posición de caracteres. PDF Oxide ofrece extract_chars() con cuadros delimitadores por carácter y metadatos de fuente.
Conversión a Markdown
Este es un diferenciador significativo. Muchas canalizaciones de LLM y RAG necesitan salida en Markdown a partir de PDF.
PyMuPDF:
# PyMuPDF has no built-in Markdown conversion.
# You need pymupdf4llm, a separate package:
import pymupdf4llm
md = pymupdf4llm.to_markdown("paper.pdf")
pymupdf4llm funciona, pero es 69x más lento que la conversión a Markdown integrada de PDF Oxide (media de 55.5ms frente a 0.8ms). Además, es una dependencia aparte con su propio ciclo de mantenimiento.
pypdf:
# pypdf has no Markdown conversion.
# You would need an external tool chain (e.g., extract text,
# then use a separate library to structure it as Markdown).
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)
La conversión a Markdown de PDF Oxide está integrada, gestiona la 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 admiten la 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 admite formularios XFA (XML Forms Architecture), que se usan en muchos formularios PDF gubernamentales y empresariales. Ni PyMuPDF ni pypdf gestionan la extracción de datos de formularios XFA.
Extracción de Imágenes
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"])
pypdf:
from pypdf import PdfReader
reader = PdfReader("report.pdf")
page = reader.pages[0]
for i, image in enumerate(page.images):
with open(f"image_{i}.{image.name.split('.')[-1]}", "wb") as f:
f.write(image.data)
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"])
Las tres gestionan la extracción de imágenes incrustadas. El enfoque de PyMuPDF requiere una búsqueda xref de dos pasos. pypdf y PDF Oxide ofrecen API más simplificadas.
Renderizado
PyMuPDF puede renderizar páginas PDF a imágenes (PNG, JPEG) usando el motor de renderizado de MuPDF. pypdf no puede renderizar páginas en absoluto. PDF Oxide incluye un motor de renderizado integrado.
OCR
PyMuPDF se integra con Tesseract para OCR en PDF escaneados. pypdf no tiene soporte de OCR. PDF Oxide tiene OCR integrado mediante PaddleOCR, sin requerir dependencias externas del sistema.
Creación de PDF
PyMuPDF puede crear PDF, pero requiere la colocación manual de texto, imágenes y formas en las páginas — no hay una API de alto nivel para crear PDF a partir de contenido estructurado.
pypdf no puede crear PDF desde cero. Puede fusionar, dividir y modificar PDF existentes, pero para la creación necesitas una biblioteca aparte como reportlab o fpdf2.
PDF Oxide puede crear PDF a partir de 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")
Cifrado
Las tres bibliotecas admiten la lectura de PDF cifrados y la escritura de salida cifrada.
PyMuPDF:
import fitz
doc = fitz.open("encrypted.pdf")
doc.authenticate("password")
text = doc[0].get_text()
pypdf:
from pypdf import PdfReader
reader = PdfReader("encrypted.pdf")
reader.decrypt("password")
text = reader.pages[0].extract_text()
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0)
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 en Python puro, sin extensiones compiladas en C o Rust
- Haces manipulación sencilla de PDF (fusionar, dividir, rotar, cifrar/descifrar)
- La velocidad no es crítica para tu caso de uso
- Quieres la menor huella de instalación 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 exportar SVG desde páginas PDF
- Tu proyecto ya tiene licencia AGPL-3.0
- Dependes de un comportamiento de renderizado específico de MuPDF
Elige PDF Oxide si:
- Necesitas la máxima velocidad de extracción de texto (5.8x más rápido que PyMuPDF, 15x más rápido que pypdf)
- Quieres licencia MIT para uso comercial o de código cerrado
- Necesitas salida integrada en Markdown o HTML para canalizaciones de LLM/RAG
- Necesitas soporte para formularios XFA
- Quieres OCR integrado sin dependencias externas del sistema
- Quieres 100 % de fiabilidad en PDF 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 una wheel de ~20 MB con MuPDF incluido. pypdf es Python puro de ~1 MB. PDF Oxide distribuye wheels precompiladas (~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 licencia. PDF Oxide te ofrece ambas — más rápido que PyMuPDF, más permisivo que pypdf, con funciones que ninguna de las dos bibliotecas ofrece.
| Lo que 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 — la única biblioteca que los admite |
| 100 % de fiabilidad | PDF Oxide — 100 % de tasa de éxito |
| OCR sin Tesseract | PDF Oxide — PaddleOCR integrado |
| Exportación SVG | PyMuPDF |
| Python puro, sin binarios | pypdf |
Empieza 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 de Python — comparación completa del ecosistema
- Benchmarks de Rendimiento — metodología y resultados