PDFの目次(しおり/ブックマーク)を移行する方法
PDFのOCR処理やページサイズ変更時に失われてしまう目次(しおり/ブックマーク)データ。JPedalを使えば、リンク付きの目次を簡単に移行できます。

PDFファイルの目次(しおり/ブックマーク)は、数十ページ、数百ページにおよぶ文書をスムーズに閲覧するための重要な機能です。しかし、OCR処理やページサイズの変更といった加工を行うと、せっかく設定した目次データが失われてしまうことが少なくありません。この記事では、PDFの目次移行で直面する課題と、Java PDFライブラリーJPedal(ジェイペダル)を使った効率的な解決方法をご紹介します。
PDFの目次(しおり/ブックマーク)とは
PDFの目次(アウトライン/ブックマークとも呼ばれます)は、PDF仕様で定義されたナビゲーション機能です。Adobe Acrobat ReaderなどのPDFビューアでは、サイドパネルに目次がツリー構造で表示され、クリックするだけで該当ページにジャンプできます。
目次は単なるテキストのリストではなく、以下のような情報を持っています。
- 表示テキスト: 目次に表示されるタイトルや見出しのテキスト
- リンク先情報: ジャンプ先のページ番号や、ページ内の座標位置
- 階層構造: 章・節・項のような入れ子構造(ツリー構造)
- 表示状態: ツリーの初期展開/折りたたみ状態
特にマニュアルや規格書、契約書など、ページ数の多いビジネス文書では、この目次機能がユーザビリティーに大きく影響します。目次がなければ、読者は全ページをスクロールして目的の情報を探さなければなりません。
意外に難しいPDFの目次データの移行
紙のドキュメントをスキャナーで処理しPDFファイルにした場合、目次(しおり/ブックマーク)が付けられていることが多くあります。最近ではOCR(光学的文字認識)を使って文字をデジタル化し、全文検索可能なPDFを作成することが一般的になってきました。
ところが、PDFはOCR処理やページサイズ変更時に新たにPDFファイルが書き出されるために、ほとんどの場合、目次がなくなってしまいます。これは、OCRツールやPDF編集ツールが新しいPDFを生成する際に、元のPDFに含まれていた目次(アウトライン)データを引き継がないためです。
目次が失われる代表的なケース
以下のような作業を行うと、目次データが消失するリスクがあります。
- OCR処理: スキャンPDFにテキストレイヤーを追加する際、新しいPDFとして再生成される
- ページサイズ変更: A3からA4への縮小、レターサイズへの変換などでPDFを再生成する
- PDF最適化: ファイルサイズの圧縮やWeb用最適化で再保存する
- PDF結合・分割: 複数のPDFを1つにまとめたり、1つのPDFを分割する
- バージョン変換: 古いPDFバージョンから新しいバージョンへ変換する
目次テキストは書き出せても、リンクが失われてしまう
Adobe Acrobatなど一部のPDFツールを使うことで、目次のテキストデータはPDFからエクスポートし、新しいPDFへインポートすることができます。しかし肝心な「目次をクリックしてリンク先へ飛ぶ」機能は失われてしまいます。目次のテキストが残っていてもリンクが切れていれば、ユーザーにとっての利便性は大きく損なわれます。
1つや2つのファイルであれば手作業でリンクを設定し直すことも可能ですが、何百ものファイルや、ページ数が数百ページにおよぶ文書では、手作業でやり直すのは非常に時間がかかり現実的ではありません。大量の文書を管理する企業や官公庁では、この問題が深刻なボトルネックになりがちです。
JPedalを使えば簡単にPDFの目次を移行できます
JPedalは、開発者がJavaでPDFファイルを表示、変換、印刷、解析できるようにするJava SDKです。JPedalのアウトライン抽出・書き込み機能を使うことで、元のPDFの目次データ(テキスト、リンク先情報、階層構造を含む)を抽出し、新しいPDFへそのまま書き込むことが可能になります。
サンプルコード(読み込み)
元のPDFからアウトラインデータを抽出します。
final ExtractOutline extract = new ExtractOutline("source.pdf");
extract.openPDFFile();
final Document outlines = extract.getPDFTextOutline();
extract.closePDFfile();getPDFTextOutline()メソッドは、目次データをXMLのDocumentオブジェクトとして返します。これにより、テキストだけでなくリンク先のページ番号や座標情報、階層構造も保持されます。
サンプルコード(書き込み)
抽出したアウトラインデータを、別のPDFに書き込みます。
final OutlineWriter writer = new OutlineWriter("destination.pdf", outlines);
writer.writeOutline();たったこれだけのコードで、リンク付きの目次を新しいPDFに移行できます。手作業でリンクを設定し直す必要はありません。
バッチ処理への応用
上記のコードをループ処理に組み込めば、大量のPDFファイルに対して目次の移行を自動化できます。例えば、OCR処理後の全ファイルに対して、元のPDFから目次を移行するバッチスクリプトを組むことで、手作業では何日もかかる作業を数分で完了させることが可能です。
for (String filename : pdfFiles) {
// 元のPDFから目次を抽出
final ExtractOutline extract = new ExtractOutline("original/" + filename);
extract.openPDFFile();
final Document outlines = extract.getPDFTextOutline();
extract.closePDFfile();
// OCR処理済みPDFに目次を書き込み
final OutlineWriter writer = new OutlineWriter("ocr-processed/" + filename, outlines);
writer.writeOutline();
}JPedalの活用範囲
JPedalは目次の移行だけでなく、JavaでPDFを扱うさまざまな開発シーンで活用できます。PDFビューア、画像変換、テキスト検索、印刷、画像抽出、テキスト抽出、メタデータ抽出、アノテーション編集など、多くの機能が数行のコードで実行できます。
無料トライアルも提供されていますので、PDFの目次移行をはじめ、JavaでのPDF開発をご検討の際はぜひお試しください。

開発者向けPDF入門ガイド
PDFの仕様や活用方法など、開発者に必要な情報をコンパクトにまとめました。初めてPDFを扱う開発者にも分かりやすく、基礎から応用までカバーしているため、PDFのポテンシャルを最大限に引き出し、アプリケーション開発やドキュメント管理の効率化を図るための手引きとなるでしょう。