2010年9月5日日曜日

iTextを使ってPDFの拡大縮小配置

iTextを使ってPDFの縮小、移動などの方法は調べても書かれていそうで意外にもなかったりする。
チュートリアルを見てもアフィン変換を使ってうんぬん・・・と書かれていてさっぱり。(高校の数学で習うらしい)

しかし、JAVAや.netだとそのものずばりのクラスが用意されているので移動、拡大縮小、回転の計算が簡単にできたりします。

次のソースはPDF A4->B5に中央に縮小する例です。(ソースはC#)

using System;
using System.Drawing;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace ConsoleApplication1
{
    class Program
    {
        const float pt2mm = 72f / 25.4f;

        static void Main(string[] args)
        {
            string savePdf = "hogehoge.pdf";
            string loadPdf = "fugafuga.pdf";

            // 新しいPDFファイルの作成
            Document pDoc = new Document(PageSize.A4);
            PdfWriter pw = PdfWriter.GetInstance(pDoc, new System.IO.FileStream(savePdf, System.IO.FileMode.Create));
            pDoc.Open();
            PdfContentByte pcb = pw.DirectContent;
            pDoc.NewPage();

            // 既存PDF読み込む
            PdfReader pr = new PdfReader(loadPdf);
            PdfImportedPage page = pw.GetImportedPage(pr, 1);

            // B5サイズへ縮小
            System.Drawing.Drawing2D.Matrix mtx = new System.Drawing.Drawing2D.Matrix();
            mtx.Scale(0.84f, 0.84f);

            // 用紙中央に移動
            mtx.Translate(14 * pt2mm, 20 * pt2mm, System.Drawing.Drawing2D.MatrixOrder.Append);

            // 新しいPDFに貼り付け
            pcb.AddTemplate(page, mtx);

            pr.Close();
            pDoc.Close();
            pw.Close();
        }
    }
}

JAVAだとAffineTransformという命令を使えばいいらしい。