Skip to content

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
Posiciones de caracteres Parcial
Extracción de imágenes
Campos de formulario Lectura + escritura Lectura + escritura Lectura + escritura
Creación de PDF Limitada (solo fusión) 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 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
SaaS de código cerrado Requiere licencia
Distribución por 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 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
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 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