---
title: "SPDF: documentos leídos una vez, citables siempre"
description: "SPDF es un formato de fichero abierto para documentos que ya se han leído. Cada pasaje lleva su ancla exacta (página impresa, folio, segundo, diapositiva, verso), así que una cita solo puede imprimir lo que dice la fuente."
url: https://spdf.joseluissaorin.com/es
markdown: https://spdf.joseluissaorin.com/es.md
lang: es
alternate_en: https://spdf.joseluissaorin.com/index.md
updated: 2026-10-07
author: José Luis Saorín Ferrer (https://joseluissaorin.com)
license: CC-BY-4.0
---

# SPDF: documentos leídos una vez, citables siempre

> SPDF es un formato de fichero abierto para documentos que ya se han leído. Cada pasaje lleva su ancla exacta (página impresa, folio, segundo, diapositiva, verso), así que una cita solo puede imprimir lo que dice la fuente.

[Leer la especificación](https://spdf.joseluissaorin.com/es/especificacion.md) · [Validar un fichero](https://spdf.joseluissaorin.com/es/validador.md) · [Abrir el lector](https://spdf.joseluissaorin.com/reader/)

URI de ancla: `spdf:sha256-a156ce5ac9858e29e74bdc90c424fa1b77621bde7204d43faf18c2e726243ab0#p=41&f=17r&char=0,1424` → (Galilei, 1610, fol. 17r)

Página física 41 del fichero, folio impreso 17r, caracteres 0 a 1424 de esa página, en *Sidereus nuncius*. La cita se calcula a partir del ancla guardada al leer; no se adivina nada. [Ábrelo en el validador](https://spdf.joseluissaorin.com/es/validador#url=/commons/files/galilei-sidereus-nuncius-1610.spdf).

## Por qué un formato

Leer bien un documento es lento y caro: reconocer el texto, transcribir, encontrar los folios impresos, dividir en secciones, calcular vectores. SPDF guarda el resultado para que nadie tenga que hacerlo dos veces, y para que todo lo que se cite a partir de él se pueda comprobar.

### I. Anclas

Cada pasaje sabe dónde está. Los fragmentos se guardan con el sitio del que salieron: página física y folio impreso (romano, deducido o por hojas), segundo y tiempos de cada palabra en audio y vídeo, diapositiva, rango de filas, verso o una referencia canónica como Stephanus 514a. Las anclas se escriben como URI portátiles.

`{"type":"page","physical":29,"printed":"21"}`

### II. Procedencia

Cada campo dice quién lo escribió. Cada unidad registra qué lector produjo su texto (la capa de texto de un PDF, un modelo de visión, un reconocedor de voz) y con qué confianza; la ficha registra de dónde salió cada campo (colofón, portada, catálogo). Los folios deducidos se citan entre corchetes.

`reader: gemma-4-e4b · confidence: 0.97`

### III. Una lectura, muchas consultas

Lo caro se hace una sola vez. El reconocimiento de texto, la transcripción, las secciones y los vectores se pagan al producir el fichero. Después responde a consultas léxicas, semánticas e híbridas sin conexión, incluso en un teléfono, con el índice de texto completo del propio SQLite y vectores de varios modelos a la vez.

`fts5 unicode61 · f32 | f16 | i8 · RRF k = 10`

### IV. Portabilidad

Un fichero, cualquier lenguaje, ningún servidor. Un .spdf es una base de datos SQLite 3 corriente: ni contenedor propio ni cuenta. Se puede proyectar en memoria o leer por rangos HTTP, y lo abren doce implementaciones independientes, todas probadas con la misma batería de conformidad.

`un documento = un fichero`

### V. Honestidad de la cita

Una cita solo puede imprimir lo que dice la fuente. Las citas cortas y la bibliografía (CSL-JSON, BibTeX) se derivan del ancla guardada y de la ficha CSL; no se generan. Los agentes tienen la misma garantía con el servidor MCP: buscan, citan el pasaje y dan el folio exacto, y no pueden inventárselo.

`(Saorín Ferrer, 2026, p. [3])`

## Dentro de un .spdf

Un único fichero SQLite, sin comprimir para que se pueda leer por rangos, sin disparadores ni vistas. Los lectores lo abren en solo lectura, en modo defensivo, y nunca cargan extensiones. El esquema es lo bastante pequeño para aprenderlo en una tarde.

| Tabla | Qué guarda |
| --- | --- |
| `spdf_meta` | versión, perfil, programa que lo generó, identificador |
| `documents` | una ficha CSL-JSON, con la procedencia de cada campo |
| `units` | las unidades citables: páginas, tramos de tiempo, diapositivas, hojas |
| `fragments` | pasajes de 150 a 300 palabras con sus anclas |
| `fragments_fts` | índice FTS5, insensible a las tildes |
| `sections` | el árbol de encabezados |
| `figures` | figuras, láminas y fotogramas, con región y descripción |
| `spaces` | espacios vectoriales, declarados como modelo@dims |
| `vectors` | f32, f16 o i8 en little-endian |
| `blobs` | el original y las imágenes, con su SHA-256 |
| `provenance` | qué produjo qué, con qué modelo y cuándo |
| `extensions` | tablas x_proveedor_nombre, obligatorias u opcionales |

### Perfiles

- `core`: Texto y anclas. Basta para buscar y citar.
- `semantic`: Lo anterior más vectores de uno o varios modelos.
- `media`: Lo básico más audio y vídeo con tiempos por palabra.
- `full`: Todo lo anterior.

## Doce implementaciones, una batería

La de Rust es la de referencia y además ofrece una ABI de C. Las demás son nativas e independientes: cada una abre, valida, vuelca, busca, escribe anclas, cita y construye ficheros, y todas pasan los mismos casos de conformidad en cada commit.

- **Rust** (`spdf`): CI en marcha. https://spdf.joseluissaorin.com/es/documentacion/rust.md
- **TypeScript** (`spdf-format`): CI en marcha. https://spdf.joseluissaorin.com/es/documentacion/js.md
- **Python** (`spdf-format`): CI en marcha. https://spdf.joseluissaorin.com/es/documentacion/python.md
- **Swift** (`SPDF`): CI en marcha. https://spdf.joseluissaorin.com/es/documentacion/swift.md
- **Kotlin / JVM** (`io.github.joseluissaorin:spdf`): CI en marcha. https://spdf.joseluissaorin.com/es/documentacion/kotlin.md
- **Go** (`github.com/joseluissaorin/spdf/go`): CI en marcha. https://spdf.joseluissaorin.com/es/documentacion/go.md
- **C# / .NET** (`Spdf.Format`): CI en rojo. https://spdf.joseluissaorin.com/es/documentacion/dotnet.md
- **PHP** (`joseluissaorin/spdf`): CI en marcha. https://spdf.joseluissaorin.com/es/documentacion/php.md
- **Ruby** (`spdf-format`): CI en marcha. https://spdf.joseluissaorin.com/es/documentacion/ruby.md
- **R** (`spdf`): CI en marcha. https://spdf.joseluissaorin.com/es/documentacion/r.md
- **Julia** (`SPDF.jl`): CI en marcha. https://spdf.joseluissaorin.com/es/documentacion/julia.md
- **C** (`libspdf`): CI en marcha. https://spdf.joseluissaorin.com/es/documentacion/c.md

## Por dónde empezar

### Validar

Suelta un .spdf en el validador: lo comprueba contra la especificación y te enseña lo que hay dentro, en tu navegador, sin subir nada.

https://spdf.joseluissaorin.com/es/validador.md

### Leer

El Lector SPDF abre, busca y cita ficheros SPDF en macOS, Windows, Linux, iOS, Android y la web, con modelos locales y sin cuenta.

https://spdf.joseluissaorin.com/es/descargas.md

### Construir

spdf build convierte un PDF, un escaneado, un EPUB o una grabación en un SPDF con modelos locales o con tu propia clave. O empieza por SPDF Commons, una pequeña colección de obras de dominio público.

https://spdf.joseluissaorin.com/es/commons.md

### Para agentes

Cada hoja de esta web tiene un gemelo en Markdown (la misma dirección terminada en .md), /llms.txt los reúne y /llms-full.txt trae la especificación entera. El servidor spdf-mcp permite a cualquier agente buscar en una carpeta de ficheros SPDF y citar con el folio exacto.

https://spdf.joseluissaorin.com/es/agentes.md
