きょう、ある本を自炊していて、頭から正順にスキャンしたPDFと、おしりから逆順にスキャンしたPDFを組み合わせて1つのPDFを作りたい! という状況に陥りました。もうちょっと詳しく言うと、偶数ページは頭から普通にスキャンしたPDFのを採用するんだけど、奇数ページだけは全部「おしりから逆順にスキャンしたPDF(の偶数ページ)」のやつに差し替えたい、という感じ。

なんでそんなややこしいことをするのかと言うと、自炊してた本がたまたま宇宙モノの画集だったから。ScanSnap S1500は(ウチの個体だけかもしれませんが)上面(ウラ面)と下面(オモテ面)のセンサーにけっこう画質の差があって、黒っぽいベタ塗りが多いページだと、上面でスキャンしたページの方が圧倒的に画質が良いんです。下面でスキャンしたページは、上部2cmぐらいが光が入ったように変色したり、中央付近に2本のローラー跡のようなスジが出たりしてイマイチ。あとこれはスキャナの構造上仕方ないとは思うんですが、下面は、本から出た粉っぽいゴミでカラーの縦スジが出てしまうことが多くて、今回の画集ではなぜかこれが盛大に発生。だったら、奇数ページも偶数ページも上面のスキャナで読み取った画像を採用すれば万事解決するじゃん! と思ったわけです。

で、いったん普通に頭からスキャンしたあとに、本をひっくり返して今度は最終ページから逆順でもう一度スキャン。これで奇数ページが上面でスキャンされたPDFが出来上がります。

しかしここで問題発生。一体これをどうやって1つのPDFに再編すれば良いのか……。最初は、Acrobatで正順PDFと逆順PDFをそれぞれ1ページずつに分割して、必要なページだけファイル名をリネームして正しい順番に並べ、もう一回Acrobatで1つのPDFにまとめようとしたんですが、なんせ300ページ近くある本なので、逆順のページから偶数番号だけ抜き出して正順の番号を振り直していくのは恐ろしく手間がかかるし、絶対どっかで間違うに決まってます。スプレッドシートで関数を使ってDOSのcopyコマンドを組み立てて、それをbatファイルにして実行して……、みたいなことも考えましたが、なんだかんだで面倒くさすぎ。

なんかもっと簡単に、こういう作業を手軽にやる方法はないものかと探してたら……、あったんです、この作業を一発でやる方法が。今までにもiPad3への最適化なんかで使ってたPDFtkを使えば、簡単なコマンド1つでできてしまうことが分かりました。すごい、すごすぎる!

その具体的なコマンドはこれ。ここでは、カレントディレクトリに正順のPDF(asc.pdf)と逆順のPDF(desc.pdf)があって、それを組み合わせて出力PDF(out.pdf)を作るものとします。

pdftk A=asc.pdf D=desc.pdf shuffle Dend-1even Aeven output out.pdf

いきなりこのコマンドラインを見てもなんのこっちゃ? という感じなので、備忘のため考え方をメモしておきます。

pdftkコマンドの基本的な構文はこんな感じ。

pdftk 入力ファイル名 操作 output 出力ファイル名

操作としてよく使うのはcatで、これは入力PDFを単純に結合します。例えば、

pdftk asc.pdf desc.pdf cat output out.pdf

とやると、asc.pdfのあとにdesc.pdfが追加されたPDF(out.pdf)が生成されます。

入力ファイルの指定には「ハンドル」をつけることもできます。たとえば次のように書くと、asc.pdfにはAというハンドルをつけ、desc.pdfにはDというハンドルをつけて、catの引数で「D A」の順番を指定しているので、上の例とは逆に、desc.pdfのあとにasc.pdfが追加されたPDFが生成されます。

pdftk A=asc.pdf D=desc.pdf cat D A output out.pdf

catの引数のハンドルには、後ろにページ指定を付加することもできます。「A1-20」ならAの1ページ目から20ページ目、「A200-end」ならAの200ページ目から最終ページ、「Ar2」なら最後から2ページ目、という具合です。また、「A20-1」のように開始ページの方が終了ページより大きい値を指定すると、20ページ目から1ページ目に向けて逆順で、という意味になります。次の例では、desc.pdfを逆順にしたものの後ろにasc.pdfを結合したPDFが生成されます。

pdftk A=asc.pdf D=desc.pdf cat Dend-1 A output out.pdf

さらに、catの引数でハンドルを指定するときには、evenをつけて偶数ページだけを取り出したり、oddをつけて奇数ページだけを取り出したりできます。次の例では、desc.pdfを逆順に並び替えて偶数ページだけを抜き出したものと、その後ろにasc.pdfの偶数ページだけを抜き出したものを結合したPDFが生成されます。

pdftk A=asc.pdf D=desc.pdf cat Dend-1even Aeven output out.pdf

ここで操作にcatではなくshuffleを指定すると、指定したハンドルから順繰りに1ページずつ取り出すようになります。従って、最初のコマンド

pdftk A=asc.pdf D=desc.pdf shuffle Dend-1even Aeven output out.pdf

により、desc.pdfを逆順に並び替えて偶数ページだけを抜き出したものと、asc.pdfの偶数ページだけ抜き出したものを「交互に」配置したPDFが出来上がることになります。

※バージョンメモ

  • pdftk-1.45