本当は怖いHPC

HPC屋の趣味&実益ブログ

目次のないPDFに目次を追加する

概要

目次の無いPDFに目次を追加する方法です。MacもしくはLinuxのコマンドラインツールgsを使い、そのツールへの入力をPythonで生成します。目次のデータ自体は、YAMLフォーマットで自分で用意します。

目的

例えば自炊したPDFには目次が含まれないため、読むときに不便です。この点、Kindleの書籍などとは雲泥の差があります。そこで、自分で目次を付与するスクリプトを作成しました。

実装

gs コマンドを使うと、PDFに目次を付与することができます。 具体的には、規定のフォーマット(慣習として pdfmarks と呼ばれる)を用意し、それを目的のPDFとともに gs コマンドに渡すことで実現できるようです。

入力する pdfmarks のフォーマットは、詳細は仕様書にありますが、概要としては以下のようにすれば良いようです。こちらのページから引用

[/Count 3 /Title (Chapter 1) /Page 1 /OUT pdfmark
[/Count -2 /Title (Section 1.1) /Page 2 /OUT pdfmark
[/Title (Section 1.1.1) /Page 3 /OUT pdfmark
[/Title (Section 1.1.2) /Page 4 /OUT pdfmark
[/Count -1 /Title (Section 1.2) /Page 5 /OUT pdfmark
[/Title (Section 1.2.1) /Page 6 /OUT pdfmark
[/Title (Section 1.3) /Page 7 /OUT pdfmark

これを手で書くのは骨が折れますので、現代的なフォーマットから生成できるように、スクリプトを作成します。ここではYAMLファイルを入力とします。具体的なデータ構造は適当に決めました。

コード

実際のスクリプトはここにあります。

Generate pdfmarks (TOC) file, to feed to gs command · GitHub

入力例

# Table of Contents from 「明解演習 数理統計 (明解演習シリーズ)」 by 小寺 平治
# https://www.kyoritsu-pub.co.jp/bookdetail/9784320013810

base_page: 9
toc: 
  - title: "第1章 確率"
    page: 1
    sub:
      - {"title": "順列 組み合わせ", "page": 1}
      - {"title": "確率とその声質", "page": 2}
      - {"title": "事象の独立性", "page": 5}
  - title: "第2章 確率変数"
    page: 26
    sub:
      - {"title": "2.1 確率変数 確率分布", "page": 26}
      - {"title": "2.2 多次元分布", "page": 27}
      - {"title": "2.3 確率変数の関数の分布", "page": 28}
      - {"title": "2.4 平均 分散", "page": 29}
      - {"title": "2.5 積率母関数", "page": 31}

このようなデータを用意し(手で作成)、スクリプトに食わせます。

$ python pdfmark.py --infile=pdfmarks.yaml --outfile=pdfmarks 
$ gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf in.pdf pdfmarks

日本語への対応

日本語へ対応するには、一工夫必要でした。PDFにおいてはマルチバイト文字などの文字列は PDFEncoding と呼ばれる方法によってエンコードされているので、これに従って文字列をエンコードする必要があります。これは、 pdfrw というライブラリを用いることで簡単に実現できました。

今後

目次情報は手動で作成しなければいけないので、今後はこれを自動で取得できるようにしたいと思います。

参考文献

【広告】