Gere um sumário PDF a partir dos favoritos
Transforme o esquema de favoritos de um PDF em uma página de sumário consistente, sem alinhar títulos e números manualmente.
Executar grátis
Informe os favoritos na ordem do documento, com título, página de destino contada a partir de um e nível opcional. O gerador preserva a hierarquia com recuos, adiciona linhas pontilhadas legíveis e devolve tanto entradas estruturadas quanto o texto pronto para uso. Esquemas vazios são rejeitados para revelar falhas em etapas anteriores.
Prepare o esquema de favoritos
Comece com o esquema já extraído do PDF. Cada entrada precisa de um título e de um número de página contado a partir de um, e deve aparecer na mesma ordem em que o leitor a encontrará. Adicione um nível quando o favorito estiver subordinado a um capítulo ou a outra entrada principal: zero representa um destino principal, um aplica um recuo e níveis maiores aumentam esse recuo. O gerador não inspeciona nem modifica os bytes do PDF, não deduz favoritos a partir do texto e não altera a ordem. Essa separação torna o resultado previsível e deixa problemas nos dados visíveis. Espaços repetidos e quebras de linha dentro dos títulos são normalizados automaticamente. Os títulos devem conter texto visível, as páginas devem ser inteiros positivos e os níveis precisam ficar no intervalo documentado. Um esquema vazio causa um erro de entrada, em vez de produzir uma página sem conteúdo.
Entenda a página gerada
O resultado contém um cabeçalho, uma lista normalizada de entradas, a quantidade de entradas e um campo de página com o texto renderizado. Cada linha começa com o recuo correspondente ao nível do favorito, continua com o título limpo e termina com o número da página. Uma sequência de pontos ocupa o espaço intermediário e facilita a leitura. O formatador usa uma largura-alvo estável, mas nunca corta um título longo apenas para manter o alinhamento; ele preserva todo o texto e insere um separador mínimo. Assim, os nomes significativos dos capítulos permanecem intactos e a saída é determinística no navegador e na API. As entradas estruturadas repetem título, página, nível e linha final, permitindo que você use a página fornecida ou aplique sua própria tipografia depois. O cabeçalho padrão é “Sumário”, mas pode ser trocado por outra expressão não vazia de uma única linha.
Inclua o resultado no fluxo de PDF
Use o texto de página retornado como fonte da etapa que cria ou insere uma página física no PDF. Esta capacidade trata especificamente da renderização do esquema: ela não recalcula destinos após inserções, não escolhe fontes, não pagina listas longas nem modifica o arquivo original. Se a inclusão de uma nova página deslocar os destinos, ajuste os valores antes de gerar o sumário definitivo ou faça a correção durante a montagem. Manter essas responsabilidades explícitas evita o erro comum de uma página causado pela inclusão de elementos pré-textuais depois que os favoritos já foram registrados. Para uma publicação reproduzível, extraia ou mantenha o esquema, valide as páginas, gere o sumário e envie o resultado para a etapa de composição. A mesma lógica determinística funciona sem rede e sem estado armazenado, sendo adequada para verificações no navegador, pipelines de compilação, portais de documentos e testes de regressão.
Casos de uso
Crie um sumário com favoritos preparados
Converta um esquema de capítulos bem mantido em texto alinhado antes de montar o PDF final.
Automatize a publicação de documentos
Gere uma representação previsível do sumário em cada compilação quando os destinos mudarem.
Valide esquemas extraídos
Rejeite cedo um resultado vazio, em vez de publicar silenciosamente uma página de sumário em branco.
Perguntas frequentes
Quanto custa?
A API custa US$ 0,002 por solicitação, e a versão do navegador pode ser executada localmente nesta página.
Esta capacidade lê o arquivo PDF?
Não. Ela recebe um esquema de favoritos já disponível e renderiza esses dados como texto de sumário.
O que ocorre quando o esquema está vazio?
A solicitação falha com um erro de entrada, impedindo que a ausência de favoritos gere uma página enganosa.
Como a hierarquia é representada?
Use um nível contado a partir de zero em cada entrada. Níveis maiores adicionam dois espaços de recuo.
Títulos longos são cortados?
Não. O título normalizado completo é preservado, com pelo menos três pontos antes do número da página.
Inserir o sumário atualiza as páginas?
Não. Informe os destinos finais ou ajuste-os na etapa posterior de montagem do PDF.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
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)Exemplo de requisição
{
"outline": [
{
"title": "Introduction",
"page": 1,
"level": 0
},
{
"title": "Installation",
"page": 4,
"level": 1
}
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.table_of_contents",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_items | 500 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |