PDFを1つのPDFにしたい、更に2in1にしたい(Java)

ざっくりやりたいこと

色んなファイル形式で作った資料をまとめて印刷したいです。
保存するのに面倒だから印刷した紙のサイズは統一したい。

試行錯誤の結果

資料はWordだったりExcelだったりPowerPointだったりするけどPDFに統一。
さらに1つのPDFにまとめた。(PDFSAMを愛用している)

困っていること

資料によって大きさが違うんですよねー
A4の資料とA3の資料があると一度には印刷できない。
いや、できるけど結局印刷された紙がA4だったりA3だったりするわけで(当然だけど)面倒。

理想型

  • 紙のサイズは大きい方に合わせてA3にする
  • A3はそのままA3サイズとして印刷する
  • A4は縮尺は変えずにA3に2枚並べて印刷する

つまり、こんな感じ。
f:id:vostochnaya:20140601212515p:plain
p.1とp.2はA4、p.3はA3のPDFがある。
これをp.1とp.2を並べて1枚のA3にしたページと元のp.3で2枚のA3資料にしたい。

作ってみた

iText 5.5.0 を使用。 iText, Programmable PDF software | iText Software

A4 2ページをA3 1ページにするにはこんな感じ。
偶数の時に改ページせずに隣に並べるという荒技。
ちゃんとするならもう少しマシな判定を書く必要がある。

ここまでできたらA3の時はそのままとか追加して完成。

さらなる進化

人間欲しいものを手にすると更に良いものが欲しくなるもので…
縦と横も自動で判別してとりあえず全部A3にしてくれよ! と思ったりするのです。

縦向きと横向きが混ざってたりするとRotateする必要があります。
そうなるとaddTemplateの引数が厄介。説明してるところがあまり見つからない。
ただの90度回転ならともかく縮尺が1倍じゃなかったりすると途端に面倒になる。
こちらiText Tutorialに細かい仕様が載っているので助かりました。

また、同じ横向きでもPDFを作成するときに横向きだったものと、PDFSAMなどで回転したものはプロパティが異なるため注意が必要。
Adobe Readerで見ると違いが分からないから上手くいったりいかなかったりで嵌った。
例1)A3横の資料を作ってPDF保存 → PdfReader#getPageRotation = 0
例2)A3縦の資料を作ってPDF保存、PDFSAMで横向きに回転 → PdfReader#getPageRotation = 270

結論

資料は最初から印刷のことも考えて作るべき。