PDFしおりの活用術―しおりの仕組みと活用法―

更新日:

このページの目的

ここでは、しおりについてPDFファイルの内部でどのように管理されているか、ISO 32000-1に基づいて若干専門的な説明をします。

関連記事

PDFのしおりってなに? どうやって作るの?

記事を読む

しおりのしくみ

アウトラインツリー

しおりは、PDF ファイルの中で「文書アウトライン」(ISO 32000-1 12.3.3 Document Outline)という情報として管理されています。PDFにしおりが用意されているかどうかは、文書カタログ辞書の「Outlines」エントリーに記録されます。

アウトラインツリーのデータは、PDF の本文ページのデータなど他の情報とは別に管理されています。そこで、既存のPDFにしおりを追加したり、削除したりしてもPDF の本文ページの内容と表示には影響がありません。

しおりの設定項目

しおりの情報は、しおり項目(ブックマーク)の辞書をツリー構造として組み立てます。ツリーのルートは「アウトライン辞書」です。アウトライン辞書には、第1階層の先頭のしおり項目辞書、最後のしおり項目辞書、開いて表示するしおり項目の数を登録します。

しおり項目辞書の主なエントリーには次のものがあります。

Title しおり項目に表示する文字列(しおりの文字列は自由に設定できます)
Parent アウトラインツリーにおけるしおり項目の親。第1階層のときはアウトライン辞書
Prev 同一階層の前のしおり項目
Next 同一階層の次のしおり項目
First アウトラインツリーにおけるしおり項目の最初の子供
Last アウトラインツリーにおけるしおり項目の最後の子供
Count 配下に表示するしおり項目の数。正のとき開いて表示し、負のとき閉じて表示する
Dest しおり項目をクリックしたときに飛ぶPDFのページと位置
A しおり項目をクリックしたときのアクション(DestとAは排他)
C しおり項目の色
F しおり項目をイタリックまたは太字にするときに指定

しおりの飛び先

しおりの飛び先の指定方法には幾つかありますが、代表的なのは宛先を明示的に指定する方法です。宛先の指定方法の主な項目は次の通りです。表はISO 32000-1 表151より抜粋したものです。

[Page /XYZ left top zoom] pageによって指定するページの座標(left top)で指定される位置をウィンドウの左上端になるように配置し、zoomで指定する倍率で表示します。
[page /Fit] pageによって指定するページのコンテント全体をフィットする倍率で表示します。
[page /FitH top] pageによって指定するページの垂直座標topで指定される位置をウィンドウの上端になるように配置し、ページの幅全体がウィンドウにフィットする倍率で表示します。
[page /FitV left] pageによって指定するページの水平座標leftで指定される位置をウィンドウの左端になるように配置し、ページの高さ全体がウィンドウにフィットする倍率で表示します。同一階層の次のしおり項目。
[page /FitR left bottom right top] pageの座標left, bottom, rightおよびtopで指定される矩形がウィンドウの水平方向、垂直方向共にフィットする倍率で表示します。

しおりのアクション

しおりの項目をクリックしたときのアクションのタイプの代表的なものを紹介します。表はISO 32000-1 表198より抜粋したものです。

GoTo 現在のドキュメント内の宛先へ移動します。
GoToR 他のドキュメント内へ移動します。
GoToE 埋め込みファイル内の宛先へ移動します。
Launch アプリケーションを起動します。通常はファイルを開きます。
URI URIを解決します。

しおりを外部テキストファイルとして扱う

アンテナハウスの『アウトライナー』では、PDFのしおりを外部のテキストファイルとして扱えます。GUIのプログラムで読み込んだPDFのしおりを外部テキストファイルとして保存したり、外部テキストファイルのしおりをGUIで読んでPDFに付けたりできます。

しおりの外部テキスト形式は、カンマ区切り形式(CSV)、XML形式、JSON形式のテキストファイルとして扱えます。外部テキスト形式の仕様はWebページで公開しています。

(参考)『アウトライナー』オンラインマニュアル:しおりの情報を外部ファイルに保存する

しおりを外部テキストファイルで扱うことで、①同じような構成のPDF同士でしおりを使い回したり、②大きなPDF文書に大量のしおり項目があるときにしおりだけをテキスト編集ソフトで高速に編集、③PDFのしおり情報を書誌情報、区切り情報の管理など別の用途に使えます。

