PDFブックマークから目次を作成
PDFのブックマーク構成を、見出しとページ番号を手作業でそろえることなく、一貫した目次ページへ変換できます。文書内の順序に従い、各ブックマークの見出し、1から始まる移動先ページ、任意の階層レベルをご指定ください。階層は字下げで保持され、読みやすい点線が追加されます。結果には構造化された項目と、そのまま利用できるページ本文の両方が含まれます。空の構成は拒否されるため、前工程でブックマークが取得できなかった場合も見落としません。
無料で実行
ブックマーク構成をご用意ください
あらかじめPDFから取得したブックマーク構成をご用意ください。各項目には見出しと1から始まるページ番号が必要で、読者が文書内で目にする順序に並べます。章や親項目の配下にあるブックマークには階層レベルをご指定ください。レベル0は最上位、レベル1は1段の字下げとなり、それ以上の値では字下げが深くなります。この生成機能はPDFデータを解析・変更せず、本文からブックマークを推測したり、項目を並べ替えたりもしません。役割を分けることで出力が予測しやすくなり、入力データの問題も明確になります。見出し内の連続する空白や改行は自動的に整えられます。見出しには表示可能な文字が必要で、ページ番号は正の整数、階層レベルは仕様の範囲内でなければなりません。構成が空の場合は空白ページではなく入力エラーを返します。
生成されるページの内容をご確認ください
結果には、表題、正規化された項目の配列、項目数、および整形済み本文を格納したページフィールドが含まれます。各行はブックマークの階層に応じた字下げから始まり、整えられた見出し、ページ番号の順に続きます。見出しと番号の間は点線で埋められるため、視線を移しやすくなります。書式設定には一定の目標幅を使用しますが、配置を保つためだけに長い見出しを切り詰めることはありません。全文を残し、最低限の点線を挿入します。そのため、重要な章名を損なわず、ブラウザーとAPIのどちらでも同じ入力から同じ結果が得られます。構造化された各項目にも、見出し、ページ、階層、完成した行が収録されています。提供された本文をそのまま使うことも、後工程で独自の書体を適用することも可能です。既定の表題は「目次」で、空ではない1行の別表記へ変更できます。
PDF作成工程へ組み込んでください
返されたページ本文を、実際のPDFページを作成または挿入する工程の入力としてご利用ください。この機能はブックマーク構成の表示に特化しており、ページ挿入後の移動先の再計算、フォント選択、長い目次の複数ページ化、元ファイルの変更は行いません。新しいページの挿入によって移動先がずれる場合は、最終版を生成する前に入力値を補正するか、PDFを組み立てる工程で調整してください。役割を明確に分けることで、ブックマーク記録後に前付けを追加した際に起こりやすい1ページのずれを防げます。再現可能な出版工程では、構成の抽出または管理、移動先ページの確認、目次の生成、PDF合成への受け渡しという順序が適切です。同じ決定的な処理がネットワークや保存状態なしで動作するため、ブラウザー確認、ビルド処理、文書ポータル、回帰テストにもご利用いただけます。
活用例
整備済みブックマークから目次を作成
丁寧に管理された章構成を、最終PDFの組み立て前に整列済みの本文へ変換できます。
文書公開を自動化
移動先ページが変わるたびに、ビルド工程で一定形式の目次を生成できます。
抽出した構成を検証
空白の目次ページをそのまま公開せず、空の抽出結果を早い段階で拒否できます。
よくある質問
料金はいくらですか?
APIは1回のリクエストにつき$0.002です。ブラウザー版はこのページ上でローカル実行できます。
この機能はPDFファイルを読み込みますか?
いいえ。すでに用意されたブックマーク構成を受け取り、目次用の本文として整形します。
構成が空の場合はどうなりますか?
ブックマークの欠落から誤解を招く空白ページが作られないよう、入力エラーになります。
階層はどのように表しますか?
各項目に0から始まるレベルをご指定ください。レベルが1つ上がるごとに空白2文字分を字下げします。
長い見出しは省略されますか?
いいえ。正規化した見出し全文を残し、ページ番号との間に3個以上の点を入れます。
目次を挿入するとページ番号も更新されますか?
いいえ。最終的な移動先をご指定いただくか、後続のPDF組み立て工程で調整してください。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
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)リクエスト例
{
"outline": [
{
"title": "Introduction",
"page": 1,
"level": 0
},
{
"title": "Installation",
"page": 4,
"level": 1
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.table_of_contents",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_items | 500 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |