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()ドキュメントのアウトライン(ブックマーク)ツリーを読み取るまたは置き換える
OutlineItem1つのアウトラインノード: Title, Dest, 任意の Children
Page.AddTOC()ページ矩形に目次を描画する
TOCEntry / AddTOCResultTOC 行のデータと、その描画結果
Document.GetNamedDestinations()文書内のすべての名前付きデスティネーションをリストアップする
Document.AutoTag()ページレイアウトからタグ付き構造ツリーを推測し、作成する
Document.GetStructTree() / Document.CreateStructTree()文書のStructTreeRootを読み取るか作成する
StructTreeRoot.Append() / StructElement.Append() / StructElement.MarkContent()構造ツリーを手動で作成または拡張する

参照

 日本語