先日の記事 に載せた画像の作り方を書く。
- 複数の PDF 形式の電子書籍から、表紙 (1 ページ目) を抽出し
- 画像に変換し
- タイル状に並べる
(1) ~ (3) のすべてをコマンドラインツールで行った。 使ったコマンドは pdftk
と magick
。
カレントディレクトリに ebook1.pdf
, ebook2.pdf
, ebook3.pdf
, ebook4.pdf
があるとして説明する。
1. PDF の 1 ページ目を抽出する
pdftk
を使う。
$ pdftk ebook1.pdf cat 1-1 output cover1.pdf
cat 1-1
で範囲 (1 ページ目から 1 ページ目まで) を指定していて、output cover1.pdf
で出力するファイル名を指定している。
これを ebook2.pdf
, ebook3.pdf
, ebook4.pdf
に対しても行う。 こうした処理は parallel
コマンドを使うと手早くできる:
$ ls ebook*.pdf
ebook1.pdf ebook2.pdf ebook3.pdf ebook4.pdf
$ parallel pdftk "ebook{}.pdf" cat 1-1 output "cover{}.pdf" ::: 1 2 3 4
上の例では、以下の 4 つのコマンドを並列に実行している:
$ pdftk ebook1.pdf cat 1-1 output cover1.pdf
$ pdftk ebook2.pdf cat 1-1 output cover2.pdf
$ pdftk ebook3.pdf cat 1-1 output cover3.pdf
$ pdftk ebook4.pdf cat 1-1 output cover4.pdf
2. 抽出した PDF を画像に変換する
magick
を使って PDF を PNG 形式の画像に変換する。
$ magick cover1.pdf cover1.png
ここでも parallel
が便利だ:
$ ls cover*.pdf
cover1.pdf cover2.pdf cover3.pdf cover4.pdf
$ parallel magick cover{}.pdf cover{}.png ::: 1 2 3 4
3. 画像をタイル状に並べる
magick
を使う。 複数の画像を結合させるには、水平方向ならば +append
、垂直方向ならば -append
を使う。 ここではすべての画像を水平方向に (横一列に) 並べている。
$ magick cover*.png +append tiled.png
ワイルドカード (*
) を使って複数のファイルを指定すると名前でソートされるため、上の例では 1~4 の順で並んだ画像が出力される。 名前とは異なる順序で並べる場合は、その順でファイル名を指定すれば良い。
ex) 3 → 1 → 4 → 2 と並べる:
$ magick cover3.png cover1.png cover4.png cover2.png +append tiled.png