AdvanceSoftware Tech Blog

アドバンスソフトウェア株式会社の技術ブログ

AS-Report for Javaで出力PDFファイルに電子署名とタイムスタンプを付与する

AS-Report for Javaでは、出力するPDFファイルに電子署名、タイムスタンプを付与することが可能です。この記事では、当製品にて出力PDFファイルに電子署名、タイムスタンプを付与する方法について説明します。

環境

コンソールアプリの作成

まずはコンソールアプリを作ります。

Javaプロジェクトの作成

Eclipseを起動し、上部メニューの[ファイル] > [新規] > [Java プロジェクト]を選択すると[新規 Java プロジェクト]ウインドウが開きます。

開いたウインドウで以下の項目を編集し、[完了]ボタンをクリックします。
プロジェクト名:asrjsample
実行環境 JRE の使用:JavaSE-1.8

エントリーポイントの作成

上部メニューの[ファイル] > [新規] > [クラス]を選択すると[新規 Java クラス]ウインドウが開きます。

開いたウインドウで以下の項目を編集し、[完了]ボタンをクリックします。
名前:SignatureApp
どのメソッド・スタブを作成しますか?:public static void main(String[] args)のみチェックを入れる

SignatureApp.javaが作成されます。

AS-Report for Javaの使用準備

jarファイルの参照

以下のようにプロジェクトルートにlibフォルダを作成し、AS-Report for Javaのjarファイルを格納します。jarファイルは下記から取得してください。
"AS-Report for Javaインストール先フォルダ\AS-ReportJ\bin\asreport-1.0.X.jar"

なお、AS-Report for Javaで出力PDFファイルに電子署名、タイムスタンプを付与するには、「Bouncy Castle APIs」が必要となります。 こちらから以下のjarファイルをダウンロード頂き、AS-Report for Javaのjarファイルと併せて格納してください。

Bouncy Castleライブラリ
bcpkix-jdk18on-XXX.jar
bcprov-jdk18on-XXX.jar
bcutil-jdk18on-XXX.jar

また、一部制限はございますが、体験版をダウンロード頂くことで製品購入前でも同様のjarファイルをお使い頂けます。(※Bouncy Castle APIsは含まれておりません。)
AS-Report for Java 体験版はこちら

次に配置したjarファイルのクラスパスを通します。
プロジェクトを右クリック - [プロパティ] > [Java のビルド・パス]の項目を選択します。 [ライブラリー]タブを選択し、[JAR の追加]をクリックします。

[JAR の選択]でlibフォルダ内のjarファイルを選択し、右下の[OK]をクリックします。

プロパティウィンドウの右下の[適用して閉じる]をクリックして閉じます。

ここまでの作業でパッケージエクスプローラーの[参照ライブラリー]にjarファイルが表示されることを確認します。

電子署名、タイムスタンプの付与

出力PDFファイルに電子署名、タイムスタンプを付与する方法を説明します。
(※タイムスタンプ付与の際にはインターネットへの接続が必要となります。)

ローカル証明書(pfx)データで電子署名を付与する

コード例(java)

// 連絡先に"info@adv.co.jp"を設定します。
cellReport.getPdf().getSignature().setContact("info@adv.co.jp");
// 署名時刻に現在時刻を設定します。
cellReport.getPdf().getSignature().setDate(new Date());
// 場所に"日本"を設定します。
cellReport.getPdf().getSignature().setLocation("日本");
// 理由に"稟議"を設定します。
cellReport.getPdf().getSignature().setReason("稟議");
// ローカル証明書(pfx)データに"C:\Certificate.pfx"ファイルの内容を設定します。
byte[] certificateData = null;
try {
    FileInputStream fis = new FileInputStream("C:\\Certificate.pfx");
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    int status = 0;
    while ((status = fis.read()) != -1)
        bos.write(status);
    certificateData = bos.toByteArray();
    bos.close();
  fis.close();
} catch (Exception e) {
}
cellReport.getPdf().getSignature().setCertificateData(certificateData);
// ローカル証明書(pfx)データのパスワード"pass"を設定します。
cellReport.getPdf().getSignature().setCertificatePassword("pass");

電子署名にタイムスタンプを付与する

コード例(java)

// タイムスタンプサーバーのURL "https://freetsa.org/tsr"を設定します。
cellReport.getPdf().getSignature().setTimeStampUrl("https://freetsa.org/tsr");
// タイムスタンプサーバーの ユーザー名"user"を設定します。
cellReport.getPdf().getSignature().setTimeStampUser("user");
// タイムスタンプサーバーの パスワード"pass"を設定します。
cellReport.getPdf().getSignature().setTimeStampPassword("pass");

PDFファイルの出力

Signature.javaにコードを追記して、電子署名、タイムスタンプを付与したPDFファイルを出力します。

コード例(java)

jp.co.adv.asreport.CellReport cellReport = new jp.co.adv.asreport.CellReport();
cellReport.getReport().start();
cellReport.getReport().create(ExcelVersion.ver2024); 
cellReport.getPage().start("Sheet1", "1");
cellReport.getCell("A1").setValue("PDF ファイルの署名をご確認ください。");
cellReport.getPage().end();
cellReport.getPdf().getSignature().setContact("info@adv.co.jp");
cellReport.getPdf().getSignature().setDate(new Date());
cellReport.getPdf().getSignature().setLocation("日本");
cellReport.getPdf().getSignature().setReason("稟議");
byte[] certificateData = null;
try {
    FileInputStream fis = new FileInputStream("C:\\Certificate.pfx");
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    int status = 0;
    while ((status = fis.read()) != -1)
        bos.write(status);
    certificateData = bos.toByteArray();
    bos.close();
    fis.close();
} catch (Exception e) {
}
cellReport.getPdf().getSignature().setCertificateData(certificateData);
cellReport.getPdf().getSignature().setCertificatePassword("pass");

cellReport.getPdf().getSignature().setTimeStampUrl("https://freetsa.org/tsr");
cellReport.getPdf().getSignature().setTimeStampUser("user");
cellReport.getPdf().getSignature().setTimeStampPassword("pass");

cellReport.getReport().end(); 
// PDFファイルを出力します。
cellReport.getReport().savePdf("C:\\Out.pdf");

出力結果

最後に

AS-Report for Javaで出力PDFファイルに電子署名とタイムスタンプを付与する方法について解説してきました。
今回は以上です、ありがとうございました。
AS-Report for Java製品ページはこちら
AS-Report for Java体験版はこちら

© 2022 Advance Software Co., Ltd. All Rights Reserved.