さらには、しおりのツリーからHTMLを作ればPDFの目次をHTMLとして提供することさえもできるでしょう。

また、コマンドラインでも次のことができます:

  • PDF付いているしおりを外部のテキストファイルとして書き出す
  • しおりの付いていないPDFを解析してしおりのツリーを作り、それ外部のテキストファイルとして書き出す
  • 外部のテキストファイルとして作成したしおりをPDFに取り込む
関連記事

PDFにしおりと目次を自動でつける! ~手間のかかる作業はツールで解決~

記事を読む

コマンドラインの操作例

次は『アウトライナー』のコマンドラインの操作例です。最初がコマンドラインのヘルプ表示、2つめが「PDF用CSS設定の手引き2.pdf」というPDFを入力して、しおりを自動生成し、「outline2.csv」ファイルに保存します。

『アウトライナー』のコマンドライン

CSVにすればテキストエディタやMicrosoft Excelでしおりのデータを編集できます。

次の図は「outline2.csv」ファイルの内容をテキストエディタで開いたところです。この例ではCSVファイルに項目名が出力されています。項目名を出すか、出さないかは『アウトライナー』の「オプション」メニューで設定変更ができます。

「outline2.csv」ファイルの内容

プログラムでしおりを操作する

PDFのしおりの情報はプログラムで取り出したり、追加したり、削除したりできます。特にPDFをサーバー上で作成するときは、プログラムで自動的にしおりを付ける必要があります。

『Formatter』のような自動組版ソフトの多くは自動的にしおりを付ける機能があります。また、『PDF Tool API』のようにしおりをプログラムで付けるツールもいろいろあります。

次に『PDF Tool API』の応用として、Javaのしおりの操作プログラムの例を紹介します。詳細は『PDF CookBook 第2巻』をご参照ください。

しおり情報の取得

しおり情報を取得し、結果を標準出力に表示します。

しおり情報の取得イメージ

処理の概要

既存PDF文書のしおりの情報を取得して画面に出力します。「取得方法」パラメータを数値で指定することで、出力形式としてしおりの項目をツリー状にレイアウトする形式としおりのアクションまで含む詳細を表示する形式を選択できます。

PDF Tool APIの主な機能

hasOutlines() アウトラインを持つかどうかの取得
hasChild() 子アウトラインを持つかどうかの取得
getRootOutline() ルートアウトライン取得
getFirstChild() 最初の子アウトラインの取得
getTitle() アウトラインタイトル文字列を取得
getFlags() アウトラインフラグを取得
getColor() アウトラインタイトルの色を取得
getAction() アクションの取得
getNextSibling() 次の兄弟アウトラインの取得
getDest() 宛先の取得

入出力操作の例

入出力操作の例

(1) 次はツリー形式の出力例(tree.txtの内容)です。


        はじめに
        目次
        第1章 タグ付きPDFとはなにか
        1.1 文書の構造
        1.2 タグ付きPDFでできること
        第2章 タグ付きPDFの仕組
        2.1 マークされた内容
        2.2 論理構造を構築する仕組
        2.2.1 構造要素辞書
        2.2.2 タグツリー
        2.2.3 タグツリーとコンテントの対応

        …中略…

        第4章 タグ付きPDFの制作
        4.1 簡単なタグ付きPDFの作成(ルートタグ作成)
        4.2 簡単なタグ付きPDFの作成(フラットなツリー)   
        4.2.1 見出し1と第1階層のタグ設定
        4.2.2 画像のタグ付け
        4.2.3 表のタグ付け
        4.2.4 ヘッダーとフッターのタグ付け
        4.3 簡単なタグ付きPDFの作成(深いツリー)
        4.4 自動タグ付け
        第5章 画像の代替テキスト
        第6章 タグ付きPDFを利用するPDFプロファイル仕様
        参考資料
        -- 完了 --
       

