2.1.1 本文テキストの追加

images/AddText-top.png

狙い・効果

PDF文書のページ上の指定位置にテキストを挿入します。

処理の概要

  1. 書き込み先のPDF文書とそのページ位置を指定します。
  2. PDFに記入(追記)したい文字列を指定します。
  3. 文字列の配置基準となる位置を配置矩形として指定します。
  4. 配置の基準位置を指定(配置指定)します。
表2・1 配置の基準位置
配置
説明
ALIGN_TOP_LEFT
左上
ALIGN_TOP
中央上
ALIGN_TOP_RIGHT
右上
ALIGN_LEFT
中央左
ALIGN_CENTER
中央
ALIGN_RIGHT
中央右
ALIGN_BOTTOM_LEFT
左下
ALIGN_BOTTOM
中央下
ALIGN_BOTTOM_RIGHT
右下

テキスト描画の配置矩形では、テキストを配置するときの基準となる位置を指定するだけです。文字列を配置矩形の内部に収めるという意味ではありません。例えば、文字列の長さが配置矩形の幅より大きい場合、描画された文字列は配置矩形をはみ出します。配置矩形の幅で縮小したり、配置矩形の幅で改行したりといった調整は行われません。

PDF Tool APIの主な機能

この例では主に次の機能を使っています。例えば、3ページ目に書きたいなら3ページを取得して、そのページのContentを取得します。

プログラム例

package cookbook;

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


public class  AddText{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 5)
        {
            System.out.println("usage: java AddText in-pdf-file out-pdf-file page-num text-to-add text-align");
            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];

        ...【RemovePages.javaと同じ処理のため省略
             ・doc.getPages()メソッドを用いてPtlPages pagesにページコンテナを取得
             ・ページコンテナが空だった場合にエラーを出力して終了】...


                try (PtlPage page = pages.get(pageToAdd - 1);// ページの取得(パラメータindexは0が先頭のため1を引く)
                     PtlContent content = page.getContent();// ページコンテントの取得
                     PtlRect outputRect = setOutputRect(br);// 出力矩形の設定(setOutputRectを用いて初期化)
                     PtlParamWriteString plainParam = new PtlParamWriteString()) // 文字描画のパラメータクラス。今回は何も設定しない。
                {
                    // 文字列出力
                    content.writeString(outputRect, PtlContent.ALIGN.valueOf(textAlign), textToAdd, plainParam);
                }
                catch (IllegalArgumentException ex){//PtlContent.ALIGNの指定が誤っていた場合のエラーメッセージ
                    System.out.println(ex.getMessage());
                    System.out.println("ERROR : alignにはPtlContent.ALIGNに含まれる名前を指定してください。");
                    ex.printStackTrace();
                }
            }


        ...【AppendPages.javaと同じ処理のため省略
             ・PtlParamOutputを用いてPtlPDFDocument docの内容を出力
             ・PtlException, Exception, Error を catchするエラー処理
             ・finally文で"--完了--"と表示する処理】...

    }

    public static PtlRect setOutputRect(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;
    }
}

サンプルファイル名

AddText.java

入出力操作の例

images/AddText.png

この入力例では、入力した文字列は表示矩形の左下隅を基準に、左下頂点(100mm, 40mm)、右上頂点(150mm, 60mm)の矩形の中心に揃えられます。

images/addtext-example.png

図2・1 テキスト追加の結果