3.1.1 文字の描画(テキストボックス)

TBoxDrawTextBox_Top

狙い・効果

テキストボックスを用いてPDFにテキストを描画します。

処理の概要

テキストボックステキストボックスでテキストを描画することで、文字列は指定した範囲で自動的に折り返されPDFに挿入されます。

  1. PtlContent.drawTextBox()を実行してテキストボックスの矩形を指定し、PtlTextBoxを呼び出します。
  2. 呼び出されたPtlTextBoxにPtlTextBox.writeString()等を実行し、テキストボックスで描画する内容を記述します。
  3. PtlTextBox.terminate()の実行でテキストボックスを終了させ、描画内容を実際のページコンテントに書き出します。
注意

PtlTextBox.terminate()を実行しないとコンテントに書き出されないため、テキストボックスを呼び出した際は必ず呼ぶようにしてください。

サンプルプログラムでは、入力PDFに対して指定した矩形にテキストボックスを用いて文字を描画します。描画する文字は引数で指定し、矩形はプログラム実行中に指定します。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

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


public class  TBoxDrawTextBox{

    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.println("usage: java TBoxDrawTextBox in-pdf-file out-pdf-file"
                + " page-num text-to-add text-align");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 5) {
            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);

            // コマンドライン引数の読み取り・判定
            int pageToAdd = Integer.parseInt(args[2]);
            int numPages = doc.getPageCount();
            System.out.println("ページ数:" + numPages);
            if((numPages < 0)||(numPages < pageToAdd)) {
                System.err.println("テキスト挿入ページは全ページ数よりも小さい正の値を指定してください。");
                return;
            }

            String textToAdd = args[3];
            String textAlign = args[4];

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

                try (PtlPage page = pages.get(pageToAdd - 1);// ページの取得(0が先頭のため1を引く)
                     PtlContent content = page.getContent();// ページコンテントの取得
                     PtlRect outputRect = new PtlRect();// 出力矩形の初期化
                     PtlTextBox textBox = content.drawTextBox(setRectCoordinate(br,outputRect),
                                                        PtlContent.ALIGN.valueOf(textAlign), 210, 297);
                     // 文字描画のパラメータクラス。
                     PtlParamWriteStringTextBox plainParam = new PtlParamWriteStringTextBox()) {
                    textBox.writeString(textToAdd, plainParam);// 文字列出力
                    textBox.terminate();
                }
                catch (IllegalArgumentException ex) {//PtlContent.ALIGN指定のエラー処理
                    System.out.println(ex.getMessage());
                    System.out.println("ERROR : alignにはPtlContent.ALIGNに含まれる名前を指定してください。");
                    ex.printStackTrace();
                }
            }

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

    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;
    }
}

プログラムファイル名

TBoxDrawTextBox.java

入出力操作の例

C:\samples>java cookbook.TBoxDrawTextBox 
usage: java TBoxDrawTextBox in-pdf-file out-pdf-file page-num text-to-add text-align

C:\samples>java cookbook.TBoxDrawTextBox gray_landscape_A4blank.pdf Output_TBoxDrawTextBox.pdf 1 "これは、テキストボックスの入力文章です。このようにテキストボックスに入力された文章は折り返されます。" ALIGN_CENTER 
ページ数:1
指定する矩形の各数値を入力してください。
top (mm) : 120
bottom (mm) : 80
left (mm) : 50
right (mm) : 130
-- 完了 --

この操作例では、入力した文字列はPDF(横向きA4サイズ)の左下隅を基準に、左下頂点(50mm, 80mm)、右上頂点(130mm, 120mm)の矩形でテキストボックス(赤い点線)が挿入されます。

5-3-1-1_DrawTextBox

図3.1 左:ページ内に挿入されたテキストボックス(赤点線矩形)。右はテキストボックスの拡大図。文字列は右端で折り返されています。