PDFの各ページを分割して組み直すスクリプト

目的

下のように、パワポのスライドが4枚印刷された資料が講義のレジュメとしてよく配られる。

--------
| 1  2 |
| 3  4 |
--------

これをスキャンして、スキャナ付属のソフト(Windows上)でPDFにしたのだが、Kindleでは読みにくいため下のように2つのPDFに分割したい。

-----  -----
| 1 |  | 3 |
| 2 |  | 4 |
-----  -----

方法

縦に半分に分割するだけなら簡単なのだが、それでは順番がおかしくなってしまうのが厄介。
pyPdfを使ってPDFのmediaboxあたりを弄ってどうにかしようとしたが上手くいかず。
そこで一度PDFから画像を抜き出し、imagemagickで処理して、再びPDFに戻すことにする。

スクリプト

#!/bin/sh
#
# version 1

# Create a working directory
src=$1
dest=out.pdf
date=`date +%y%m%d%H%M%S`
dir=/tmp/mypdf-$src-$date
mkdir $dir

# Split PDF to pbm images
pdfimages $src $dir/image
cd $dir

# Force images turn portrait
convert image* -rotate "-90<" rotated-%d.pbm
        
# Split each images to 4 images
for file in rotated-*
do
    convert $file -crop 50%x50% cropped-%d.pbm
    # Append each 2 images
    convert cropped-0.pbm cropped-1.pbm -append merged-$file-0.pbm
    convert cropped-2.pbm cropped-3.pbm -append merged-$file-1.pbm
    rm -f cropped-*
done

# Compress and merge all images to a PDF
convert merged-* -monochrome compressed-%d.png
cd - > /dev/null
convert $dir/compressed-* $dest

# Remove temporary directory/files
rm -rf $dir

結果

一応、目的のPDFは出来た。ビュアーで開いて見た限りでは画質の劣化はなし。ただし解像度は10倍近く大きい。
ファイルサイズも元のファイルの3倍くらいになってしまう。時間もかかるし、メモリも喰う。
これはPDFの画像がadobeの独自フォーマットになっているので、どうしようもないはず。Adobe Acrobatを買うか? バッチ処理とか出来るんだろうか。

PDFのメタデータを直接いじる方向ならあるいは…また気が向いたら調べるかも。