PDF bookmark.py - a python script embed bookmark to PDF

Author: Akihiro Takizawa<akihiro.takizawa@gmail.com>

概要

これまで、既存のPDFファイルに後から目次を埋め込むためには、Adobe AcrobatなどのPDFが編集できるGUIアプリケーションを用いて、人力でしおりを設定する必要がありました。数百ページを超えるPDF文書にしおりを付す場合、その作業がうんざりするような単純作業であることは容易にご想像できるでしょう。

本来、このような単純作業はコンピュータの得意とするところで、AcrobatにもJavaScriptによるマクロの機能があるのですが、外部ファイルからの入力ができないという制限のために全く実用には適さないものでした。

本ツールは、このような作業を簡単に行なえるようにするためのものです。

なお、本ツールは作者のサンプルコード(https://gist.github.com/3096577)を参考に武藤健志氏(https://github.com/kmuto)が作成したRuby版ツールをPythonで再実装したものです。ツールのインターフェース設計などは、武藤氏のツールをそのまま拝借しています。また、一部の機能については今のところ実装されていません。

必要なソフトウェア

本ツールを利用するには、以下のソフトウェアが必要です。

  • Python 3.0以上(2.xでは動作しません)
  • Gohstscript(目次の埋め込みまで行なう場合)

使い方

しおり用の目次ファイルを作成し、本ツールの引数として指定するとしおりのPostscriptファイルが標準出力に出力されます。これをGhostscriptまたはAdobe Distillerを使って、対象のPDFと合体させる事で、しおりを埋め込むことができます。

Ghostscriptの利用できる環境であれば、pdf-addbookmark.pyの-iオプションと-oオプションを使って入出力PDFを指定すると、PDFの出力までを一括して実行できます。

埋め込み対象となるPDFは、大扉や白ページなどが含まれた、完全な状態である必要があります。

日本における一般的な印刷物の体裁では、表紙ページを1ページとする「通しノンブル」のスタイル(雑誌などがこれに当たります)と、表紙から前書き、目次ページなどを除いた本文部分の冒頭を1ページとする(多くの書籍がこれに当たります)スタイルがあります。本ツールでは、この冒頭部分(前付けと言います)のページ数を-fオプションで指定します。

$ pdf-bookmark.py -f 21 ./fixture/source.txt
[/Count -13 /Title (¥376¥377¥116¥330¥223¥62¥0¥101¥0¥40¥0¥112¥0¥141¥0¥166¥0¥141¥0¥123¥0¥143¥0¥162¥0¥151¥0¥160¥0¥164¥0¥40¥60¥156¥127¥313¥60¥201¥217¥274¥60¥177¥377¥10¥123¥344¥174¥117¥0¥40¥116¥0¥155¥151¥377¥11) /Page 167 /OUT pdfmark
[/Count -5 /Title (¥376¥377¥0¥101¥0¥56¥0¥61¥60¥0¥127¥313¥60¥201¥217¥274¥60¥177¥60¥156¥127¥372¥147¥54) /Page 167 /OUT pdfmark
[/Title (¥376¥377¥0¥101¥0¥56¥0¥61¥0¥56¥0¥61¥60¥0¥145¥207¥146¥370¥60¥242¥60¥257¥60¥267¥60¥347¥60¥363¥60¥147¥60¥156¥0¥112¥0¥141¥0¥166¥0¥141¥0¥123¥0¥143¥0¥162¥0¥151¥0¥160¥0¥164¥0¥40¥127¥313¥60¥201¥217¥274¥60¥177) /Page 169 /OUT pdfmark

$ pdf-bookmark.py -f 21 ./fixture/source.txt -i 978-4-87311-549-8.pdf -o 978-4-87311-549-8-bookmark.pdf
(しおりが埋め込まれた978-4-87311-549-8-bookmark.pdfが生成される)

しおり用の目次ファイル

  • UTF-8エンコーディングのテキスト形式で記述します
  • 各行のインデントの深さで見出しレベルを指定します。インデントはPEP8同様、 4スペース1レベルです
  • 目次テキストとノンブルの間はタブ文字で区切ります

以下に例を示します。

# 『PDF構造解説』(オライリー・ジャパン刊)より
JavaScript の埋め込み(古籏 一浩) 167
    A.1 埋め込みの基本 167
        A.1.1 文書アクションでのJavaScript 埋め込み    169
        A.1.2 フォームレベルのJavaScript 埋め込み  172
        A.1.3 ページレベルのJavaScript 埋め込み    176
        A.1.4 PDF 読み込み時のJavaScript 埋め込み  179
        A.1.5 一括してJavaScript を編集する    182
    A.2 JavaScript のデバッグ  183
        A.2.1 デバッガーの起動 183
    A.3 しおりを階層化テキストで書き出す   188
    A.4 閲覧期限を設定する 190
    A.5 閲覧回数を表示する 191
    A.6 フルスクリーンモードにする 193
    A.7 自動的にしおりを作成する   194
    A.8 スライドショー 195
    A.9 ゼロパディング 196
    A.10 メニューの実行    198
    A.11 アクション/バッチ処理    203
    A.12 その他のJavaScript    207
    A.13 JavaScript コードを一括して削除する   207
付録B 電子書籍に便利なツール集(千住 治郎) 209
    B.1 文字列を検索する̶pdfgrep    209
        B.1.1 poppler ライブラリ   210
    B.2 PDF を比較する̶diffpdf  211
    B.3 pdftk のGUI̶pdfchain    212
    B.4 WYSIWYG なPDF エディタ̶pdfedit  213
    B.5 PDF の版管理機能̶pdfresurrect   214
        B.5.1 処理内容 215
        B.5.2 pdfresurrect の機能  216
        B.5.3 利用形態(案)   216
    B.6 Perl のText::PDF モジュール    216
    B.7 電子書籍の管理―calibre 218
索引    221

オプション

本ツールのオプション引数は以下の通りです。

-h または --help:
ヘルプを表示します
-f <オフセット数> または --forwardpages=<オフセット数>:
アラビア数字で始まる本文ページの前にある前付けのページ数。 ローマ数字等で指定されたページがある場合、このオプションを指定することで、しおりのリンク先ページを正しく指定する事ができます。デフォルトは0です。
-l <見出しレベル> または --hidelevel=<見出しレベル>:
この階層より深い見出しは、折り畳まれて非表示になります。デフォルトは1です。
-i <埋め込み元PDF> または --input=<埋め込み元PDF>:
しおりの埋め込み対象となるPDFファイルを指定します。
-o <出力先PDF> または --output=<出力先PDF>:
しおりが埋め込まれたPDFファイルを指定します。既存のファイルが存在する場合も確認せず上書きします。

参考資料