Saltar al texto
Scholaris

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

TablaQué guarda
spdfClave y valor: versión, fecha de creación, programa que lo generó, huella del original
documentosTipo, ficha (JSON), huella SHA-256, tipo MIME, tamaño, número de unidades, duración, título, autores, año e idioma
unidadesLas 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
seccionesEl árbol de secciones
fragmentosLos 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
figurasFiguras, láminas y fotogramas, con su región, pie y descripción
espaciosLos espacios vectoriales: proveedor, modelo, versión, dimensiones, normalización y modalidades
vectoresUn vector por objetivo (fragmento, unidad o figura) y espacio, en float32 little-endian
blobsEl original y las imágenes (solo en los ficheros exportados)
procedenciaEl 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:

EspacioModeloDimensionesCuándo
gemini-embedding-2@1536Gemini Embedding 2, multimodal, recortado1536Por defecto, en la nube y en casa
embeddinggemma-2@768EmbeddingGemma 2 (texto, imagen, audio y vídeo), en tu máquina768 (o 512, 256, 128)En la versión local sin conexión
qwen3-vl-embedding-2b@2048Qwen3-VL Embedding 2B, en InferBox2048En la versión local con InferBox, como espacio extra
qwen3-embedding-0.6b@1024Qwen3 Embedding 0.6B, en Workers AI1024Si 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 vectores
from 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 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

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.
  • 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).