iText で大量の PDF をマージする

Java コードから PDF を取り扱う際には iText が便利で、Java公用語の皆様はよく利用されていることでしょう。
PDF を結合して新たな PDF を作るには PdfCopy を利用するのが簡単です。しかし、大量の PDF を結合していくと、すぐに OutOfMemoryError が発生してしまいます。ここでいう「大量の PDF」というのは、具体的には結合後の PDF ファイルサイズが 500MB を超えるとか、そういったスケールを想定してください。これは、PdfReader が読み込んだ PDF データをメモリー上に保持しているためにヒープを大量に消費し、結果として OutOfMemoryError を誘発する、ということのようです。
対策方法はないかと調べたところ、PdfReader クラスのコンストラクター

public PdfReader(RandomAccessFileOrArray raf, byte ownerPassword[])

を利用すればよいことが分かりました*1。このコンストラクターを使用して PdfReader インスタンスを生成すると、PdfReader は pertial mode というモードで動作します。このモードでは、全体を読み込まずに、必要なページを部分的に読み込みます。具体的なコードは以下の snippet を読んでください。

なお、この方法で PDF を結合する場合でも、ある程度のメモリーを消費します。私の環境では、1ファイルあたりのサイズが 250KB の PDF ファイルを 5000 件結合して、ヒープの消費量は 150MB 程度でした。