Structure
Structure
このページでは、文書のナビゲーションと論理構造について説明します:アウトライン(ブックマーク)、目次、名前付きデスティネーション、およびアクセシビリティとリフローに使用されるタグ付き構造ツリー。
アウトライン(ブックマーク)
Document.GetOutlines() は現在のアウトラインツリーを OutlineItem[] として返します(/Outlines がない場合は [])。Document.SetOutlines() はそれを置き換えます — [] を渡すとアウトラインが完全に削除されます。各 OutlineItem には Title と、Dest(ページ番号または名前付きデスティネーション)、ネスト用のオプション Children、およびスタイリング(Color、Bold、Italic、Open)があります。
const items: OutlineItem[] = sections.map((s) => {
const item: OutlineItem = { Title: s.title, Dest: { name: s.dest } };
if (s.subtype === 'sales') {
item.Open = true;
item.Children = ['Pasta', 'Pizza', 'Antipasti']
.map((cat) => ({ Title: cat, Dest: { name: s.dest } }));
}
return item;
});
doc.SetOutlines(items);目次
Page.AddTOC() は TOCEntry オブジェクトのリストを描画します — 各オブジェクトは title と対象の page 番号を持ち、ページ上の矩形領域に、折り返しタイトル、ドットリーダー、右揃えのページラベルと共に配置されます。描画されたエントリ数を報告する AddTOCResult を返し、矩形が小さすぎる場合は、収まらなかった remainder を返します。
page.AddTOC(
sections.map((s, i) => ({ title: `${i + 1}. ${s.title}`, page: s.page.Number })),
[72, 160, 400, 400],
{ font: 'Helvetica', fontSize: 13, rowGap: 18 },
);名前付きデスティネーション
Document.GetNamedDestinations() はすべての名前付きデスティネーションを返します — /Names /Dests 名称ツリーとレガシーな /Dests 辞書を統合し — { name, dest } ペアとして、ここで dest は PageDest({ page, view })です。これらは、OutlineItem.Dest またはリンクアノテーションが、明示的なページ番号ではなく名前で参照できる同じ名前付きターゲットです。
const destNames = new Set(doc.GetNamedDestinations().map((d) => d.name));
for (const { name, dest } of doc.GetNamedDestinations()) {
console.log(name, '-> page', dest.page);
}タグ付き構造ツリー
Document.AutoTag() はページレイアウトから /StructTreeRoot を推測し作成します — フォントサイズのクラスタリングによる見出し、テキストブロックによる段落、ルーリングジオメトリによる表、画像ごとの /Figure 対 /Artifact の判断 — そして各要素種別のカウントを含む AutoTagReport を返します。Document.GetStructTree() は結果の StructTreeRoot を読み戻すか、文書がタグ付けされていない場合は null を読み戻します。
const report = doc.AutoTag({ lang: 'en-US', title: 'Quarterly Report', tables: true });
console.log(report.headings, report.paragraphs, report.tables, report.figures);
const tree = doc.GetStructTree();
console.log(tree ? tree.GetText() : '(no structure tree)');AutoTag() がすでに実行された後に追加されたコンテンツ — 例えば後から埋め込まれたページ — はそのパスでカバーされず、二重タグ付けされません。StructTreeRoot.Append() と StructElement.MarkContent() はヒューリスティックなものと並ぶ手動著者作業の API です: Append() は指定されたタイプの子要素を追加し、MarkContent() はページ領域をその要素に属するものとしてマークします。
ヒントとベストプラクティス
- ページコンテンツが最終形になった後に
Document.AutoTag()を一度実行します — その後に追加されたコンテンツは再タグ付けされないため、後から追加されたものはStructTreeRoot.Append()/StructElement.MarkContent()で手動タグ付けしてください。 opts.titleをAutoTag()に渡します — それは/ViewerPreferences /DisplayDocTitleも設定し、PDF/UA は文書タイトルと共にそれを必要とします。OutlineItem.Destは明示的なページまたは名前付きデスティネーション({ name: '...' })のいずれかを対象にできます — コンテンツの変更で対象ページ番号が変わる可能性がある場合は名前付きデスティネーションを使用してください。- 自動ページ分割がオフのときに
AddTOCResult.remainderを確認してください — 目次ボックスが各エントリに対して小さすぎると、ボックスがはみ出す代わりに描画が静かに停止します。
一般的な問題
| 問題 | 原因 | 修正 |
|---|---|---|
Document.GetStructTree() は null を返します | ドキュメントにタグが付けられていません | 先に Document.AutoTag() または Document.CreateStructTree() を呼び出してください |
| アウトライン項目のリンクが解決できません | その Dest は Document.GetNamedDestinations() に存在しない宛先を指しています | 指定された宛先が存在することを確認するか、代わりに明示的なページ Dest を使用してください |
Page.AddTOC() は最後のセクションの前で停止します | ターゲット rect はすべてのエントリに対して小さすぎ、autoPaginate はオフになっています | rect を拡大し、autoPaginate: true を渡すか、AddTOCResult.remainder を処理してください |
AutoTag() の後に追加されたコンテンツが構造ツリーから欠落しています | AutoTag() は実行時に存在したコンテンツにのみタグ付けします | 後半のコンテンツに StructTreeRoot.Append() / StructElement.MarkContent() を手動でタグ付けしてください |
FAQ
PDFにブックマークを追加するにはどうすればよいですか?
OutlineItem オブジェクト(Title、Dest、オプションの Children)の配列を作成し、Document.SetOutlines() に渡します。
目次は複数ページにわたることができますか?
はい — Page.AddTOC() のオプションで autoPaginate: true を渡すか、AddTOCResult.remainder を確認し、収まりきらなかった部分について新しいページで再度 AddTOC() を呼び出します。
PDFをアクセシブル(タグ付け)にするにはどうすればよいですか?
Call Document.AutoTag() を呼び出します。ページレイアウトから見出し、段落、表、図を推測します。後から追加されたコンテンツや、ヒューリスティック結果を修正する必要がある場合は、StructTreeRoot.Append() と StructElement.MarkContent() を直接使用してください。
ページ番号デスティネーションと名前付きデスティネーションの違いは何ですか?
ページ番号デスティネーション(PageDest)は、明示的な1から始まるページを対象とします。名前付きデスティネーション(NamedDest)は、ビューアが文書内の名前付きデスティネーションテーブルを通じて解決する名前を対象とします—対象ページが移動する可能性がある場合に便利です。
API Reference 概要
| クラス/メソッド | 説明 |
|---|---|
Document.GetOutlines() / Document.SetOutlines() | ドキュメントのアウトライン(ブックマーク)ツリーを読み取るまたは置き換える |
OutlineItem | 1つのアウトラインノード: Title, Dest, 任意の Children |
Page.AddTOC() | ページ矩形に目次を描画する |
TOCEntry / AddTOCResult | TOC 行のデータと、その描画結果 |
Document.GetNamedDestinations() | 文書内のすべての名前付きデスティネーションをリストアップする |
Document.AutoTag() | ページレイアウトからタグ付き構造ツリーを推測し、作成する |
Document.GetStructTree() / Document.CreateStructTree() | 文書のStructTreeRootを読み取るか作成する |
StructTreeRoot.Append() / StructElement.Append() / StructElement.MarkContent() | 構造ツリーを手動で作成または拡張する |