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.
Revisado el Esta página en Markdown
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). 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:
pip install scholaris-sdk # solo depende de requests
pip install "scholaris-sdk[vectores]" # con numpy, para buscar por vectoresfrom scholaris.v2 import SPDF
with SPDF.abrir("vigilar.spdf") as s:
print(s.documento["metadatos"]["titulo"])
for f in s.buscar("panóptico", k=5): # FTS5, insensible a acentos
print(f.cita, f.texto[:80]) # «(Foucault, 1975, p. 23) …»
print(s.pagina("145").texto) # por número de página impresoEl 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
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(formatoscholaris-biblioteca, versión 1) y unLEEME.txtcon los derechos de la biblioteca. Ver Bibliotecas. - 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).