PLOP / PLOP DS サンプル集(クックブック)
既存の PDF 文書にタイムスタンプ付き署名を付与する方法を示します。
通常の署名では、署名を行った PC の日時が署名日時として記録されますが、PC の日時は容易に変更が可能なため署名日時の証明にはなりません。時刻認証業務事業者が提供するタイムスタンプを署名に付与することで、デジタル ID による「誰が署名したか」「何に署名したか」に加え、タイムスタンプによる「いつ署名したか」を証明できるようになります。
このサンプルで使用した電子署名は信頼された認証局で発行されたものではないため、Adobe Acorbat 等で開くと「少なくとも 1 つの署名に問題があります。」と表示されますが、信頼された認証局で発行された電子署名を使うと「署名済みであり、すべての署名が有効です。」と表示されます。
このサンプルで使用したタイムスタンプ局は PDFlib 製品の検証に使用してもらうことを目的に弊社が公開しているもので、国税関係書類のような公的な書類には使用できません。詳細は 検証用タイムスタンプサーバーについて をご確認ください。
必要な製品:PDFlib PLOP DS
処理の流れ
①既存の PDF 文書を開く
open_document() 関数を使って、タイムスタンプ付き署名を付与したい既存の PDF ファイルを開きます。
②タイムスタンプ付き署名を作成する
prepare_signature() 関数で、オプションで指定したタイムスタンプ付き署名を作成します
③タイムスタンプ付き署名を PDF に付与して出力する
create_document() 関数で、② で作成したタイムスタンプ付き署名を ① で開いた PDF に付与し、PDF を出力します。
④PDF文書を閉じる
close_document() 関数で、PDF 文書を閉じれば、タイムスタンプ付き署名の付与は完了します。
ソースコードと出力結果
/*
* 既存 PDF にタイムスタンプ付き署名を付与:
* 既存の PDF 文書にタイムスタンプ付き署名を行うサンプルです。
*
* 必要な製品 : PDFlib PLOP DS 5
* 必要なデータ : demo_signer_rsa_2048.p12
* demo_signer_rsa_2048.p12 は data ディレクトリにあります。
* demo_signer_rsa_2048.p12 のパスワードは demo です。
* RFC3161 に対応したタイムスタンプサーバー
* このサンプルでは https://www.infotek.co.jp/tsa を使用します。
*/
import java.io.*;
import com.pdflib.plop;
import com.pdflib.PLOPException;
public class certtimestamp {
public static void main (String argv[]) {
plop plop = null;
/* 文書タイムスタンプのための署名オプション */
String sign_opts =
"engine=builtin " +
"digitalid={filename={demo_signer_rsa_2048.p12}} " +
"password={demo} " +
"timestamp={source={ " +
" url={https://www.infotek.co.jp/tsa} " +
" sslverifypeer=false " +
"}} ";
try {
/* 既存 PDF に関する変数を用意する */
String optlist;
String searchpath = "../data";
int doc;
/* 実行ファイルに渡す引数(取込む既存PDF名・出力するPDF名)のチェックを行う */
if (argv.length > 2) {
throw new Exception("usage: certtimestmap >filename> >outfilename>");
}
/* PLOP オブジェクトを作成する */
plop = new plop();
/* 読み込みたいファイルの入ったディレクトリを指定する */
optlist = "searchpath {" + searchpath + "} ";
plop.set_option(optlist);
/* ①既存の PDF 文書を開く */
if ((doc = plop.open_document(argv[0], "")) == -1) {
throw new Exception("Error: " + plop.get_apiname()
+ ": " + plop.get_errmsg());
}
/* ②タイムスタンプ付き署名を作成する */
if (plop.prepare_signature(sign_opts) == -1) {
throw new Exception("Error: " + plop.get_apiname() + ": " + plop.get_errmsg());
}
/* ③タイムスタンプ付き署名を PDF に付与して出力する */
if (plop.create_document(argv[1], "input=" + doc) == -1) {
throw new Exception("Error: " + plop.get_apiname() + ": " + plop.get_errmsg());
}
/* ④PDF文書を閉じる */
plop.close_document(doc, "");
} catch (PLOPException e) {
System.err.println("PLOP exception occurred in certtimestamp sample:");
System.err.println("[" + e.get_errnum() + "] " + e.get_apiname() + ": " + e.get_errmsg());
} catch (Exception e) {
System.err.println(e);
} finally {
/* PLOP オブジェクトを削除します */
if (plop != null) plop.delete();
}
}
}
(May 7, 2020 - Dec 27, 2024)