10.5.2 角度設定(PDFのページ貼り付け)

AddPdfOnPageSetAngle_Top

狙い・効果

角度指定PDFのページを他のPDFに貼り付ける際に任意の角度を指定します。

処理の概要

PDF文書のページを他のPDF文書のページに貼り付けて描画する際に任意の角度をつけることができます。角度は度数法の数値で指定し、反時計回りに回転します。(PDFページの貼り付けに関する詳細及びその他の機能は「『PDF CookBook』(第1巻)2.3 PDFページを描画」の各項を参照してください)

サンプルプログラムでは、入力PDFに指定したPDFの指定したページを挿入します。このとき、引数で指定した角度に傾けて挿入します。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

import java.io.*;
import jp.co.antenna.ptl.*;


public class AddPdfOnPageSetAngle {
    // そのクラスのusageを表示する関数
    public static void printUsage() {
        System.out.print("usage: java AddForm in-pdf-file out-pdf-file");
        System.out.println("page-num insert-pdf-file insert-page-num align angle");
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 7) {
            printUsage(); // usageメッセージの表示
            return;
        }

        try (PtlParamInput inputFile = new PtlParamInput(args[0]);
             PtlParamOutput outputFile = new PtlParamOutput(args[1]);
             PtlPDFDocument doc = new PtlPDFDocument();
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            // PDFファイルをロードします。
            doc.load(inputFile);

            //コマンドライン引数の取得
            int pageToAdd = Integer.parseInt(args[2]);
            String insertPdfURI = args[3];
            int insertPageNum = Integer.parseInt(args[4]);
            String align = args[5];
            float angle = Float.parseFloat(args[6]);
            // pageToAddの判定
            int numPages = doc.getPageCount();
            System.out.println("ページ数:" + numPages);
            if((numPages < 0)||(numPages < pageToAdd)) {
                System.err.println("page-numは入力PDFの全ページ数よりも小さい正の値を" +
                                   "指定してください。");
                printUsage();
                return;
            }


            try (PtlPages pages = doc.getPages()) { // ページコンテナの取得
                // ページコンテナが空かどうか
                if (pages.isEmpty()) {
                    System.out.println("ページコンテナが空");
                    return;
                }
                // 書き込み先ページを取得(パラメータindexは0が先頭のため1を引く)
                try (PtlPage page = pages.get(pageToAdd - 1)) {
                    //フォーム(PDFのページ)の描画
                    drawFormSetAngle(page, insertPdfURI, insertPageNum, align, angle,  br);
                }
            }

            // ファイルに保存します。
            doc.save(outputFile);
        }
	...【GetPDFVersion.javaと同じ処理のため省略
	   ・エラーメッセージ処理と出力】...
    }

    public static void drawFormSetAngle(PtlPage page, String insertPdfURI,
                                        int insertPageNum, String align, float angle,
                                        BufferedReader br)
                       throws PtlException, Exception, Error {
        try(PtlContent content = page.getContent();// 挿入先ページコンテントの取得
            PtlParamInput insertPdf = new PtlParamInput(insertPdfURI); // 挿入PDF指定に使うパラメータクラス
            PtlPDFDocument docToInsert = new PtlPDFDocument(); // 挿入PDFの実体
            PtlRect outputRect = new PtlRect()) {// 出力矩形の設定(setOutputRectを用いて初期化)
            docToInsert.load(insertPdf);
            int numPages = docToInsert.getPageCount();
            if((numPages < 0)||(numPages < insertPageNum)) {
                System.err.println("insert-page-numは挿入するPDFの全ページ数よりも小さい正の値を指定してください。");
                System.out.println("挿入PDFページ数:" + numPages);
                return;
            }

            try(PtlPages pagesToInsert = docToInsert.getPages();
                PtlPage pageToInsert = pagesToInsert.get(insertPageNum - 1);
                PtlParamDrawForm formInsert = new PtlParamDrawForm()) {
                try {
                    // ページの取得(パラメータindexは0が先頭のため1を引く)
                    formInsert.setPage(pageToInsert);
                    formInsert.setAngle(angle);
                    // 指定ページの挿入
                    content.drawForm(setRectCoordinate(br,outputRect), PtlContent.ALIGN.valueOf(align), formInsert);
                }
                catch (IllegalArgumentException ex) {//PtlContent.ALIGNの指定が誤っていた場合のエラーメッセージ
                    System.out.println(ex.getMessage());
                    System.out.println("ERROR : alignにはPtlContent.ALIGNに含まれる名前を指定してください。");
                    ex.printStackTrace();
                }
            }
        }
    }

    public static PtlRect setRectCoordinate(BufferedReader br, PtlRect outputRect)
                          throws IOException, PtlException, Exception, Error {
        float top, bottom, left, right;
        boolean isValueOkay = false;
        while(!isValueOkay) {
            System.out.println("配置矩形の各数値を入力してください。");
            System.out.print("top (mm) : ");
            top = Float.parseFloat(br.readLine());
            System.out.print("bottom (mm) : ");
            bottom = Float.parseFloat(br.readLine());
            if(top < bottom) //不正矩形は再入力させる
            {
                System.out.println("topの値はbottomよりも大きい値を指定して再度入力してください。");
                continue;
            }
            System.out.print("left (mm) : ");
            left = Float.parseFloat(br.readLine());
            System.out.print("right (mm) : ");
            right = Float.parseFloat(br.readLine());
            if(right < left) //不正矩形は再入力させる
            {
                System.out.println("rightの値はleftよりも大きい値を指定して再度入力してください。");
                continue;
            }

            //矩形を正しく指定できた場合の処理
            isValueOkay = true;
            outputRect.setLeft(left);
            outputRect.setBottom(bottom);
            outputRect.setRight(right);
            outputRect.setTop(top);
        }
        return outputRect;
    }
}

プログラムファイル名

AddPdfOnPageSetAngle.java

入出力操作の例

C:\samples>java cookbook.AddPdfOnPageSetAngle 
usage: java AddForm in-pdf-file out-pdf-filepage-num insert-pdf-file insert-page-num align angle

C:\samples>java cookbook.AddPdfOnPageSetAngle novelText.pdf Output_AddPdfOnPageSetAngle.pdf 1 AHLogo.pdf 1 ALIGN_CENTER 45 
ページ数:2
指定する矩形の各数値を入力してください。
top (mm) : 250
bottom (mm) : 10
left (mm) : 10
right (mm) : 190
-- 完了 --

この操作例では左下頂点(10mm, 10mm)、右上頂点(250mm, 190mm)の矩形に45度傾けたPDFページが挿入されます。

挿入されるPDFページはアンテナハウスロゴのベクター画像です。

5-10-5-2_AddPdfOnPageSetAngle

図10.8 45度の傾きをつけてPDFのページが挿入された例