10.3.1 日付の有効性をチェックして設定する

SetDocInfoWithValidationDate_Top

狙い・効果

PDFに日付日付を設定する際に設定可能な数値かを判定します。

処理の概要

PtlDateに日時を入力する際に、PtlDate自身が保持した値が設定可能な日時かどうかを判定することができます。

『PDF Tool API』を用いて作成日時などの日付を設定する際、1970/01/01 09:00:00(日本標準時間)より古い日付時刻や3001/01/19 16:59:59(日本標準時間)より新しい日付時刻は設定できません。設定不可能な値を無理に処理しようとすると、プログラムはエラーコード200[Invalid parameter value]の例外を起こして停止します。

PtlDateはisValid()関数を呼び出すことで、プログラムが停止する前に入力された値が設定可能な範囲に収まっているかを判定することができます。

サンプルプログラムでは、入力PDFのプロパティに作成日時を設定します。プロパティ設定の前に日付データが設定可能な日時を表しているかどうかを判定し、設定不可の場合は再入力を要求します。

『PDF Tool API』の主な機能

プログラム例

package cookbook;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import jp.co.antenna.ptl.*;
import java.time.LocalDateTime;
public class SetDocInfoWithValidationDate {
    // そのクラスのusageを表示する関数
    private static void printUsage() {
        System.out.println("usage: java SetDocInfo in-pdf-file out-pdf-file" +
                           " タイトル 作者 ");
     }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 4) {
            printUsage();
            return;
        }


        String title = args[2];
        String author = args[3];


        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の文書プロパティ
                 PtlDocInfo docinf = docProperty.getDocInfo();
                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                 PtlDate creationDate = new PtlDate()) {

                // タイトルを設定
                docinf.setTitle(title);
                // 著者を設定
                docinf.setAuthor(author);

                // 作成日付を設定
                System.out.println("作成日付を入力してください。");
                docinf.setCreationDate(setDate(br, creationDate));

                // 更新日付を設定(更新時の時間で作成)
                LocalDateTime timeNow = LocalDateTime.now();
                try (PtlDate dateModNew = new PtlDate(timeNow.getYear(),
                                                      timeNow.getMonthValue(),
                                                      timeNow.getDayOfMonth(),
                                                      timeNow.getHour(),
                                                      timeNow.getMinute(),
                                                      timeNow.getSecond())) {
                    docinf.setModDate(dateModNew);
                }
            }

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


    public static PtlDate setDate(BufferedReader br, PtlDate date)
        throws IOException, PtlException, Exception, Error {
            int year;
            int month;
            int day;
            int hour;
            int minute;
            int second;
            boolean isValueOkay = false;

            while(!isValueOkay) {
                System.out.print("year : ");
                year = Integer.parseInt(br.readLine());
                System.out.print("month : ");
                month = Integer.parseInt(br.readLine());
                System.out.print("day : ");
                day = Integer.parseInt(br.readLine());
                System.out.print("hour : ");
                hour = Integer.parseInt(br.readLine());
                System.out.print("minute : ");
                minute = Integer.parseInt(br.readLine());
                System.out.print("second : ");
                second = Integer.parseInt(br.readLine());

                date.setYear(year);
                date.setMonth(month);
                date.setDay(day);
                date.setHour(hour);
                date.setMin(minute);
                date.setSec(second);


                //PtlDateの数値が正しいかどうかを判定する。
                if(date.isValid()) {
                    isValueOkay = true;
                }else {
                    System.out.println("PtlDateとして保持できない数値が入力されています。");
                    System.out.println("もう一度入力して下さい。");
                }
            }

        return date;
    }
}

プログラムファイル名

SetDocInfoWithValidationDate.java

入出力操作の例

C:\samples>java cookbook.SetDocInfoWithValidationDate 
usage: java SetDocInfo in-pdf-file out-pdf-file タイトル 作者 

C:\samples>java cookbook.SetDocInfoWithValidationDate blank.pdf Output_SetDocInfoWithValidationDate.pdf 文書情報を設定したPDF PDFCookBookCreator 
作成日付を入力してください。
year : 3001
month : 1
day : 19
hour : 17
minute : 0
second : 0
PtlDateとして保持できない数値が入力されています。
もう一度入力して下さい。
year : 3001
month : 1
day : 19
hour : 16
minute : 59
second : 59
-- 完了 --

この操作例では作成日に有効な日付より先の日付時刻である「3001/01/19 17:00:00」を指定しようとして拒否され、有効な範囲で最も先の日付である「3001/01/19 16:59:59」を入力しています。(下図:出力PDFのプロパティ)

5-10-3-1_SetDocInfoWithValidationDate

図10.3 出力PDFのプロパティ。「3001/01/19 16:59:59」が作成日に設定されている