大量のPDFファイルを右綴じに変えたい

最近、スキャン対象が縦書きの本に突入してきた。右綴じにする方法がすごく大変。いちいちAcrobatのプロパティで変えるのはちょっと無理。

そこで、「pdf 綴じ方 変更」や「pdf 右綴じ scansnap」で探してみたが、定番のツールがあまりない。いくつかフリーソフトシェアウエアが見つかったがどれも怪しい。

結合にはUbuntu上で pdftk を使ったが、これにも右綴じにする方法はない。

いやいや、実はそんな大したことではないはずだろうと思ってPDFの仕様書を見てみる。

CatalogのViewerPreferencesにDirectionでR2Lを指定すればいいらしい。

いろいろ試した結果、iTextを使う方が楽そうだったのでJavaで。R2Lにするのは実質3行。

import java.io.File;
import java.io.FileOutputStream;
import com.itextpdf.text.pdf.*;

public class MainApp {

    public static final void main(final String[] args) {
        if (args == null || args.length == 0) {
            System.out.println("Usage > java -jar pdfr2l.jar (files)...");
        } else {
            for (String i : args) {
                try {
                    System.out.print("Prcessing : "+i);
                    doIt(i);
                    System.out.println(" OK");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static final String tmpFilename = "_tmp.pdf";

    private static void doIt(String file) throws Exception { 
        File orgFile = new File(file);
        File tmpFile = new File(tmpFilename);
        //右綴じのコード
        PdfStamper st = new PdfStamper(new PdfReader(file),new FileOutputStream(tmpFile));
        st.addViewerPreference(PdfName.DIRECTION, PdfName.R2L);
        st.close();
        //ここまで
        
        if (!tmpFile.exists()) {
            throw new RuntimeException("Can not generate a PDF : "+file);
        }
        if (!orgFile.delete()) {
            throw new RuntimeException("Can not delete the original PDF file : "+file);
        }
        if (!tmpFile.renameTo(orgFile)) {
            throw new RuntimeException("Can not rename the generated PDF file : "+file+" <- "+tmpFilename);
        }
    }
}

iTextのjarと一緒にコンパイルしてjarにして使ってる。pdftkみたいにgcjでバイナリにするともっと使いやすそう。

既存のPDFに何かちょっとした変更を加えるのは PdfStamper を使うよう。Stampだけでなくて、ページを追加したり結構いろいろ出来る。

PDFやるのならiTextで決まりなんだけど、歴史が長い分ちょっとドキュメントが古いところがある。