Genere un índice PDF a partir de marcadores
Convierta el esquema de marcadores de un PDF en una página de índice uniforme sin alinear manualmente títulos y números de página.
Ejecutar — gratis
Proporcione los marcadores en el orden del documento, con el título, la página de destino —contada desde uno— y un nivel de anidación opcional. El generador conserva la jerarquía mediante sangrías, añade líneas de puntos legibles y devuelve tanto las entradas estructuradas como el texto listo para usar. Los esquemas vacíos se rechazan para detectar cualquier fallo previo.
Prepare el esquema de marcadores
Comience con el esquema ya extraído del PDF. Cada entrada necesita un título y un número de página contado desde uno, y debe aparecer en el mismo orden en que el lector la encontrará. Añada un nivel cuando el marcador dependa de un capítulo u otra entrada principal: el nivel cero representa un destino principal, el uno aplica una sangría y los niveles superiores aumentan esa sangría. El generador no inspecciona ni modifica los bytes del PDF, no deduce marcadores a partir del texto ni cambia su orden. Así, el resultado es predecible y los problemas de los datos quedan visibles. Los espacios repetidos y los saltos dentro de los títulos se normalizan automáticamente. Los títulos deben contener texto visible, las páginas deben ser enteros positivos y los niveles deben respetar el intervalo documentado. Un esquema vacío produce un error de entrada y no una página en blanco.
Comprenda la página generada
El resultado incluye un encabezado, una lista normalizada de entradas, el total de entradas y un campo de página con el texto renderizado. Cada línea comienza con la sangría correspondiente al nivel del marcador, continúa con el título limpio y termina con el número de página. Una línea de puntos rellena el espacio para facilitar la lectura. El formateador usa un ancho objetivo estable, pero nunca recorta un título largo solo para mantener la alineación; conserva el texto completo y coloca un separador mínimo. De este modo protege los nombres significativos de los capítulos y ofrece resultados deterministas tanto en el navegador como en la API. Las entradas estructuradas repiten el título, la página, el nivel y la línea final, por lo que usted puede usar el texto suministrado o aplicar después su propia tipografía. El encabezado predeterminado es “Índice”, pero puede sustituirlo por otra etiqueta no vacía de una sola línea.
Intégrelo en un flujo de trabajo PDF
Utilice el texto de página devuelto como fuente para la etapa que crea o inserta una página física en el PDF. Esta capacidad se centra deliberadamente en renderizar el esquema: no recalcula destinos tras insertar páginas, no elige fuentes, no pagina índices extensos ni modifica el archivo original. Si la inserción de una página cambia los destinos, ajuste los valores antes de generar el índice definitivo o hágalo durante el montaje. Separar estas responsabilidades evita el habitual desfase de una página causado por añadir preliminares después de registrar los marcadores. Para una publicación repetible, extraiga o mantenga el esquema, valide las páginas de destino, genere el índice y envíe el resultado a la etapa de composición. La misma lógica determinista funciona sin red ni estado almacenado, por lo que resulta adecuada para comprobaciones en el navegador, procesos de compilación, portales documentales y pruebas de regresión.
Qué puede hacer con ella
Cree un índice desde marcadores preparados
Convierta un esquema de capítulos cuidadosamente mantenido en texto alineado antes de montar el PDF final.
Automatice la publicación documental
Genere una representación predecible del índice en cada compilación cuando cambien los destinos.
Valide esquemas extraídos
Rechace a tiempo un resultado vacío en vez de publicar silenciosamente una página de índice en blanco.
Preguntas frecuentes
¿Cuánto cuesta?
La API cuesta $0.002 por solicitud; la versión del navegador puede ejecutarse localmente en esta página.
¿Esta capacidad lee el archivo PDF?
No. Recibe un esquema de marcadores ya disponible y lo convierte en texto de índice.
¿Qué ocurre si el esquema está vacío?
La solicitud falla con un error de entrada para impedir que la ausencia de marcadores genere una página engañosa.
¿Cómo se representa la jerarquía?
Use un nivel contado desde cero en cada entrada. Cada nivel superior añade dos espacios de sangría.
¿Se recortan los títulos largos?
No. Se conserva el título normalizado completo y se colocan al menos tres puntos antes del número de página.
¿La inserción del índice actualiza las páginas?
No. Proporcione los destinos finales o ajústelos en la etapa posterior de montaje del PDF.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/pdf/table-of-contents \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"outline":[{"title":"Introduction","page":1,"level":0},{"title":"Installation","page":4,"level":1}]}'const res = await fetch("https://api.kit.forhosting.com/pdf/table-of-contents", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"outline": [
{
"title": "Introduction",
"page": 1,
"level": 0
},
{
"title": "Installation",
"page": 4,
"level": 1
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/pdf/table-of-contents",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"outline": [
{
"title": "Introduction",
"page": 1,
"level": 0
},
{
"title": "Installation",
"page": 4,
"level": 1
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/pdf/table-of-contents", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"outline":[{"title":"Introduction","page":1,"level":0},{"title":"Installation","page":4,"level":1}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"outline":[{"title":"Introduction","page":1,"level":0},{"title":"Installation","page":4,"level":1}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/pdf/table-of-contents", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"outline": [
{
"title": "Introduction",
"page": 1,
"level": 0
},
{
"title": "Installation",
"page": 4,
"level": 1
}
]
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.table_of_contents",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
max_items | 500 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |