1.1.4 リンク注釈の追加

images/AppendAnnotLink-top.png

狙い・効果

リンク注釈を挿入し、アクションを指定します。

処理の概要

リンク注釈には、リンクをアクティブにしたときのアクションまたは移動先を指定します。リンク注釈ではアクションを指定しないで移動先のみの指定もできます。ここではアクションを設定する例を示します。PDF Tool API V6ではPDF がサポートする標準アクションのうち、GoToアクション、GoToRアクション、Launchアクション、URIアクションを指定できます。

表1・4 PDF Tool API がサポートするアクション
GoToアクション
同一PDF内の指定された宛先(ページ、位置、および倍率)へ移動します
GoToRアクション
異なるPDF内の指定された宛先(ページ、位置、および倍率)へ移動します
Launchアクション
アプリケーションの起動。通常はドキュメントのオープン、印刷です
URIアクション
指定したURI(通常はインターネット上のハイパーテキストリンクを指す)を開きます

GoToアクションやGoToRアクションを指定するとき、その移動先(ページ、位置、及び倍率)を同時に指定します。位置や倍率のパラメータは宛先の型に応じて変わります。具体的な指定方法については「5.1.1 PDFを開いた時の動作」のサンプルプログラムを参照してください。

表1・5 宛先の型
Fit型 ページ全体がウィンドウにちょうど収まる倍率で表示します
FitB型 境界ボックス(ページの内容をすべて包含する最小の矩形)全体がウィンドウにちょうど収まる倍率で表示します
FitBH型 topで指定された座標がウィンドウの上端になり、境界ボックスの幅がウィンドウにちょうど収まる倍率で表示します
FitBV型 leftで指定された座標がウィンドウの左端になり、境界ボックスの高さがウィンドウにちょうど収まる倍率で表示します
FitH型 topで指定された座標がウィンドウの上端になり、ページ全体の幅がウィンドウにちょうど収まる倍率で表示します
FitR型 top, left, bottom, rightで指定された座標がウィンドウにちょうど収まる倍率で表示します
FitV型 leftで指定された座標がウィンドウの左端になり、ページ全体の高さがウィンドウに収まるように表示します
FitXYZ型 top, leftで指定された座標がウィンドウの左上隅になり、zoomで指定した倍率に拡大して表示します

本サンプルプログラムでは、入力PDFの1ページ目に指定した種類のリンク注釈を挿入します。リンク注釈の内容はそれぞれプログラム内部であらかじめファイル名・URLを記述しています。Launchアクション、GoToRアクションの場合は実行フォルダ直下にあることを想定した仮のファイル名を指定してあり、URIアクションの場合はアンテナハウス社ホームページのURLを指定してあります。

PDF Tool APIの主な機能

以下のサブクラスがあり、実際にはこちらを用います。

プログラム例

package cookbook;

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

public class AppendAnnotLink {
    // そのクラスのusageを表示する関数
    private static void printUsage(){
        System.out.print("usage: java AppendAnnotLink in-pdf-file");
        System.out.println(" out-pdf-file アクションの種類");
        System.out.println("アクションの種類");
        System.out.println("0 : GOTOアクションの設定");
        System.out.println("1 : GOTORアクションの設定");
        System.out.println("2 : Launchアクションの設定");
        System.out.println("3 : URIアクションの設定");
    }

    public static void main(String[] args) {
        if (args.length < 3){
            printUsage();
            return;
        }


        // コマンドライン引数の取得
        int actionKind = Integer.parseInt(args[2]);
        if((actionKind < 0) || (3 < actionKind)) {
            System.out.print("アクションの種類 ");
            System.out.println("は0から3の範囲の整数値で指定してください。");
            printUsage();
            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);

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

                try (PtlPage page = pages.get(0)) {//1ページ目の取得
                    // リンク注釈追加
                    addAnnotLink(br, pages, page, actionKind);
                }
            }

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

