片面スキャンしたPDFのページを並び替える
我が家のScanSnap S1500はちょっと調子が悪く、ときどき裏面の真ん中よりすこし左に緑の縦線が入ります。これはヘッドのガラス面の汚れとは関係ないようで、どれほど念入りに掃除してもその線だけは消えないし、かと思うと何もしてないのにいきなり消えたりします。出現率は2分の1ぐらいですが、いったん出だすと消す手段がありません。要はヤツの機嫌次第です。普段はその線が出だすとそこで作業を諦めたりします。
しかし先日、どうしても急ぎでPDF化したい本があるときにこの線が出たため、やむなく片面スキャンで対処することにしました。つまり、最初に奇数ページだけをスキャンし、次にひっくり返して偶数ページだけをスキャンし、最後にページを並べなおすという方法です。手間はかかりますが、緑の線を消す手段が無いためやむを得ません。
ただ、片面スキャンした場合、前半は奇数ページが1ページ飛び、後半は偶数ページが1ページ飛びかつ「逆順」になっているため、ドラッグ&ドロップなどでページを並び替えるのはあまりにも大変です。たとえば10ページの本だとすると、
p1
p3
p5
p7
p9
p10
p8
p6
p4
p2
のように並んでいるため、これをもとに戻すのは意外に面倒です。300ページだと、気が遠くなります。
そこで何とか並び替えを自動化できないかと無い知恵を絞った結果、Acrobatで1ページごとに分割したPDFをRubyスクリプトで並べ直し、ふたたび結合することにしました。手順としては、こんな感じです。
- 片面スキャンの設定で、奇数ページ、偶数ページの順にスキャン
- Acrobatの「文書」→「文書の分割」で、1ページごとに分割
これで「○○_Part1.pdf」「○○_Part2.pdf」……のように分割されます - Rubyスクリプトで、ファイル名に本来のページ番号つけたファイルを生成
これで「○○_p0001.pdf」「○○_p0002.pdf」……のようなファイルを作ります。数字は本来のページ番号です。 - できたファイルをエクスプローラーで複数選択し、右クリックで「サポートしているファイルをAcrobatで結合」
これで無事、元のページ順に並んだPDFを作ることができました。
(2013年5月18日追記: もしPDFtkが使える環境なら、「自炊に便利なPDFtkの使い方」の方が簡単です。)
参考までに、3.で使ったRubyスクリプトを載せておきます。分割したPDFと同じディレクトリにこのスクリプトを置いて実行すると、同じディレクトリにリネーム後のファイルができます。
# ファイルのコピーにFileUtils#cpを使うため、ライブラリを読み込んでおく。
require 'fileutils'
# 「○○_Part10.pdf」みたいなファイル名のPDFの数が、
# 全体のページ数であるとみなす。
max = Dir.glob('*_Part*.pdf').size
# 偶数ページの最初のPart番号を求めておく。
half = max / 2 + 1
# Part1から最終Partまで順番に処理していく。
for i in 1 .. max
if i < half
# 最初の半分は奇数ページ。
# Part番号から1引いて0オリジンにしたあと、2ページ間隔にして、
# 最後に1足して1オリジンに戻すと、それが本当のページ番号。
page = (i - 1) * 2 + 1
else
# 後半の半分は偶数ページ。
# Part番号から偶数ページの最初のPart番号を引いて0オリジンにしたあと、
# それを2ページ間隔にして、最大ページ数から引いて逆順にしてやると、
# それが本当のページ番号。
page = max - (i - half) * 2
end
# ページ番号にリーディング0を足して4桁にそろえる。
page = sprintf("%04d", page)
# 元のPDF名を取得する。
src = Dir.glob("*_Part#{i}.pdf")[0]
# 「_Part1.pdf」の部分を「_p0001.pdf」に置換して、
# コピー先のファイル名を組み立てる。
dest = src.sub(/_Part\d+\.pdf$/, "_p#{page}.pdf")
# ファイルをコピーする。
puts "#{src} => #{dest}"
FileUtils.cp(src, dest)
end
※バージョンメモ
- Windows 7 Professional Service Pack 1
- Adobe Acrobat 9 Standard v9.4.6
- Ruby 1.8.7 (2011-06-30 patchlevel 352)