Tech Nuggets (15)

電子書籍の表紙を並べて一枚の画像にする

Posted:

先日の記事 に載せた画像の作り方を書く。

  1. 複数の PDF 形式の電子書籍から、表紙 (1 ページ目) を抽出し
  2. 画像に変換し
  3. タイル状に並べる

(1) ~ (3) のすべてをコマンドラインツールで行った。 使ったコマンドは pdftkmagick

カレントディレクトリに 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