    public static void addAnnotLink(BufferedReader br, PtlPages pages,
                                    PtlPage page, int actionKind)
        throws PtlException, Exception, Error {
        try (PtlAnnots annots = page.getAnnots(); //注釈コンテナの取得
             PtlAnnotLink annotlink = new PtlAnnotLink()) {//PDFのリンク注釈
            // 矩形座標を設定
            try (PtlRect rect = setRectCoordinate(br)) {
                annotlink.setRect(rect);
            }
            // 内容を設定
            annotlink.setTextContents("挿入されるリンク注釈");
            // アクションの設定
            setAction(pages, annotlink, actionKind);
            // 注釈の追加
            annots.append(annotlink);
        }
    }

    public static void setAction(PtlPages pages, PtlAnnotLink annotlink, int actionKind)
        throws PtlException, Exception, Error {
        switch (actionKind) {
        case 0:
            // GOTOアクションの設定
            try (PtlActionGoTo acttiongoto = new PtlActionGoTo();
                 PtlDestFit destfit = new PtlDestFit()) {//宛先
                // 宛先ページの設定(最終ページに)
                destfit.setPageNumber(pages.getCount() - 1);
                // 宛先の設定
                acttiongoto.setDest(destfit);
                // アクションの設定
                annotlink.setAction(acttiongoto);
            }
            break;
        case 1:
            // GOTORアクションの設定
            try (PtlActionGoToR actiongotor = new PtlActionGoToR();
                 PtlDestFit destfit = new PtlDestFit()) {//宛先
                // 宛先ページの設定(最終ページに)
                destfit.setPageNumber(pages.getCount() - 1);
                // 宛先の設定
                actiongotor.setDest(destfit);
                // ファイル間移動用PDFファイルを設定
                actiongotor.setFileName("test.pdf");
                // 新ウィンドウフラグを設定
                actiongotor.setNewWindowFlag(true);
                // アクションの設定
                annotlink.setAction(actiongotor);
            }
            break;
        case 2:
            // Launchアクションの設定
            try (PtlActionLaunch actionlaunch = new PtlActionLaunch()) {
                // 起動ファイル名を設定
                actionlaunch.setFileName("test.txt");
                // 新ウィンドウフラグを設定
                actionlaunch.setNewWindowFlag(true);
                // アクションの設定
                annotlink.setAction(actionlaunch);
            }
            break;
        case 3:
            // URIアクションの設定
            try (PtlActionURI actionurl = new PtlActionURI()) {
                // URIを設定
                actionurl.setURI("http://www.antenna.co.jp/");
                // アクションの設定
                annotlink.setAction(actionurl);
            }
            break;
        }
    }

    /**
     * 矩形の各値を入力してその座標値をもつ矩形を返す関数。
     * 原点はPDFの左下端。
     * bottomよりtopが大きい、leftよりもrightが大きいなどの矛盾した数値は入力できない。
     * 
     * @param br BufferedReader。数値の読み取りに使う。
     * @return 指定したleft, bottom, right, topの数値を持つPtlRect
     */
    public static PtlRect setRectCoordinate(BufferedReader br)
        throws IOException, PtlException, Exception, Error
    {
        float top, bottom, left, right;
        boolean isValueOkay = false;
        PtlRect outputRect = new PtlRect();
        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;
    }    

}

プログラムファイル名

AppendAnnotLink.java

入出力操作の例

C:\samples>java cookbook.AppendAnnotLink 
usage: java AppendAnnotLink in-pdf-file out-pdf-file アクションの種類
アクションの種類
0 : GOTOアクションの設定
1 : GOTORアクションの設定
2 : Launchアクションの設定
3 : URIアクションの設定

C:\samples>java cookbook.AppendAnnotLink blank.pdf blank-link-c.pdf 3  
配置矩形の各数値を入力してください。
top (mm) : 200
bottom (mm) : 150 
left (mm) : 40
right (mm) : 90
-- 完了 --

サンプルプログラムで埋め込んだリンク注釈の上のマウスポインタを置いて移動先URLを表示したところです。

リンク注釈の追加