5.1.1 PDFを開いた時の動作

images/SetOpenAction-top.png

狙い・効果

PDFを開いたときの動作を指定します。

処理の概要

PDFを開いた時のアクションまたは移動先(ページ、位置、倍率)を指定します。これにより、PDFを開いたときに特定のページの特定の位置だけを拡大するように指定したり、開いた際のアクションを指定できます。指定できるアクション及び宛先の型についての詳細は「1.1.4 リンク注釈の追加」を参照してください。PDFを開いた時の移動先の指定方法について、アクションを指定する関数でGoToアクションを指定する方法、移動先を指定する関数を用いる方法の両方がありますが、出力PDFには後に設定した方の宛先が反映されます。

本サンプルプログラムでは、入力PDFにPDFを開いた際の移動先(ページ、位置、倍率)を設定したものを出力します。「移動先の型、ページ、topの値、leftの値、bottomの値、rightの値、倍率」を引数で指定します。引数で指定したtop、left、bottom、rightの値と倍率のうち、移動先の型で使用するものだけを読み取り、残りは読み飛ばされます。

PDF Tool APIの主な機能

以下のサブクラスがあります。宛先の型についての詳細は、表1・5 宛先の型を参照してください。

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class SetOpenAction {

    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.print("usage: java SetOpenAction in-pdf-file out-pdf-file");
        System.out.println(" ページ表示の種類 開くページ [top left bottom right zoom]");
        System.out.println("ページ表示の種類: ");
        System.out.println("0 : Fit型 ページ全体がウィンドウに収まるように表示する");
        System.out.println("1 : FitB型 境界ボックス全体がウィンドウに収まるように表示する");
        System.out.println("2 : FitBH型 topを指定し、" +
                           "境界ボックスの幅がウィンドウに収まるように表示する");
        System.out.println("3 : FitBV型 leftを指定し、" +
                           "境界ボックスの高さがウィンドウに収まるように表示する");
        System.out.println("4 : FitH型 topを指定し、" +
                           "ページの幅がウィンドウに収まるように表示する");
        System.out.println("5 : FitR型 top, left, bottom, rightを指定し、" +
                           "指定した範囲がウィンドウに収まるように表示する");
        System.out.println("6 : FitV型 leftを指定し、" +
                           "ページの幅がウィンドウに収まるように表示する");
        System.out.println("7 : XYZ型 top, left, zoomを指定し、" +
                           "ウィンドウ左上が指定したページ座標になるようにして" +
                           "指定したzoom率で表示する");
        System.out.println("※ : top, left, bottom, right, zoomに関しては" +
                           "ページ表示の種類によって不要な項目は読み飛ばされます。");
        System.out.println("例えば、FitV型を指定してleftの値だけを指定する場合は" +
                           "topから順に\ "0 15\ "、XYZ型を指定してzoomの値を設定する場合は" +
                           "topから順に \ "100 15 0 0 1.2\ "のように" +
                           "読み飛ばす部分に仮の値を挿入してください。)");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 4) {
            printUsage();
            return;
        }
        // コマンドライン引数の読み取り
        int page = Integer.parseInt(args[3]);
        float top = Float.parseFloat(args[4]);
        float left = Float.parseFloat(args[5]);
        float bottom = Float.parseFloat(args[6]);
        float right = Float.parseFloat(args[7]);
        float zoom = Float.parseFloat(args[8]);

        //ページ表示の種類が誤った数値だった場合に停止する。
        int destType = Integer.parseInt(args[2]);
        if (destType < 0 || 7 < destType){
            System.out.println("ページ表示の種類は0~7の数値で指定して下さい。");
            printUsage();
            return;
        }

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

            try (PtlDocProperty docProperty = doc.getDocProperty();  // PDFの文書プロパティ
                 PtlOpenMode openmode = docProperty.getOpenMode()) { // 開き方の取得

                // ページモードの設定 ページレイアウトの設定
                // 各オープンアクションの設定
                if(destType == 0){ //Fit型
                    try (PtlActionGoTo act = new PtlActionGoTo(); // 設定するGoToアクション
                         PtlDestFit dst = new PtlDestFit()) {   // PDFの宛先
                        // 宛先ページの設定
                        // 最初に開くページを設定(ページ番号は0ベース)
                        dst.setPageNumber(page);
                        // 宛先をGoToActionに設定
                        act.setDest(dst);
                        openmode.setOpenAction(act);
                    }
                }
                if(destType == 1){ //FitB型
                    try (PtlActionGoTo act = new PtlActionGoTo(); // 設定するGoToアクション
                         PtlDestFitB dst = new PtlDestFitB()) {   // PDFの宛先
                        // 宛先ページの設定
                        // 最初に開くページを設定(ページ番号は0ベース)
                        dst.setPageNumber(page);
                        // 宛先をGoToActionに設定
                        act.setDest(dst);
                        openmode.setOpenAction(act);
                    }
                }
                if(destType == 2){ //FitBH型
                    try (PtlActionGoTo act = new PtlActionGoTo(); // 設定するGoToアクション
                         PtlDestFitBH dst = new PtlDestFitBH()) {   // PDFの宛先
                        // 宛先ページの設定
                        // 最初に開くページを設定(ページ番号は0ベース)
                        dst.setPageNumber(page);
                        // 開く座標の設定
                        // topの設定
                        dst.setTop(top);
                        // 宛先をGoToActionに設定
                        act.setDest(dst);
                        openmode.setOpenAction(act);
                    }
                }
                if(destType == 3){ //FitBV型
                    try (PtlActionGoTo act = new PtlActionGoTo(); // 設定するGoToアクション
                         PtlDestFitBV dst = new PtlDestFitBV()) {   // PDFの宛先
                        // 宛先ページの設定
                        // 最初に開くページを設定(ページ番号は0ベース)
                        dst.setPageNumber(page);
                        // 開く座標の設定
                        // leftの設定
                        dst.setLeft(left);
                        // 宛先をGoToActionに設定
                        act.setDest(dst);
                        openmode.setOpenAction(act);
                    }
                }
                if(destType == 4){ //FitH型
                    try (PtlActionGoTo act = new PtlActionGoTo(); // 設定するGoToアクション
                         PtlDestFitH dst = new PtlDestFitH()) {   // PDFの宛先
                        // 宛先ページの設定
                        // 最初に開くページを設定(ページ番号は0ベース)
                        dst.setPageNumber(page);
                        // 開く座標の設定
                        // topの設定
                        dst.setTop(top);
                        // 宛先をGoToActionに設定
                        act.setDest(dst);
                        openmode.setOpenAction(act);
                    }
                }
                if(destType == 5){ //FitR型
                    try (PtlActionGoTo act = new PtlActionGoTo(); // 設定するGoToアクション
                         PtlDestFitR dst = new PtlDestFitR()) {   // PDFの宛先
                        // 宛先ページの設定
                        // 最初に開くページを設定(ページ番号は0ベース)
                        dst.setPageNumber(page);
                        // 開く座標の設定
                        // topの設定
                        dst.setTop(top);
                        // leftの設定
                        dst.setLeft(left);
                        // bottomの設定
                        dst.setBottom(bottom);
                        // rightの設定
                        dst.setRight(right);
                        // 宛先をGoToActionに設定
                        act.setDest(dst);
                        openmode.setOpenAction(act);
                    }
                }
                if(destType == 6){ //FitV型
                    try (PtlActionGoTo act = new PtlActionGoTo(); // 設定するGoToアクション
                         PtlDestFitV dst = new PtlDestFitV()) {   // PDFの宛先
                        // 宛先ページの設定
                        // 最初に開くページを設定(ページ番号は0ベース)
                        dst.setPageNumber(page);
                        // 開く座標の設定
                        // leftの設定
                        dst.setLeft(left);
                        // 宛先をGoToActionに設定
                        act.setDest(dst);
                        openmode.setOpenAction(act);
                    }
                }
                if(destType == 7){ //XYZ型
                    try (PtlActionGoTo act = new PtlActionGoTo(); // 設定するGoToアクション
                         PtlDestXYZ dst = new PtlDestXYZ()) {   // PDFの宛先
                        // 宛先ページの設定
                        // 最初に開くページを設定(ページ番号は0ベース)
                        dst.setPageNumber(page);
                        // 開く座標の設定
                        // leftの設定
                        dst.setLeft(left);
                        // topの設定
                        dst.setTop(top);
                        //dst.setTopNull();
                        // zoomの設定
                        dst.setZoom(zoom);
                        //dst.setZoomNull();
                        // 宛先をGoToActionに設定
                        act.setDest(dst);
                        openmode.setOpenAction(act);
                    }
                }
                /*----- 開き方のデフォルト設定 -----*/
                // ページモードの設定 PAGE_MODE_USE_THUMBS = 3  サムネイルパネルとページ
                openmode.setPageMode(PtlOpenMode.PAGE_MODE.PAGE_MODE_USE_THUMBS);

                // ページレイアウトの設定 PAGE_LAYOUT_ONE_COLUMN = 2 /* 連続ページ */
                openmode.setPageLayout(PtlOpenMode.PAGE_LAYOUT.PAGE_LAYOUT_ONE_COLUMN);
                // ユーザーインターフェイスオプションを設定(論理和)
                // UI_OPTION_HIDE_WINDOWUI = 0x00000004
                /* ウインドウコントロールを非表示 */
                openmode.setUIOption(PtlOpenMode.UI_OPTION_HIDE_WINDOWUI);

                // ウインドウオプションを設定(論理和)
                // WINDOWS_OPTION_FIT_WINDOW = 0x00000001,
                /* ページにウィンドウサイズを合あわせる */
                // WINDOWS_OPTION_CENTER_WINDOW = 0x00000002,
                /* ウィンドウを画面中央に配置 */
                openmode.setWindowOption(PtlOpenMode.WINDOWS_OPTION_FIT_WINDOW
                    |PtlOpenMode.WINDOWS_OPTION_CENTER_WINDOW);

                // ウィンドウのタイトルバーに文書タイトルを表示するかどうか設定
                //(true: 非表示、false: 表示)
                openmode.setDisplayDocTitle(true);

                // 読み上げオプション設定 DIRECTION_R2L = 2
                /* 右から左(中国語、日本語、韓国語のような縦書きも含む)    */
                docProperty.setDirection(PtlDocProperty.DIRECTION.DIRECTION_R2L);
                /*----- 以上、ここまでが開き方のデフォルト設定 -----*/

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

プログラムファイル名

SetOpenAction.java

入出力操作の例

C:\samples>java cookbook.SetOpenAction 
usage: java SetOpenAction in-pdf-file out-pdf-file ページ表示の種類 開くページ [top left bottom right zoom]
ページ表示の種類: 
0 : Fit型 ページ全体がウィンドウに収まるように表示する
1 : FitB型 境界ボックス全体がウィンドウに収まるように表示する
2 : FitBH型 topを指定し、境界ボックスの幅がウィンドウに収まるように表示する
3 : FitBV型 leftを指定し、境界ボックスの高さがウィンドウに収まるように表示する
4 : FitH型 topを指定し、ページの幅がウィンドウに収まるように表示する
5 : FitR型 top, left, bottom, rightを指定し、指定した範囲がウィンドウに収まるように表示する
6 : FitV型 leftを指定し、ページの幅がウィンドウに収まるように表示する
7 : XYZ型 top, left, zoomを指定し、ウィンドウ左上が指定したページ座標になるようにして指定したzoom率で表示する
※ : top, left, bottom, right, zoomに関してはページ表示の種類によって不要な項目は読み飛ばされます。
例えば、FitV型を指定してleftの値だけを指定する場合はtopから順に"0 15"、XYZ型を指定してzoomの値を設定する場合はtopから順に "100 15 0 0 1.2"のように読み飛ばす部分に仮の値を挿入してください。)

C:\samples>java cookbook.SetOpenAction thepdf4.pdf thepdf4-openact0.pdf 0 23 200 20 50 91 200 
-- 完了 --

C:\samples>java cookbook.SetOpenAction thepdf4.pdf thepdf4-openact7.pdf 7 23 200 20 50 91 50 
-- 完了 --

C:\samples>java cookbook.SetOpenAction thepdf4.pdf thepdf4-openact71.pdf 7 23 200 20 50 91 200 
-- 完了 --

次図は左から、0:Fit型、7:XYZ型でズーム50%、7:XYZ型でズーム200%を設定したPDFを開いたところです。

PDFを開いた時の動作