(2) 次は詳細形式の出力例(detail.txtの内容)です。


        Title = はじめに
        Indent = 0
        PDF表示時の子アウトラインをオープンする
        FLAG_BOLD off
        FLAG_ITALIC off
        Color = RGB(0,0,0)
        Action = TYPE_GOTO : GoToアクション
        Dest = TYPE_XYZ : XYZ型
        宛先ページ(PageNumber) : 2 ページ目
        Title = 目次
        Indent = 0
        PDF表示時の子アウトラインをオープンする
        FLAG_BOLD off
        FLAG_ITALIC off
        Color = RGB(0,0,0)
        Action = TYPE_GOTO : GoToアクション
        Dest = TYPE_XYZ : XYZ型
        宛先ページ(PageNumber) : 3 ページ目

        …中略…

        Title = 第6章 タグ付きPDFを利用するPDFプロファイル仕様   
        Indent = 0
        PDF表示時の子アウトラインをオープンする
        FLAG_BOLD off
        FLAG_ITALIC off
        Color = RGB(0,0,0)
        Action = TYPE_GOTO : GoToアクション
        Dest = TYPE_XYZ : XYZ型
        宛先ページ(PageNumber) : 40 ページ目
        Title = 参考資料
        Indent = 0
        PDF表示時の子アウトラインをオープンする
        FLAG_BOLD off
        FLAG_ITALIC off
        Color = RGB(0,0,0)
        Action = TYPE_GOTO : GoToアクション
        Dest = TYPE_XYZ : XYZ型
        宛先ページ(PageNumber) : 42 ページ目
        -- 完了 --
      

しおりの追加

PDF文書にしおりを作成します。

しおりの追加イメージ

処理の概要

サンプルPDF文書(bookmark-0.pdf)にはしおりがありません。そこで次のようなしおりを付けます。

サンプルPDF文書(bookmark-0.pdf)
追加するしおりの条件
  • しおりの階層構造は次の2階層とします。
    • 最上位階層は1ページ目の見出し「PDFにしおりを付ける」
    • その子供として2ページ目の見出しは「Bookmark sample-1」と、外部URLへのリンク(http://www.antenna.co.jp/)
  • しおりのタイトルは各見出しの文字列とURLとします。
  • 各しおりのタイトルには色を設定しています。
  • 「PDFにしおりを付ける」はPtlDestFitを用い、ページの全体が水平方向と垂直方向の両方ともウィンドウ内にちょうど収まる倍率で表示します。また、アウトラインフラグを指定することでしおり表記を太字指定にしています。
  • 「Bookmark sample-1」はPtlDestFitHで高さ指定を行い、ページの本文をウィンドウの上端に配置し、ページの幅全体がウィンドウ内にちょうど収まる倍率で表示します。(このため、幅が狭い状態で表示させると上端の調整は行われません)。
  • 「http://www.antenna.co.jp/」はリンク動作をします。また、アウトラインフラグを論理和を用いて指定することで、しおり表記の太字・イタリックを同時指定しています。

PDF Tool APIの主な機能

setTitle() アウトラインタイトル文字列を設定
setPageNumber() 宛先ページの設定
setTop() 座標の設定上
setDest() 宛先の設定
setAction() アクションの設定
setColor() アウトラインタイトルの色を設定
setFlags() アウトラインフラグを設定
setOpen() PDF表示時の子アウトラインをオープンするかどうかの設定
setURI() URIを設定
appendLastChild() 子アウトラインの追加
appendNextSibling() 兄弟アウトラインの追加

入出力操作の例

入出力操作の例

次図は出力PDFを開いてしおりを表示し、「Bookmark sample-1」をクリックしたときの画面です。

出力PDFのしおり

しおりの削除

PDF文書のしおりを削除します。

しおりの削除イメージ

処理の概要

PDF文書にしおりが付いているかどうかを調べます。しおりがついていれば最初の子供を探します。その兄弟や子供を探して順次アクションやしおりそのものを削除します。本プログラムでは以下の動作をします。

  • 第一階層の最初のしおりを表示し、そのアクションを削除
  • 第一階層の2番目のしおりを表示し、その子しおりを全てを削除
  • 第一階層の3番目のしおりを表示し、自身及びその子しおりを全てを削除

PDF Tool APIの主な機能

hasOutlines() アウトラインを持つかどうか
hasChild() 子アウトラインを持つかどうかの取得
getRootOutline() ルートアウトライン取得
getFirstChild() 最初の子アウトラインの取得
getTitle() アウトラインタイトル文字列を取得
getNextSibling() 次の兄弟アウトラインの取得
removeAction() アクションの削除
removeChildren() 子アウトラインの削除
destroy() 自分自身及び子アウトラインの削除

入出力操作の例

入出力操作の例'

「はじめに」のアクションが削除され、「目次」の子しおりと「第1章 タグ付きPDFとはなにか」自体とその子しおりが削除されたPDF文書を出力します。

関連情報