8.1.2 座標系の種類の変更

images/ShowCoordinateChange-top.png

狙い・効果

座標系の種類を変更してPDFの回転に対する座標軸の変化を確認します。

処理の概要

座標系の種類について、表示上の座標と、PDFユーザースペース座標から選択できます。表示上の座標を指定すると、ページが回転しているときに見えるままの座標を指定することでオブジェクトの挿入ができます。PDFユーザースペース座標を指定するとページを回転しているとき、座標軸は回転前の座標軸をページと一緒に回転させたものになり、つまり、回転したページに文字を書き込むと、回転した文字が書き込まれます。これにより、途中のページがユーザによって回転させられている可能性のあるPDFが与えられた場合や、PDFの表示上の回転に影響されずに動作するアプリケーションと連動させる場合に、複雑な計算抜きで対応できます。

デフォルトの座標系は表示上の座標が指定されています。

本サンプルプログラムでは、座標系の種類を設定した上で、入力PDFの1ページ目を右回りに90度回転させ、座標(50, 50)の位置にテキストを記入して表示の違いを確かめます。

PDF Tool APIの主な機能

プログラム例

package cookbook;

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


public class  ShowCoordinateChange{
    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.println("usage: java ShowCoordinateChange input-pdf-file out-pdf-file" +
                         " 座標系の種類");
        System.out.println("座標系の種類 : ");
        System.out.println("0: 表示上の座標(デフォルト値) " +
                           "1: PDFユーザースペース座標(ページに合わせて座標が回転する)");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 3) {
            printUsage();
            return;
        }

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

            //コマンドライン引数の読み取り
            int coordType = Integer.parseInt(args[2]);
            // 座標系の種類と例外処理
            switch(coordType) {
            case 0: //表示上の座標(デフォルト値)
                coordOption.setCood(PtlOption.COOD.COOD_VIEW);
                break;
            case 1: // PDFユーザースペース座標
                coordOption.setCood(PtlOption.COOD.COOD_USER);
                break;
            default:
                System.out.println("座標系の種類 は0か1で指定して下さい。");
                printUsage();
                return;
            }

            try (PtlPages pages = doc.getPages()) //ページコンテナの取得
            {
                // ページコンテナが空かどうか
                if (pages.isEmpty())
                {
                    System.err.println("ページコンテナが空");
                    return;
                }

                // ページの取得(パラメータindexは0が先頭のため1を引く)
                // ページコンテントの取得
                // 出力矩形の設定 左上が(50,50)になるよう初期化
                // 文字描画のパラメータクラス。今回は何も設定しない。
                try (PtlPage page = pages.get(0);
                     PtlContent content = page.getContent();
                     PtlRect outputRect = setRectTopLeft5050();
                     PtlParamWriteString plainParam = new PtlParamWriteString()) {
                    //回転角を90度に設定
                    page.setRotate(90);
                    // 文字列出力
                    content.writeString(outputRect, PtlContent.ALIGN.ALIGN_TOP_LEFT,
                                        "この文章の左上が現在の座標系の(50,50)です。",
                                        plainParam);
                }

            }

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

    public static PtlRect setRectTopLeft5050()
        throws PtlException, Exception, Error{
        PtlRect outputRect = new PtlRect();
        outputRect.setLeft(50);
        outputRect.setBottom(0);
        outputRect.setRight(100);
        outputRect.setTop(50);

        return outputRect;
    }
}

プログラムファイル名

ShowCoordinateChange.java

入出力操作の例

C:\samples>java cookbook.ShowCoordinateChange 
usage: java ShowCoordinateChange input-pdf-file out-pdf-file 座標系の種類座標系の種類 : 
0: 表示上の座標(デフォルト値) 1: PDFユーザースペース座標(ページに合わせて座標が回転する)

C:\samples>java cookbook.ShowCoordinateChange setopenmode.pdf showcoordinate-0.pdf 0 
-- 完了 --

C:\samples>java cookbook.ShowCoordinateChange setopenmode.pdf showcoordinate-1.pdf 1 
-- 完了 --

座標系の種類の変更