1.1.2 カスタムスタンプ注釈作成(画像・PDF設定)

images/AppendAnnotStampCustom-top.png

狙い・効果

画像・PDFを読み込んでスタンプのカスタムアイコンとして指定し、カスタムスタンプ注釈を作成します。

処理の概要

指定したPDFファイルの任意のページまたは指定した画像をカスタムアイコンにしたラバースタンプ注釈の作成と挿入ができます。画像の挿入はPtlParamImagePageを用いて画像のPDF化をすることで実現しています。(詳細は「4. 画像のPDF化」を参照してください。)

本サンプルプログラムでは、画像もしくはPDFの1ページ目を用いて作成したアイコンのラバースタンプ注釈を入力PDFの1ページ目に挿入します。ラバースタンプ注釈の挿入位置はPDFの左から10mm、下から270mmの点を指定画像の左下隅として、元の画像サイズ・PDFページサイズは保持されます。

PDF Tool APIの主な機能

プログラム例

package cookbook;
import jp.co.antenna.ptl.*;

public class AppendAnnotStampCustom {
    // そのクラスのusageを表示する関数
    private static void printUsage(){
        System.out.println("usage: java AppendAnnotStampCustom in-pdf-file" +
                           " out-pdf-file スタンプ種類 custom-icon-file");
        System.out.println("スタンプ種類");
        System.out.println("0 : カスタム(PDF) 1 : カスタム(Image)");
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 4) {
            printUsage();
            return;
        }
        String stampKind = args[2];
        switch (stampKind) {
        case "0":
        case "1":
            break;
        default:
            return;
        }

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

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

                try (PtlPage page = pages.get(0);
                     PtlAnnots annots = page.getAnnots()) {
                    switch (stampKind) {
                    case "0":
                        // 読み込んだPDFを外観とするスタンプ
                        if (args.length < 4) {
                            System.out.println("スタンプ注釈に使うpdfを指定してください。");
                            printUsage();
                            return;
                        }
                        addCustomStampAnnotFromPdf(annots, args[3]);
                        break;
                    case "1":
                        // 読み込んだ画像を外観とするスタンプ
                        if (args.length < 4) {
                            System.out.println("スタンプ注釈に使う画像を指定してください。");
                            printUsage();
                            return;
                        }
                        addCustomStampAnnotFromImage(annots, args[3]);
                        break;
                    }
                }
            }
            // ファイルに保存します。
            doc.save(outputFile);
        }
	...【AppendAnnotStampDefault.javaと同じ処理のため省略
	  ・エラーメッセージ処理と出力】...
    }
    public static void addCustomStampAnnotFromPdf(PtlAnnots annots, String pathPdf)
        throws PtlException, Exception, Error {
        try (PtlAnnotStamp stampAnnot = new PtlAnnotStamp();
             PtlPDFDocument doc_custom = new PtlPDFDocument();
             PtlParamInput inputCustom = new PtlParamInput(pathPdf)) {    // PDFファイル
            stampAnnot.setIconType(PtlAnnotStamp.ICON_TYPE.ICON_CUSTOM);
            stampAnnot.setAnnotFlags(PtlAnnot.FLAG_PRINT);

            // スタンプにするPDFファイルをロードします。
            doc_custom.load(inputCustom);

            try (PtlPages pagesCustomStamp = doc_custom.getPages()) {
                // ページコンテナが空かどうか
                if (pagesCustomStamp.isEmpty()) {
                    System.out.println("ページコンテナが空\n");
                    return;
                }
                // 追加された画像ページを取得する
                try (PtlPage pageCustomStamp = pagesCustomStamp.get(0)) {
                    // 画像ページを注釈に追加する
                    stampAnnot.setPage(pageCustomStamp);

                    try (PtlSize size = pageCustomStamp.getSize();
                         PtlRect rect = new PtlRect(10.0f, 270.0f,
                                                    10.0f+size.getWidth(),
                                                    270.0f+size.getHeight())) {
                        stampAnnot.setRect(rect);
                    }
                }
            }
            stampAnnot.setIconName("MyIcon");
            annots.append(stampAnnot);
        }
    }
    public static void addCustomStampAnnotFromImage(PtlAnnots annots, String pathImage)
        throws PtlException, Exception, Error {
        try (PtlAnnotStamp stampAnnot = new PtlAnnotStamp()) {

            stampAnnot.setIconType(PtlAnnotStamp.ICON_TYPE.ICON_CUSTOM);
            stampAnnot.setAnnotFlags(PtlAnnot.FLAG_PRINT);
            // 画像描画パラメータ
            // 画像ファイル
            // 画像ページパラメータ の順に取得する
            try (PtlParamDrawImage paramDrawImage = new PtlParamDrawImage();
                 PtlParamInput inputCustom = new PtlParamInput(pathImage);     
                 PtlParamImagePage paramImagePage = new PtlParamImagePage()) {
                // 画像描画パラメータに画像ファイルを設定
                paramDrawImage.setImageStream(inputCustom);

                // 画像ページパラメータに画像描画パラメータを設定
                paramImagePage.setImage(paramDrawImage);

                // 画像ページのサイズを画像サイズにあわせる
                paramImagePage.setPaperType(PtlParamImagePage.PAPER_TYPE.PAPER_IMAGE_SIZE);

                // 画像ページパラメータから作成したページ
                try (PtlPage pageCustomStamp = new PtlPage(paramImagePage)) {
                    // 画像ページを注釈に追加する
                    stampAnnot.setPage(pageCustomStamp);

                    try (PtlSize size = pageCustomStamp.getSize();
                         PtlRect rect = new PtlRect(10.0f, 270.0f,
                                                    10.0f+size.getWidth(),
                                                    270.0f+size.getHeight())) {
                        stampAnnot.setRect(rect);
                    }
                }
            }
            stampAnnot.setIconName("MyIcon");
            annots.append(stampAnnot);
        }
    }
}

プログラムファイル名

AppendAnnotStampCustom.java

入出力操作の例

C:\samples>java cookbook.AppendAnnotStampCustom 
usage: java AppendAnnotStampCustom in-pdf-file out-pdf-file スタンプ種類 custom-icon-file
スタンプ種類
0 : カスタム(PDF) 1 : カスタム(Image)

C:\samples>java cookbook.AppendAnnotStampCustom blank.pdf blank-custom.pdf 1 custom-stamp.png 
-- 完了 --

次図はPDFに貼り付けたカスタムスタンプ注釈をダブルクリックしてポップアップ注釈を表示したところです。

カスタムスタンプ注釈作成 (画像・PDF設定)