---
title: "El formato SPDF 4.1, una biblioteca que te llevas"
description: "Un .spdf es una base de datos SQLite comprimida con gzip que guarda el documento ya leído: texto, anclas, secciones, figuras, vectores y procedencia. Se abre sin Scholaris y sin conexión."
url: https://scholaris.joseluissaorin.com/saber/spdf
markdown: https://scholaris.joseluissaorin.com/saber/spdf.md
lang: es
alternate_en: https://scholaris.joseluissaorin.com/en/knowledge/spdf.md
updated: 2026-10-07
author: José Luis Saorín Ferrer (https://joseluissaorin.com)
---

# El formato SPDF 4.1, una biblioteca que te llevas

> Un .spdf es una base de datos SQLite comprimida con gzip que guarda el documento ya leído: texto, anclas, secciones, figuras, vectores y procedencia. Se abre sin Scholaris y sin conexión.

## Qué es un .spdf

Un fichero **.spdf** (Scholaris PDF) guarda un documento ya leído: no solo el original, sino todo lo que Scholaris sacó de él, de manera que se pueda buscar y citar en otro sitio sin volver a leerlo ni pagar otra vez por ello.

Por dentro es una base de datos **SQLite comprimida con gzip** (no es un ZIP). Cualquier lenguaje con SQLite la abre; también se acepta sin comprimir. La versión actual es la **4.1**; la versión se guarda en la tabla `spdf`, con la clave `spdf_version`. Los SPDF antiguos (versiones 1 a 3, de la primera Scholaris) se migran solos al abrirlos.

Cada .spdf exportado lleva un documento. El mismo esquema es el que usa, en el servidor, la biblioteca de cada usuario.

## Las tablas

| Tabla | Qué guarda |
| --- | --- |
| spdf | Clave y valor: versión, fecha de creación, programa que lo generó, huella del original |
| documentos | Tipo, ficha (JSON), huella SHA-256, tipo MIME, tamaño, número de unidades, duración, título, autores, año e idioma |
| unidades | Las unidades citables (páginas, tramos de audio, diapositivas): ancla, texto, notas, cabecera y pie, imagen, confianza, página impresa, tiempos y los tiempos de cada palabra |
| secciones | El árbol de secciones |
| fragmentos | Los pasajes que se buscan y se citan: texto, contexto, sección, ancla de inicio y de fin, y la capa de grafía modernizada (texto_busqueda) |
| fragmentos_fts | Índice de texto completo FTS5 sobre texto, contexto, sección y grafía modernizada, sin distinguir tildes |
| figuras | Figuras, láminas y fotogramas, con su región, pie y descripción |
| espacios | Los espacios vectoriales: proveedor, modelo, versión, dimensiones, normalización y modalidades |
| vectores | Un vector por objetivo (fragmento, unidad o figura) y espacio, en float32 little-endian |
| blobs | El original y las imágenes (solo en los ficheros exportados) |
| procedencia | El registro de cómo se leyó: cada fase, qué proveedor la hizo, cuánto tardó y cuándo |

La versión 4.1 añadió la columna `texto_busqueda`: una sombra del texto con la ortografía modernizada, solo para buscar (ver [Búsqueda](https://scholaris.joseluissaorin.com/saber/busqueda.md)). El texto que se cita no se toca nunca.

## Espacios vectoriales

Un mismo .spdf puede llevar vectores de varios modelos a la vez, y cada uno se declara en la tabla `espacios`. Los que usa Scholaris hoy:

| Espacio | Modelo | Dimensiones | Cuándo |
| --- | --- | --- | --- |
| gemini-embedding-2@1536 | Gemini Embedding 2, multimodal, recortado | 1536 | Por defecto, en la nube y en casa |
| embeddinggemma-2@768 | EmbeddingGemma 2 (texto, imagen, audio y vídeo), en tu máquina | 768 (o 512, 256, 128) | En la versión local sin conexión |
| qwen3-vl-embedding-2b@2048 | Qwen3-VL Embedding 2B, en InferBox | 2048 | En la versión local con InferBox, como espacio extra |
| qwen3-embedding-0.6b@1024 | Qwen3 Embedding 0.6B, en Workers AI | 1024 | Si no hay clave de Gemini |

Al importar un .spdf solo se calculan los vectores que falten para el espacio que use tu biblioteca; el texto y las anclas no se vuelven a leer.

## Abrirlo sin conexión con Python

El SDK de Python trae un lector de SPDF que solo usa la biblioteca estándar (gzip y sqlite3) y abre el fichero en modo de solo lectura:

```sh
pip install scholaris-sdk                 # solo depende de requests
pip install "scholaris-sdk[vectores]"     # con numpy, para buscar por vectores
```

```py
from scholaris.v2 import SPDF

with SPDF.abrir("vigilar.spdf") as s:
    print(s.documento["metadatos"]["titulo"])
    for f in s.buscar("selección natural", k=5):       # FTS5, insensible a acentos
        print(f.cita, f.texto[:80])            # «(Darwin, 1859, p. 81) …»
    print(s.pagina("145").texto)               # por número de página impreso
```

El lector también da acceso a `documentos`, `unidades`, `fragmentos`, `secciones`, `espacios`, `blob`, `original` y `vectores(espacio)`, y busca por similitud con `buscar_vector(vector, espacio, k)`. El paquete se llama `scholaris-sdk` en PyPI y se importa como `scholaris`; tiene licencia EUPL-1.2.

Una advertencia: la búsqueda del lector de Python usa el índice FTS5 tal cual, sin la capa de grafía modernizada que aplica Scholaris a la consulta.

## Abrirlo sin Python

```sh
gzip -dc libro.spdf > libro.sqlite
sqlite3 libro.sqlite "SELECT valor FROM spdf WHERE clave = 'spdf_version'"
sqlite3 libro.sqlite "SELECT texto FROM fragmentos_fts WHERE fragmentos_fts MATCH 'panoptico' LIMIT 3"
```

## Exportar e importar

- Desde la aplicación, cada documento se exporta como .spdf, con o sin el original y los vectores. Desde el servidor caben hasta 24 MB de ficheros incrustados; para más, la exportación se hace en el navegador.
- Una biblioteca entera se exporta como paquete **.scholaris**: un ZIP con un .spdf por documento, un `manifest.json` (formato `scholaris-biblioteca`, versión 1) y un `LEEME.txt` con los derechos de la biblioteca. Ver [Bibliotecas](https://scholaris.joseluissaorin.com/saber/bibliotecas.md).
- Importar un .spdf (hasta 512 MB) no vuelve a leer nada.

## Lo que falta

Aún no hay un validador público para la versión 4. La especificación completa vive en el código (`packages/spdf/esquema/v4.1.sql`), que se publicará con el resto del código fuente (ver [Versión local](https://scholaris.joseluissaorin.com/saber/version-local.md)).
