PDF BOXで任意の場所にOverlayする
最近、PDFをプログラムからいじいじしてます。
使用言語はKotlinで、ApachのPdfBoxを使ってます。
その中で、PDFとPDF同士を合成したいという要件あったんです。
どう実装しようかと、わーとドキュメント見るとOverlay
ってクラスあるじゃん、これで合成できる!
と思ってたんですが、よくよく見るとsetOverlayPosition(Overlay.Position overlayPosition)
となっていて、 Overlay.Position
も定数だぞ??
どうやって位置指定するんだ?となったので、その方法を残しときます。
Overlay Class
を継承して、calculateAffineTransform
をOverrideしたクラスを作るです。
calculateAffineTransform
の実装を見てみると
protected AffineTransform calculateAffineTransform(PDPage page, PDRectangle overlayMediaBox) { AffineTransform at = new AffineTransform(); PDRectangle pageMediaBox = page.getMediaBox(); float hShift = (pageMediaBox.getWidth() - overlayMediaBox.getWidth()) / 2.0F; float vShift = (pageMediaBox.getHeight() - overlayMediaBox.getHeight()) / 2.0F; at.translate((double)hShift, (double)vShift); return at; }
AffineTransform
を生成して、ページの中央に配置するという処理が入っているのがわかるかと思います。
このAffine変換を独自で実装するとPDFを任意の場所に配置できるってことですね。